首页 文章

elasticsearch查询字符串在使用短语时未按预期执行模糊查询

提问于
浏览
1

在query_string中使用elasticsearch时,我没有得到预期的结果 .

让我说我有一个头衔,'约翰韦恩去曼哈顿' . 我用'标准'分析器索引 Headers 字段,以下是我的查询 . 有或没有模糊指示符(〜)它将找不到任何东西,除非我有'john wayne'拼写正确 . 没有'john wane'或类似的结果 .

"query": {

  "query_string": {
    "fields": ["title^2"],
    "query": "\"john wayne\"~1",
    "default_operator": "AND", 
    "phrase_slop": 0, 
    "minimum_should_match": "100%"
  }
}

我试图在波浪之后改变数字以增加虚弱,但仍然没有匹配 .

有任何想法吗?

1 回答

  • 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执行短语查询 . 请注意,术语是较低的,因为术语查询未被分析 . 此外,您可以调整 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
            }
        }
    }'
    

相关问题