我有三个带有“ userName”字段的文档:
当我搜索 ‘brian’时,我将所有三个都按预期返回,但是当我搜索“布莱恩迪利”时,我仍然将所有三个都恢复了。分析API告诉我它在搜索字符串上使用了ngram过滤器,但我不确定为什么。这是我的设置:
index settings:
{ "analysis": { "analyzer": { "username_index": { "tokenizer": "keyword", "filter": ["lowercase", "username_ngram"] }, "username_search": { "tokenizer": "keyword", "filter": ["lowercase"] } }, "filter": { "username_ngram": { "type": "edgeNGram", "side" : "front", "min_gram": 1, "max_gram": 15 } } } }
mapping:
{ "user_follow": { "properties": { "targetId": { "type": "string", "store": true }, "followerId": { "type": "string", "store": true }, "dateUpdated": { "type": "date", "store": true }, "userName": { "type": "multi_field", "fields": { "userName": { "type": "string", "index": "not_analyzed" }, "autocomplete": { "type": "string", "index_analyzer": "username_index", "search_analyzer": "username_search" } } } } } }
search:
{ "from" : 0, "size" : 50, "query" : { "bool" : { "must" : [ { "field" : { "targetId" : "51888c1b04a6a214e26a4009" } }, { "match" : { "userName.autocomplete" : { "query" : "brian", "type" : "boolean" } } } ] } }, "fields" : "followerId" }
我尝试过matchQuery,matchPhraseQuery,textQuery和termQuery(java DSL api),每次都得到相同的结果。
我认为您没有完全按照自己的想法做。这就是为什么用完整的curl语句来呈现实际的测试用例而不是简化它的原因。
curl
上面的示例对我有用(稍作修改):
使用设置和映射创建索引:
curl -XPUT 'http://127.0.0.1:9200/test/?pretty=1' -d ' { "mappings" : { "test" : { "properties" : { "userName" : { "fields" : { "autocomplete" : { "search_analyzer" : "username_search", "index_analyzer" : "username_index", "type" : "string" }, "userName" : { "index" : "not_analyzed", "type" : "string" } }, "type" : "multi_field" } } } }, "settings" : { "analysis" : { "filter" : { "username_ngram" : { "max_gram" : 15, "min_gram" : 1, "type" : "edge_ngram" } }, "analyzer" : { "username_index" : { "filter" : [ "lowercase", "username_ngram" ], "tokenizer" : "keyword" }, "username_search" : { "filter" : [ "lowercase" ], "tokenizer" : "keyword" } } } } } '
索引一些数据:
curl -XPOST 'http://127.0.0.1:9200/test/test?pretty=1' -d '{ "userName" : "briangriffen" } ' curl -XPOST 'http://127.0.0.1:9200/test/test?pretty=1' -d ' { "userName" : "brianlilley" } ' curl -XPOST 'http://127.0.0.1:9200/test/test?pretty=1' -d ' { "userName" : "briangumble" } '
搜索将brian查找所有文档:
brian
curl -XGET 'http://127.0.0.1:9200/test/test/_search?pretty=1' -d '{ "query" : { "match" : { "userName.autocomplete" : "brian" } } } ' # { # "hits" : { # "hits" : [ # { # "_source" : { # "userName" : "briangriffen" # }, # "_score" : 0.1486337, # "_index" : "test", # "_id" : "AWzezvEFRIykOAr75QbtcQ", # "_type" : "test" # }, # { # "_source" : { # "userName" : "briangumble" # }, # "_score" : 0.1486337, # "_index" : "test", # "_id" : "qIABuMOiTyuxLOiFOzcURg", # "_type" : "test" # }, # { # "_source" : { # "userName" : "brianlilley" # }, # "_score" : 0.076713204, # "_index" : "test", # "_id" : "fGgTITKvR6GJXI_cqA4Vzg", # "_type" : "test" # } # ], # "max_score" : 0.1486337, # "total" : 3 # }, # "timed_out" : false, # "_shards" : { # "failed" : 0, # "successful" : 5, # "total" : 5 # }, # "took" : 8 # }
搜索brianlilley仅找到该文档:
brianlilley
curl -XGET 'http://127.0.0.1:9200/test/test/_search?pretty=1' -d ' { "query" : { "match" : { "userName.autocomplete" : "brianlilley" } } } ' # { # "hits" : { # "hits" : [ # { # "_source" : { # "userName" : "brianlilley" # }, # "_score" : 0.076713204, # "_index" : "test", # "_id" : "fGgTITKvR6GJXI_cqA4Vzg", # "_type" : "test" # } # ], # "max_score" : 0.076713204, # "total" : 1 # }, # "timed_out" : false, # "_shards" : { # "failed" : 0, # "successful" : 5, # "total" : 5 # }, # "took" : 4 # }