2015-12-18 48 views
0

我有一个问题,如果'ford'在数据库中,我搜索'forddddddd'它返回一个匹配。对于'fo'这样的查询,我有ngrams的子部分匹配,for',ford'但'forddddd'不应该匹配。可能是什么问题?以下是我的设置,映射和查询。ElasticSearch问题与匹配结果

设置:

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

这里的问题是您使用的是相同的analyzerindexingsearching

当你搜索 Forddddd

ngram_analyzer应用和它所产生的令牌FO,为福特因此它给你的结果,你应该搜索指定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