0

我有一个带有“标签”索引的 elasticsearch v2.x 集群,其中包含大约 5000 个标签:{tagName, tagID}. 给定一个字符串,是否可以查询标签索引以获取在该字符串中找到的所有标签?我不仅想要精确匹配,而且还希望能够控制模糊匹配而不会过于慷慨。过于慷慨,只有在标签中的所有标记都在彼此之间的某个接近范围内(比如 5 个单词)找到时,标签才应该匹配。

例如,给定字符串:

Model 22340 Sound Spectrum Analyzer

以下标签应匹配:

sound analyzer sound spectrum analyzer

但不是

sound meter light spectrum chemical analyzer

4

3 回答 3

2

我认为不可能创建一个准确的弹性搜索查询来自动标记随机字符串。这基本上是一个反向查询。将标签与文档匹配的最准确方法是为标签构造查询,然后搜索文档。显然,如果您需要遍历每个标签以自动标记文档,这将非常低效。

要进行反向查询,您需要使用 Elasticsearch Percolator API:

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-percolate.html

API 非常灵活,允许您在具有多个字段的文档中创建相当复杂的查询。

基本概念是这样的(假设您的标签有一个特定于应用程序的 ID 字段):

  1. 对于每个标签,为其创建一个查询,并将查询注册到渗透器(使用标签的 ID 字段)。

  2. 要自动标记字符串,请将您的字符串(作为文档)传递给 Percolator,它将与所有已注册的查询进行匹配。

  3. 迭代匹配。每个匹配项都包含查询的 _id。使用 _id 来引用标签。

这也是一篇值得阅读的好文章:https ://www.elastic.co/blog/percolator-redesign-blog-post

于 2016-07-01T23:39:01.217 回答
1
"query": {
"match": {
  "tagName": {
    "query":     "Model 22340 Sound Spectrum Analyzer",
    "fuzziness": "AUTO",
    "operator":  "or"
  }
}

}

如果您想要一个相等的匹配,那么"sound meter"您将不得不为每个标签添加另一个字段,其中包含标签名称中的术语计数,添加一个脚本来计算查询中的术语并在 match_query 中添加两者的比较,请参阅:查找多个精确值

关于接近度问题:由于您需要“模糊性”,因此您无法控制接近度,因为"match_phrase"查询未与模糊性集成,如 Elastic docs Fuzzy-match-query所述:

Fuzziness 仅适用于基本 match 和 multi_match 查询。它不适用于短语匹配、常用术语或 cross_fields 匹配。

所以你需要决定:模糊性与接近性。

于 2016-06-20T06:23:04.617 回答
0

当然可以。您只需使用standard分析器匹配查询即可实现您想要获得的结果。

curl -XGET "http://localhost:9200/tags/_search?pretty" -d '{
  "query": {
    "match" : {
      "tagName" : "Model 22340 Sound Spectrum Analyzer"
    }
  }
}'
于 2016-06-20T11:00:34.490 回答