首页 文章

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

提问于
浏览
1

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

例如,使用这些文档:

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

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

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

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

"replace", "oilfilter", "motoroil"

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

指数

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

"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 字段,'s why I' m使用关键字分析器 . 最重要的是,我只想应用一些模糊性 .

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

谢谢!

1 回答

  • 1

    以下搜索应该达到您想要的效果:

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

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

相关问题