【问题标题】:Elastic Search : "fuzzy_like_this_field" filter query is not working弹性搜索:“fuzzy_like_this_field”过滤器查询不起作用
【发布时间】:2015-12-16 09:05:08
【问题描述】:

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

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

但是当我对字符串以外的其他数据类型(例如双精度、日期)应用“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 更改为字符串,那么它可以工作。

所以请提出任何解决方案?

【问题讨论】:

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


    【解决方案1】:

    模糊查询扩展文本搜索结果以包含来自查询词的某个 Levenshtein Distance 的词。它们将数值扩展了一个边距-fuzziness (需要更改或转置以匹配的字符数) - 但是,fuzzy_like_thisfuzzy_like_this_field 似乎只支持字符串匹配(通过 Levenshtein 距离)。


    fuzzy_like_thisfuzzy_like_this_field 查询在 ES 1.6+ 中已弃用。他们都遇到了性能问题。你应该找到另一种方法来实现你的目标。

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

    通过指定:

    "fuzzy_like_this_field":{  
                      "Receipts.retailerId":{  
                         "like_text":"55f5878916c042cc8731a39e4e05b7a0",
                         "fuzziness":0.3
                      }
                   }
    

    您要求匹配与 like_text 匹配的所有 retailerIds,最多可进行 22 次编辑。 Edit distance = length(term) * (1.0 - fuzziness) = 32 * 0.7 = 22.4

    因此在这种情况下,55ddddddd6c0ddddddd1a3dddddddda0 将被视为与 55f5878916c042cc8731a39e4e05b7a0 的模糊匹配,因为其中 10 个字符共享相同的位置。


    如果您只是在寻找重复的交易,为什么不简单地使用匹配查询或过滤器来准确匹配您的retailerIdtotalCost

    "query":{  
          "bool":{  
             "must":[  
                {  
                   "match":{  
                      "Receipts.retailerId": "55f5878916c042cc8731a39e4e05b7a0" 
                   }
                },
                {  
                   "match":{  
                      "Receipts.totalCost": 10
                   }
                }
             ]
          }
       }
    

    【讨论】:

    • 谢谢彼得......但我想完全匹配......不是范围......所以你能建议是否有其他选择
    • 模糊用于紧密匹配,但不一定完全匹配。你能更具体地介绍一下你的用例吗?
    • 彼得,实际上我想过滤所有总成本为 X 金额且我的 totalCost 变量为双精度类型的消费者收据,那么我该如何过滤这些收据,因为 blur_like_this_field 查询仅适用于字符串数据
    猜你喜欢
    • 2019-12-17
    • 2020-07-25
    • 2020-08-17
    • 1970-01-01
    • 1970-01-01
    • 2015-01-25
    • 2020-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多