A_d*_*ien 21 lucene fuzzy-search elasticsearch
我是ElasticSearch的新手,我正在探索它的功能.我感兴趣的其中一个是模糊查询,我正在测试并且有麻烦使用.这可能是一个虚假的问题,所以我猜一个已经使用过这个功能的人会很快找到答案,至少我希望如此.:)
BTW我觉得它可能不仅与ElasticSearch有关,而且可能直接与Lucene有关.
让我们从一个名为"first index"的新索引开始,我在其中存储一个值为"american football"的对象"label".这是我使用的查询.
bash-3.2$ curl -XPOST 'http://localhost:9200/firstindex/node/?pretty=true' -d '{
"node" : {
"label" : "american football"
}
}
'
Run Code Online (Sandbox Code Playgroud)
这是我得到的结果.
{
"ok" : true,
"_index" : "firstindex",
"_type" : "node",
"_id" : "6TXNrLSESYepXPpFWjpl1A",
"_version" : 1
}
Run Code Online (Sandbox Code Playgroud)
到目前为止很好,现在我想使用模糊查询找到这个条目.这是我发送的那个:
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
}
}
}
}
'
Run Code Online (Sandbox Code Playgroud)
这就是我得到的结果
{
"took" : 15,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
},
"hits" : {
"total" : 0,
"max_score" : null,
"hits" : [ ]
}
}
Run Code Online (Sandbox Code Playgroud)
如你所见,没有打击.但是现在,当我缩了一下,从"美国我查询的价值的足球 "到"美国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
}
}
}
}
'
Run Code Online (Sandbox Code Playgroud)
然后我在我的条目上得到正确的命中,结果是:
{
"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"
}
}
} ]
}
}
Run Code Online (Sandbox Code Playgroud)
所以,我有几个与此测试相关的问题:
为什么我在执行一个完全等于我唯一的条目"美式足球 " 的查询时没有得到任何结果
这与我有多字的价值有关吗?
有没有办法在我的查询结果中获得"相似性"得分,这样我就能更好地理解如何为模糊查询找到合适的阈值
在ElasticSearch网站上有一个专门用于模糊查询的页面,但我不确定它列出了我可以用于模糊查询的所有潜在参数.我能找到这么详尽的清单吗?
实际上其他查询的问题相同.
模糊查询和使用lucene语法进行模糊匹配的查询字符串查询之间有区别吗?
imo*_*tov 45
模糊查询按术语操作.它无法处理短语,因为它不分析文本.因此,在你的例子中,elasticsearch试图将术语"美式足球"与美国术语和足球术语相匹配.术语之间的匹配基于Levenshtein距离,其用于计算相似性得分.由于您有min_similarity = 0.0,只要编辑距离小于最小项的大小,任何术语都应匹配任何术语.在你的情况下,术语"美式足球"的大小为17,术语"美式"的大小为8.这两个术语之间的距离为9,大于最小项8的大小.因此,这样,这个这个词被拒绝了."美式足球"和"美国人"之间的编辑距离是6.它基本上是"美国人"一词,最后加上6个.这就是它产生结果的原因.使用min_similarity = 0.0时,编辑距离为7或更小的任何内容都会匹配.例如,您甚至可以在搜索"aqqqqqq"时获得结果.
是的,正如我上面所解释的,它与多字词值有些相关.如果要搜索多个术语,请查看模拟此查询的 模糊和文本查询的模糊参数
通常,elasticsearch.org之后的下一个最佳信息来源是elasticsearch源代码.
| 归档时间: |
|
| 查看次数: |
15566 次 |
| 最近记录: |