2015-10-19 131 views
0

我的意图是搜索一个针对多个字段的短语。弹性搜索 - 多重匹配 - 词组搜索

{ 
    "multi_match" : { 
    "query" : "king of baro", 
    "fields" : [ "filed1", "filed2", "filed3","filed5^9","filed6",filed7^9"], 
    "type" : "phrase_prefix", 
    "boost" : 10.0, 
    "tie_breaker" : 0.0 
    } 
} 

上述查询返回“baroda之王”,它按预期工作。

但是,当我搜索“酒吧之王”时,它不会返回任何东西。

{ 
     "multi_match" : { 
     "query" : "king of bar", 
     "fields" : [ "filed1", "filed2", "filed3","filed5^9","filed6",filed7^9"], 
     "type" : "phrase_prefix", 
     "boost" : 10.0, 
     "tie_breaker" : 0.0 
     } 
    } 

总结,

Search for "king of bar" - No result 
Search for "king of baro" - returns "king of baroda" 
Search for "king of baroda" - returns "king of baroda" 

有我丢失任何配置?

映射文件: -

http://localhost:9200/sec/_mapping/

{ 
    "sec":{ 
     "mappings":{ 
     "sec":{ 
      "properties":{ 
       "filed1":{ 
        "type":"string" 
       }, 
       "filed2":{ 
        "type":"string" 
       }, 
       "filed3":{ 
        "type":"string" 
       }, 
       "filed4":{ 
        "type":"string" 
       }, 
       "filed5":{ 
        "type":"string" 
       }, 
       "filed6":{ 
        "type":"string" 
       }, 
       "filed7":{ 
        "type":"string" 
       } 
      } 
     } 
     } 
    } 
} 

分析,从elasticsearch.yml

index: 
    analysis: 
    analyzer: 

     security_edge_ngram_analyzer: 
      alias: [security_edge_ngram_analyzer] 
      tokenizer: security_edge_ngram_tokenizer 

    tokenizer: 
     security_edge_ngram_tokenizer: 
     type: edgeNGram 
+0

你能张贴您的映射?你在这些领域使用什么分析仪? –

+0

已添加详细信息。 – user1578872

回答

2

我的猜测是,你有你的配置edge ngram tokenizermin_gram设置为4,虽然它是很难说没有看到配置。

这里是我如何在this blog post建立一个边缘NGRAM分析仪在每场基础Qbox一个例子:

PUT /test_index 
{ 
    "settings": { 
     "analysis": { 
     "filter": { 
      "edge_ngram_filter": { 
       "type": "edge_ngram", 
       "min_gram": 2, 
       "max_gram": 20 
      } 
     }, 
     "analyzer": { 
      "edge_ngram_analyzer": { 
       "type": "custom", 
       "tokenizer": "standard", 
       "filter": [ 
        "lowercase", 
        "edge_ngram_filter" 
       ] 
      } 
     } 
     } 
    }, 
    "mappings": { 
     "doc": { 
     "properties": { 
      "text_field": { 
       "type": "string", 
       "index_analyzer": "edge_ngram_analyzer", 
       "search_analyzer": "standard" 
      } 
     } 
     } 
    } 
} 
+0

有没有办法检查配置的分析仪?我们使用http:// localhost:9200/security/_mapping /来进行映射。有没有类似这样的方法? – user1578872

1

首先,我会仔细检查我的自定义分析仪工作正常。他们的方式我这样做是使用fielddata_fields

GET sec/sec/_search 
{ 
    "fielddata_fields": ["filed1","field2","filed3","field4","filed5","field6","filed7"] 
} 

一个适当的edgeNGram设置会导致这样的输出:

 "fields": { 
      "filed1": [ 
       "ki", 
       "kin", 
       "king", 
       "king ", 
       "king o", 
       "king of", 
       "king of ", 
       "king of b", 
       "king of ba", 
       "king of bar", 
       "king of baro", 
       "king of barod", 
       "king of baroda" 
      ] 
     } 

如果你没有看到类似的东西,然后我会看看如何设置分析仪以及其配置是否正常。作为该检查的第二个办法,我想创建一个简单的测试指标,其中,同样如上我会直接设置自定义分析仪在现场和测试:

PUT /sec 
{ 
    "mappings": { 
    "sec": { 
     "properties": { 
     "filed1": { 
      "type": "string", 
      "analyzer": "security_edge_ngram_analyzer" 
     } 
     } 
    } 
    }, 
    "settings": { 
    "analysis": { 
     "analyzer": { 
     "security_edge_ngram_analyzer": { 
      "tokenizer": "security_edge_ngram_tokenizer" 
     } 
     }, 
     "tokenizer": { 
     "security_edge_ngram_tokenizer": { 
      "type": "edgeNGram", 
      "min_gram": 2, 
      "max_gram": 20 
     } 
     } 
    } 
    } 
}