首先,我在Play中重新创建了您当前的配置:https
:
//www.found.no/play/gist/867785a709b4869c5543
如果您去那里,请切换到“分析”选项卡以查看文本的转换方式:
请注意,例如,
Heaney最终
[hn, heanei]以
search_analyzer和和
[HN,heanei]一起被标记化
index_analyzer。请注意变音素词的大小写差异。因此,那是不匹配的。
该
fuzzy-query没有做查询时间文本分析。因此,您最终将
Heavey与进行比较
heanei。其Damerau-
Levenshtein距离比您的参数所允许的长。
您真正想做的是使用的模糊功能
match。Match 确实 会查询时间文本分析,并且具有 模糊 参数。
至于
fuzziness,这在Lucene
4中有所改变。以前,通常将其指定为float。现在应将其指定为允许的距离。有一个出色的拉取请求来澄清:https
:
//github.com/elasticsearch/elasticsearch/pull/4332/files
之所以要招募没有名字的人,
Michael是因为您正在做一个
bool.should。这具有或语义。一场比赛就足够了,但是从得分上来说,比赛越多越好。
最后,将所有过滤合并到同一术语中不一定是最好的方法。例如,您无法知道和增强准确的拼写。您应该考虑使用multi_field以多种方式处理该字段。
这是一个示例,您可以使用,使用curl命令在下面重新创建它。但是,我完全跳过使用“
porter”词干分析器。我保留它只是为了显示multi_field的工作方式。结合使用匹配,模糊性匹配和语音匹配可以使您走得更远。(请确保在进行语音匹配时不允许模糊不清-
否则您将获得无用的模糊匹配。:-)
#!/bin/bashexport ELASTICSEARCH_ENDPOINT="http://localhost:9200"# Create indexescurl -XPUT "$ELASTICSEARCH_ENDPOINT/play" -d '{ "settings": { "analysis": { "text": [ "Michael", "Heaney", "Heavey" ], "analyzer": { "metaphone": { "type": "custom", "tokenizer": "standard", "filter": [ "my_metaphone" ] }, "porter": { "type": "custom", "tokenizer": "standard", "filter": [ "lowercase", "porter_stem" ] } }, "filter": { "my_metaphone": { "enprer": "metaphone", "replace": false, "type": "phonetic" } } } }, "mappings": { "jr": { "properties": { "pty_surename": { "type": "multi_field", "fields": { "pty_surename": { "type": "string", "analyzer": "simple" }, "metaphone": { "type": "string", "analyzer": "metaphone" }, "porter": { "type": "string", "analyzer": "porter" } } } } } }}'# Index documentscurl -XPOST "$ELASTICSEARCH_ENDPOINT/_bulk?refresh=true" -d '{"index":{"_index":"play","_type":"jr"}}{"pty_surname":"Heaney"}{"index":{"_index":"play","_type":"jr"}}{"pty_surname":"Heavey"}'# Do searchescurl -XPOST "$ELASTICSEARCH_ENDPOINT/_search?pretty" -d '{ "query": { "bool": { "should": [ { "bool": { "should": [ { "match": { "pty_surname": { "query": "heavey" } } }, { "match": { "pty_surname": { "query": "heavey", "fuzziness": 1 } } }, { "match": { "pty_surename.metaphone": { "query": "heavey" } } }, { "match": { "pty_surename.porter": { "query": "heavey" } } } ] } } ] } }}'


