Поведение функции автозаполнения поиска веб-сайта ElasticSearch

Im пытается воспроизвести точное поведение функции поиска на веб-сайте ElasticSearch.

Кто-нибудь знает, где я могу найти источник отображений/настроек? И как выполняется запрос?

Основные Требования:

  • Все запросы должны быть нечувствительны к регистру (позволяет использовать» нижний регистр » TokenFilter).
  • Соответствующий поисковый запрос должен быть выделен (проверьте полужирные части на выходных данных ниже).
  • Порядок результатов имеет значение, в основном «фразы» с меньшим количеством символов, которые соответствуют поисковому запросу, должны быть возвращены в первую очередь, чтобы вернуть точные(или близкие) совпадения в первую очередь.

Сценарий

Представьте, что у меня есть следующий набор данных:

ID, NAME
1,  SoftwareRocks everytime 
10, The is nothing like home
8,  Opacc Software AG is good but software is even better 
2,  Opacc Software AG 
3,  Sage KHK Software AG 
4,  Software AG 
5,  bbv Software Services AG 
6,  Software AG2 
7,  Sof on the world

Тест 1

Вход: sof

Выход:

  • 4, Software AG
  • 6, Software AG2
  • 7, Sof на мире
  • 2, Opacc Software AG
  • 3, Sage KHK Software AG
  • 1, SOF twareRocks everytime
  • 5, bbv Software Services AG
  • 8, Opacc Sof tware AG хорошо но SOF tware даже лучше

Тест 2

Вход: soft

Выход:

  • 4, Software AG
  • 6, Software AG2
  • 2, Opacc Software AG
  • 3, Sage KHK Software AG
  • 1, мягкие wareRocks everytime
  • 5, bbv Software Services AG
  • 8, Opacc Sof tware AG хорошо но мягкие изделия даже лучше

Тест 3

Вход: программное обеспечение

Выход:

  • 4, програмное обеспечение AG
  • 6, програмное обеспечение AG2
  • 2, Opacc Software AG
  • 3, Sage KHK Software AG
  • 1, утесы програмного обеспечения everytime
  • 5, BBV Software Services AG
  • 8, программное обеспечение АГ Опакк хорошо но программное обеспечение даже лучше

Тест 4

Вход: software ag

Выход:

  • 4, програмное обеспечение AG
  • 6, програмное обеспечение AG 2
  • 2, Opacc Software AG
  • 3, Sage KHK Software AG
  • 8, программное обеспечение АГ Опакк хорошо но программное обеспечение даже лучше

Попробуйте 1

PUT /my_index
    {
        "settings": { 
            "analysis": {
                "filter": {
                    "autocomplete_filter": { 
                        "type":     "edge_ngram",
                        "min_gram": 1,
                        "max_gram": 20
                    }
                },
                "analyzer": {
                    "autocomplete": {
                        "type":      "custom",
                        "tokenizer": "standard",
                        "filter": [
                            "lowercase",
                            "autocomplete_filter" 
                        ]
                    }
                }
            }
        }
    }

PUT /my_index/_mapping/my_type
    {
    "type": {
        "properties": {
            "name": {
                "type":            "string",
                "analyzer":  "autocomplete", 
                "search_analyzer": "standard" 
            }
        }
    }

GET /my_index/my_type/_search
{
    "query": {
        "match": {
            "name": "software"
        }
    }
}

Попробуйте 2

{"query" : {"match_phrase_prefix": { "name": "Software ag" }}}

Это возвращается правильно, но выделение кажется выключенным. Например:

  • 4, програмное обеспечение AG
  • 6, програмное обеспечение AG2
  • 2, Opacc Software AG
  • 3, Sage KHK Software AG
  • 8, программное обеспечение АГ Опакк хорошо но программное обеспечение даже лучше

Я ожидаю, что поисковый термин будет высокоразвитым. И порядок возвращаемых элементов должен быть основан на длине полного срока.

2 ответа

  1. Попробуйте выполнить этот запрос. Это приведет к результатам поиска hightlight.

    {
        'query':{
            'filtered':{
                'query':{
                    'match':{
                        '_all':{
                            'query':"soft",
                            'type':'phrase'
                            }
                        }
                    }
                }
            },
        'highlight':{
            'pre_tags':'<em>',
            'post_tags':'</em>',
            'fields':{'*':{}}
        }
    }
    
  2. хорошо, ваш случай использования довольно прост. Автозаполнение на веб-сайте elastic также является прямым случаем автозаполнения, но у них есть набор данных поиска, структурированный по нескольким полям, а также совпадающее ключевое слово из поля также определяет релевантность/порядок для результата поиска.

    Для вас, чтобы держать вещи простыми, я бы пошел с Ngram tokenizer для строки в отображениях и сделать простой отфильтрованный поиск
    Отображения

    {
        "analysis": {
            "analyzer": {           
                "autocomplete_analyzer": {
                    "type": "custom",
                    "tokenizer": "standard",
                    "filter": ["standard", "lowercase", "asciifolding", "filter_ngram"]
                }
            },
            "filter": {
                "filter_stop": {
                    "type": "stop",
                    "stopwords": "_english_",
                    "ignore_case": true
                },
                "filter_shingle": {
                    "type": "shingle",
                    "max_shingle_size": 2,
                    "min_shingle_size": 2,
                    "output_unigrams": true
                },
                "filter_snowball": {
                    "type": "snowball",
                    "language": "english"
                },
                "filter_stemmer": {
                    "type": "porter_stem",
                    "language": "English"
                },
                "filter_ngram": {
                    "type": "nGram",
                    "min_gram": 3,
                    "max_gram": 15
                },
                "filter_edgengram": {
                    "type": "edgeNGram",
                    "min_gram": 2,
                    "max_gram": 15
                },
                "filter_worddelimiter": {
                    "type": "word_delimiter"
                }
            },
            "tokenizer": {
                "haystack_ngram_tokenizer": {
                    "type": "nGram",
                    "min_gram": 3,
                    "max_gram": 15
                },
                "haystack_edgengram_tokenizer": {
                    "type": "edgeNGram",
                    "min_gram": 2,
                    "max_gram": 15,
                    "side": "front"
                }
            }
        }
    }
    

    Эти сопоставления также включают некоторые расширенные фильтры, которые я использовал в своих решениях autcomplete.

    {
        "query": {
            "filtered": {
                "filter": {
                    "term": {
                        "FIELD": "VALUE"
                    }
                }
            }
    
        }
    }
    

    Пример на elastic не делает проверку орфографии / нечеткий запрос для введенного ключевого слова.

    Если вы хотите добавить fuzzy также, то вы также посмотрите на вышеуказанную документацию, чтобы построить нечеткий запрос в соответствии с вашим использованием и настроить нечеткость.