首页 文章

ElasticSearch的模糊查询

提问于
浏览
17

我是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"
  }
}
'

这是我得到的结果 .

{
  "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" : [ ]
  }
}

如你所见,没有打击 . 但现在,当我从“美国 football " to "美国 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"
        }
      }
    } ]
  }
}

所以,我有几个与此测试相关的问题:

  • 为什么在执行完全等于我的唯一条目“american football ”的查询时,我没有得到任何结果

  • 这与我有多字的 Value 有关吗?

  • 有没有办法在我的查询结果中获得“相似性”得分,这样我就能更好地理解如何为模糊查询找到合适的阈值

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

  • 实际上其他查询的问题相同 .

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

1 回答

  • 42

    1.

    模糊查询按术语操作 . 它无法处理短语,因为它不分析文本 . 因此,在您的示例中,elasticsearch尝试将术语"american football"与术语“美国”和术语“足球”相匹配 . 术语之间的匹配基于Levenshtein distance,用于calculate similarity score . 由于您有min_similarity = 0.0,只要编辑距离小于最小项的大小,任何术语都应匹配任何术语 . 在您的情况下,术语"american football"的大小为17,术语"american"的大小为8.这两个术语之间的距离为9,大于最小项8的大小 . 因此,该术语被拒绝 . "american footb"和"american"之间的编辑距离为6.它's basically the term 1074769 with 6 additions at the end. That'为什么它产生结果 . 使用min_similarity = 0.0时,编辑距离为7或更小的任何内容都会匹配 . 例如,您甚至可以在搜索"aqqqqqq"时获得结果 .

    2.

    是的,正如我上面所解释的,它与多字词值有些相关 . 如果要搜索多个术语,请查看Fuzzy Like This Query和模糊参数Text Query

    4&5 .

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

相关问题