Elasticsearch将字符串匹配到具有模糊性的字段

时间:2017-11-16 17:31:08

标签: elasticsearch

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

例如,使用这些文件:

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

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

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

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

"replace", "oilfilter", "motoroil"

到目前为止我得到的是:

索引

我使用关键字分析器,因此它将(潜在)短语视为单个单词,这样在搜索&#34时替换文档时不匹配"替换"但它确实在搜索确切的术语时找到了一个文件"替换了油过滤器"。

    "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..

问题

结果不是那么糟糕,但我需要得分更准确。仅使用简单拼写错误的第二个查询应该得到比第一个查询中的第二个结果高得多的分数,以及第三个查询中的唯一结果。

我想要实现的是它将整个查询与文档中的整个字段相匹配,这就是为什么我&#39 ; m使用关键字分析器。最重要的是,我只想应用一些模糊性。

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

谢谢!

1 个答案:

答案 0 :(得分:2)

以下搜索应达到您的目的:

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

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