ElasticSearch的模糊查询

23

我是一名初学者,正在探索 ElasticSearch 的特性。其中我感兴趣的一个是 Fuzzy Query,但我在测试和使用它时遇到了麻烦。这可能是一个傻瓜问题,所以我希望已经使用过这个功能的人能够快速找到答案。

顺便说一下,我有一种感觉,这可能不仅与 ElasticSearch 有关,而且可能直接与 Lucene 有关。

让我们从创建一个名为“first index”的新索引开始,在其中存储一个值为“美式足球”的对象“label”。这是我使用的查询。

bash-3.2$ curl -XPOST 'http://localhost:9200/firstindex/node/?pretty=true' -d '{
  "node" : {
    "label" : "american football"
  }
}
'

这是我得到的结果。

{
  "ok" : true,
  "_index" : "firstindex",
  "_type" : "node",
  "_id" : "6TXNrLSESYepXPpFWjpl1A",
  "_version" : 1
}

到目前为止一切都很好,现在我想使用模糊查询来查找这个条目。这是我发送的:

bash-3.2$ curl -XGET 'http://localhost:9200/firstindex/node/_search?pretty=true' -d '{
  "query" : {
    "fuzzy" : {
      "label" : {
        "value" : "american football",
        "boost" : 1.0,
        "min_similarity" : 0.0,
        "prefix_length" : 0
      }                       
    }    
   }   
}
'

这是我得到的结果。

{
  "took" : 15,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 0,
    "max_score" : null,
    "hits" : [ ]
  }
}

正如您所看到的,没有匹配结果。但是,现在当我将查询值从"american football"缩小到"american footb"时,就像这样:

bash-3.2$ curl -XGET 'http://localhost:9200/firstindex/node/_search?pretty=true' -d ' {
  "query" : {
    "fuzzy" : {
      "label" : {
        "value" : "american footb",
        "boost" : 1.0,
        "min_similarity" : 0.0,
        "prefix_length" : 0
      }
    }
  }
}
'

然后我成功匹配到了我的输入,因此结果是:

{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 0.19178301,
    "hits" : [ {
      "_index" : "firstindex",
      "_type" : "node",
      "_id" : "6TXNrLSESYepXPpFWjpl1A",
      "_score" : 0.19178301, "_source" : {
        "node" : {
          "label" : "american football"
        }
      }
    } ]
  }
}

关于这个测试,我有几个问题:

  1. 为什么使用完全等于我的唯一条目 "american football" 的值执行查询时没有任何结果?

  2. 这是否与我具有多个单词的值有关?

  3. 是否有一种方法可以在我的查询结果中获取“相似度”分数,以便我更好地了解如何找到模糊查询的正确阈值?

  4. ElasticSearch网站上专门介绍了“模糊查询”的页面,但我不确定它列出了我可以用于模糊查询的所有潜在参数。我应该在哪里找到这样详尽的列表?

  5. 其他查询同样的问题。

  6. 使用Lucene语法进行模糊匹配的查询字符串查询模糊查询之间是否有区别?


你为什么在这个问题上打了_solr_标签? - Jesvin Jose
因为它可能与Lucene部分有关,所以Solr的开发人员可能会遇到同样的问题。 - A_dit_rien
1个回答

50

1.

模糊查询操作基于术语,无法处理短语因为它不分析文本。所以,例如在你的例子中,elasticsearch尝试匹配单词“美式足球”到单词美国和足球。术语之间的匹配基于Levenshtein距离,用于计算相似度得分。因为你的min_similarity=0.0,任何术语都应该与任何术语匹配,只要编辑距离小于最小术语的大小。在你的情况下,“美式足球”这个术语的大小为17,而“美国”这个术语的大小为8。这两个术语之间的距离是9,比最小术语的大小8大。因此,结果被拒绝了。 “美式足球” 和“美国足球”之间的编辑距离是6。这基本上是 术语“美国”末尾添加了6个字符。这就是为什么它会产生结果。对于 min_similarity=0.0,几乎任何编辑距离小于等于7的内容都会匹配。例如搜索“aqqqqqq”也会得到结果。

2.

是的,正如我上面所解释的那样,它与多个单词值有些相关。如果你想搜索多个术语,请查看Fuzzy Like This QueryText Query的模糊度参数

4 & 5.

通常,在elasticsearch.org之后获取信息的最佳来源就是elasticsearch源代码。


你是否知道Lucene是否有与你在#2中描述的类似查询?@imotov - rojobo
Elasticsearch是否仍然只允许最大编辑距离为2的模糊值? - MMMM
1
最新的ES版本7.3模糊查询文档:https://www.elastic.co/guide/en/elasticsearch/reference/7.3/query-dsl-fuzzy-query.html - coderz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接