我在query_string中使用弹性搜索的短语时没有得到预期的结果。
让我说我有一个头衔,'约翰韦恩去曼哈顿'。我用'标准'分析器索引标题字段,以下是我的查询。有或没有模糊指示符(〜)它将找不到任何东西,除非我有'john wayne'拼写正确。没有结果'john wane'或类似的。
"query": {
"query_string": {
"fields": ["title^2"],
"query": "\"john wayne\"~1",
"default_operator": "AND",
"phrase_slop": 0,
"minimum_should_match": "100%"
}
}
我试过改变波浪号后面的数字以增加虚伪,但仍然没有匹配。
任何想法?
答案 0 :(得分:5)
对短语进行模糊搜索实际上是"邻近"搜索。而不是测量字母之间的levenshtein距离,而是查询中术语之间的距离。
如果是,您的查询应返回结果:
"query" : "john wane~1"
有关差异的更多信息,请参阅此处: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html#_fuzziness
编辑:
这是一个具体的娱乐示例:
创建一些文档
curl -XPUT "http://localhost:9200/test/test/1" -d'
{
"message" : "My best friend is John Wayne, who is yours?"
}'
curl -XPUT "http://localhost:9200/test/test/2" -d'
{
"message" : "My best friend is John Marion Wayne, who is yours?"
}'
curl -XPUT "http://localhost:9200/test/test/3" -d'
{
"message" : "My best friend is John Marion Mitchell Wayne, who is yours?"
}'
示例天真查询,非短语:
curl -XGET "http://localhost:9200/_search" -d'
{
"query" : {
"query_string": {
"query": "john AND wane~1"
}
}
}'
如何使用span执行短语查询。请注意,术语是较低的,因为术语查询未被分析。此外,您可以调整跨度斜率以控制每个术语应该彼此接近的程度。
curl -XGET "http://localhost:9200/_search" -d'
{
"query" : {
"span_near" : {
"clauses" : [
{ "span_term" : { "message" : "john" } },
{ "span_term" : { "message" : "wayne" } }
],
"slop" : 0,
"in_order" : true
}
}
}'
现在,这正是你正在寻找的真正的交易。
curl -XGET "http://localhost:9200/_search" -d'
{
"query" : {
"span_near" : {
"clauses" : [
{
"span_multi" : {
"match" : {
"fuzzy" : {
"message" : {
"value" : "john",
"fuzziness" : "1"
}
}
}
}
},
{
"span_multi" : {
"match" : {
"fuzzy" : {
"message" : {
"value" : "wane",
"fuzziness" : "1"
}
}
}
}
}
],
"slop" : 0,
"in_order" : true
}
}
}'