【问题标题】:Elasticsearch match string to field with fuzzinessElasticsearch 模糊匹配字符串到字段
【发布时间】:2018-04-30 08:32:46
【问题描述】:

我正在尝试将字符串与字段匹配,并且只想应用模糊性。

例如,使用这些文件:

{ title: "replace oilfilter" }, { title: "replace motoroil" }

以下查询应该只匹配第一个文档:

"Replace oilfilter", "Replace oilsfilter", "Replaze oilfilter"

以下查询应该不匹配任何文档:

"replace", "oilfilter", "motoroil"

到目前为止,我得到的是以下内容:

索引

我正在使用关键字分析器,因此它将(潜在)短语视为单个单词,这样在搜索“替换”时它不匹配文档,但在搜索确切术语时确实找到了文档“更换机油滤清器”。

    "mappings": {
        "blacklist": {
            "properties": {
                "title": {
                    "type": "text",
                    "analyzer": "keyword"
                }
            }
        }
    }

搜索

我尝试了多个查询来搜索文档。我接近了以下查询:

    "query": {
        "query_string": {
            "default_field": "title",
            "fuzziness": "3",
            "query": query
        }
    }

结果

使用此查询,结果如下:

> "Replace oilfilter" (exact words)
< doc: { title: "replace oilfilter" }, score: 0.5753..
< doc: { title: "replace motoroil" }, score: 0.2876..

> "Replace iolfilter" (typo)
< doc: { title: "replace oilfilter" }, score: 0.2876..

> "oilfilter" (other term)
< doc: { title: "replace oilfilter" }, score: 0.2876..

问题

结果还不错,但我需要更准确的分数。仅包含简单拼写错误的第二个查询的得分应该比第一个查询中的第二个结果和第三个查询中的唯一结果高得多。

我想要实现的是它将 whole 查询与文档中的 whole 字段匹配,这就是我使用关键字分析器的原因。除此之外,我只想应用一些模糊性。

希望有人能对这个问题有所了解。

谢谢!

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    下面的搜索应该能达到你想要的效果:

    {
      "query": {
          "bool": {
            "must": {
              "multi_match": {
                "query": "replace oilfliter",
                "fuzziness": "3",
                "fields": [
                  "title"
                ],
                "minimum_should_match": "75%",
                "type": "most_fields"
              }
            }
          }
      }
    }
    

    如果无论查询字符串有多长,都需要匹配所有查询词,您可以将minimum_should_match 增加到 100%。

    【讨论】:

    • 完美!现在分数好多了,看起来像是匹配词和模糊性的组合。但是,我可以删除“bool”和“must”查询,这给了我相同的结果。你碰巧知道为什么吗? “bool”、“must”、“multi_match”组合的目的是什么?谢谢!
    • 我认为 bool 和 must 只是我正在使用的更大搜索的残余。如果您在搜索中添加一个额外的部分以提高短语查询匹配,则在将短语匹配应用于通过“必须”阶段的结果子集之前,必须组件的作用有点像预过滤器。在您的情况下,您可以删除它。多重匹配还意味着您可以根据需要在其他字段上运行搜索,而不仅仅是“标题”。
    • @TimBaas 如果这回答了您的问题,请考虑投票/奖励答案。谢谢。
    • 我的错。感谢您对 bool/must 属性的提醒和澄清!
    猜你喜欢
    • 2012-02-14
    • 2014-11-02
    • 2018-05-31
    • 2021-04-19
    • 1970-01-01
    • 2018-03-22
    • 2017-08-03
    • 2015-02-07
    • 1970-01-01
    相关资源
    最近更新 更多