2015-12-18 4 views
0

У меня проблема с запросом, где, если «ford» находится в базе данных, и я ищу «forddddddd», он возвращает совпадение. У меня есть ngrams для вспомогательного частичного сопоставления для запросов типа fo, for, ford, но forddddd не должно совпадать. В чем может быть проблема? Ниже приведены настройки, сопоставления и запрос.ElasticSearch Issue with Matching Results

Настройки:

settings: { 
    number_of_shards: 1, 
    analysis: { 
     filter: { 
     ngram_filter: { 
      type: 'edge_ngram', 
      min_gram: 2, 
      max_gram: 15 
     } 
     }, 
     analyzer: { 
     ngram_analyzer: { 
      type: 'custom', 
      tokenizer: 'standard', 
      filter: [ 
      'lowercase', 
      'ngram_filter' 
      ] 
     } 
     } 
    } 
    } 

Отображения:

mappings: [ 
    { 
     name: 'car', 
     _all: { 
     type: 'string', 
     analyzer: 'ngram_analyzer' 
     }, 
     properties: { 
     description: { 
      properties: { 
      name: { 
       type: 'string', 
       include_in_all: true, 
       term_vector: 'yes', 
       analyzer: 'ngram_analyzer' 
      }, 
      model: { 
       type: 'string', 
       include_in_all: true, 
       term_vector: 'yes', 
       analyzer: 'ngram_analyzer' 
      } 
      } 
     }   
     } 
    } 
    ] 

Запрос:

GET car/_search 
{ 
    "query": { 
     "match": { 
      "_all": { 
       "query": "Forddddddd" 
      } 
     } 
    } 
} 

ответ

1

Проблема здесь вы используете один и тот же analyzer для indexing и searching.

при поиске Forddddd, ngram_analyzer применяется и генерирует лексемы Ф.О., ибо, брод и, следовательно, дают результаты, вы должны указать standard analyzer для поиска и вы получите желаемый результат.

properties: { 
    name: { 
     type: 'string', 
     include_in_all: true, 
     term_vector: 'yes', 
     analyzer: 'ngram_analyzer', 
     search_analyzer: 'standard' <--- here 
    }, 
    model: { 
     type: 'string', 
     include_in_all: true, 
     term_vector: 'yes', 
     analyzer: 'ngram_analyzer', 
     search_analyzer: 'standard' <--- here 
    } 
} 
+0

Это работает! Спасибо :) – emarel

+0

рад, что я мог бы помочь! – ChintanShah25