2016-09-05 4 views
0

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

Это мои текущие настройки индекса:

{ 
    "users": { 
     "settings": { 
     "index": { 
      "analysis": { 
       "filter": { 
        "shingle_filter": { 
        "max_shingle_size": "2", 
        "min_shingle_size": "2", 
        "output_unigrams": "true", 
        "type": "shingle" 
        }, 
        "edgeNGram_filter": { 
        "type": "edgeNGram", 
        "min_gram": "1", 
        "max_gram": "20" 
        } 
       }, 
       "analyzer": { 
        "autocomplete_query_analyzer": { 
        "filter": [ 
         "standard", 
         "asciifolding", 
         "lowercase" 
        ], 
        "tokenizer": "standard" 
        }, 
        "autocomplete_index_analyzer": { 
        "filter": [ 
         "standard", 
         "asciifolding", 
         "lowercase", 
         "shingle_filter", 
         "edgeNGram_filter" 
        ], 
        "tokenizer": "standard" 
        } 
       } 
      }, 
      "number_of_shards": "1", 
      "number_of_replicas": "1" 
     } 
     } 
    } 
} 

и мое отображение:

{ 
    "users": { 
     "mappings": { 
     "data": { 
      "properties": { 
       "name": { 
        "type": "string", 
        "analyzer": "autocomplete_index_analyzer", 
        "search_analyzer": "autocomplete_query_analyzer" 
       } 
      } 
     } 
     } 
    } 
} 

Сейчас моя проблема заключается в том, что поисковые запросы не возвращают результаты, которые содержат термин. Например, если у меня есть пользователь «Давид», поисковые запросы «Да», «Дав», «Дави» и т. Д. Вернут значение, но поиск «vid» или «avid» не вернет никаких значений.

Это из-за какого-то значения, которое мне не хватает в настройках?

ответ

2

Вам необходимо использовать nGram вместо edgeNGram. Так просто изменить

   "edgeNGram_filter": { 
       "type": "edgeNGram", 
       "min_gram": "1", 
       "max_gram": "20" 
       } 

в этот

   "edgeNGram_filter": { 
       "type": "nGram",    <--- change here 
       "min_gram": "1", 
       "max_gram": "20" 
       } 

Обратите внимание, что вам нужно, чтобы стереть ваш индекс, воссоздать его и снова заполнить его.