弹性搜索:“fuzzy_like_this_field”过滤查询不起作用

时间:2015-12-16 09:05:09

标签: java elasticsearch full-text-search spring-data-elasticsearch

我在弹性搜索过滤器中面临以下问题:

当我尝试在字符串值上应用“fuzzy_like_this_field”时,它工作正常。

但是当我对String以外的不同数据类型(例如double,Date)应用“fuzzy_like_this_field”过滤器时,它不起作用。

它给出了

  

ElasticsearchIllegalArgumentException [fuzzy_like_this_field不支持二进制/数字字段。

请参阅以下弹性搜索查询

{"query": {"bool": {"must": [{"fuzzy_like_this_field": {"Receipts.retailerId": {"like_text": "55f5878916c042cc8731a39e4e05b7a0","fuzziness":0.3}}},{"fuzzy_like_this_field": {"Receipts.totalCost": {"like_text": "10","fuzziness":0.3}}}],"must_not": [],"should": []}},"from": 0,"size": 1000,"sort": [],"facets": {}}

其中retailerId - String和totalCost - double

如果我将totalCost数据类型double更改为string,那么它可以正常工作。

那么请建议任何解决方案?

1 个答案:

答案 0 :(得分:1)

模糊查询扩展文本搜索结果,以包含查询字词中某个Levenshtein Distance的字词。它们将数值扩展为边距 -fuzziness< = value< = + fuzzyiness (需要更改或转置以匹配的字符数) - 但是,fuzzy_like_this和{{ 1}}似乎只支持字符串匹配(通过Levenshtein距离)。

ES 1.6+中不推荐使用

fuzzy_like_this_fieldfuzzy_like_this个查询。他们都遇到了性能问题。你应该找到另一种方法来实现你的目标。

有很多方法可以应用模糊匹配,但我不确定模糊匹配是你所追求的。

指定:

fuzzy_like_this_field

您要求将与"fuzzy_like_this_field":{ "Receipts.retailerId":{ "like_text":"55f5878916c042cc8731a39e4e05b7a0", "fuzziness":0.3 } } 匹配的所有retailerId与最多22次修改匹配。 like_text

因此,在这种情况下,Edit distance = length(term) * (1.0 - fuzziness) = 32 * 0.7 = 22.4符合55ddddddd6c0ddddddd1a3dddddddda0的模糊匹配,因为其中10个字符共享相同的位置。

相反,如果您只是在寻找重复的交易,为什么不简单地使用匹配查询或过滤器来完全匹配您的55f5878916c042cc8731a39e4e05b7a0retailerId

totalCost