23

我是ElasticSearch的新手,目前正在探索它的功能。我感兴趣的其中之一是Fuzzy Query,我正在对其进行测试并且使用时遇到了麻烦。这可能是一个愚蠢的问题,所以我想已经使用此功能的人会很快找到答案,至少我希望如此。:)

顺便说一句,我觉得它可能不仅与ElasticSearch相关,而且可能与Lucene直接相关。

让我们从一个名为“first index”的新索引开始,我在其中存储了一个值为“american football”的对象“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" : [ ]
  }
}

如您所见,没有命中。但是现在,当我将查询的值从“美式足球”缩小到“美式足球”时,如下所示:

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. 为什么在执行一个值完全等于我唯一的条目“美式足球”的查询时我没有得到任何结果

  2. 这与我具有多字价值这一事实有关吗?

  3. 有没有办法在我的查询结果中获得“相似性”分数,这样我就可以更好地理解如何为我的模糊查询找到正确的阈值

  4. ElasticSearch 网站上有一个专门用于模糊查询的页面,但我不确定它是否列出了我可以用于模糊查询的所有潜在参数。我能找到这么详尽的清单吗?

  5. 实际上,其他查询的问题相同。

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

4

1 回答 1

49

1.

模糊查询根据条款进行。它无法处理短语,因为它不分析文本。因此,在您的示例中,elasticsearch 尝试将“美式足球”一词与美式足球和美式足球相匹配。词项之间的匹配基于Levenshtein 距离,用于计算相似度得分. 由于您有 min_similarity=0.0 任何术语都应该匹配任何术语,只要编辑距离小于最小术语的大小。在您的情况下,术语“美式足球”的大小为 17,而术语“美式足球”的大小为 8。这两个术语之间的距离是 9,大于最小术语 8 的大小。因此,这任期被拒绝。"american footb" 和 "american" 之间的编辑距离是 6。它基本上是术语 "american",最后加了 6 个。这就是它产生结果的原因。使用 min_similarity=0.0 几乎所有编辑距离为 7 或更少的东西都会匹配。例如,您甚至可以在搜索“aqqqqqq”时获得结果。

2.

是的,正如我上面解释的,它与多字值有些相关。如果要搜索多个词,请查看Fuzzy Like This QueryText Query的 fuzziness 参数

4 & 5。

通常,在 elasticsearch.org 之后的下一个最佳信息来源是 elasticsearch 源代码。

于 2012-04-28T02:16:37.837 回答