Elasticsearch - 使用“tags”索引来发现给定字符串中的所有标记

时间:2016-06-17 20:11:40

标签: elasticsearch elasticsearch-2.0

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

例如,给定字符串:

Model 22340 Sound Spectrum Analyzer

以下标记应匹配:

sound analyzer sound spectrum analyzer

但不是

sound meter light spectrum chemical analyzer

3 个答案:

答案 0 :(得分:1)

"query": {
"match": {
  "tagName": {
    "query":     "Model 22340 Sound Spectrum Analyzer",
    "fuzziness": "AUTO",
    "operator":  "or"
  }
}

}

如果您希望 相等 匹配以使"sound meter"不匹配,则必须为每个包含标签中的术语计数的标记添加另一个字段name,添加一个脚本来计算查询中的术语,并在match_query中添加两者的比较,请参阅:Finding Multiple Exact Values

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

  

模糊性仅适用于基本匹配和multi_match查询。它不适用于词组匹配,常用术语或交叉字段匹配。

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

答案 1 :(得分:1)

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

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

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

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

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

  1. 对于每个标记,为其创建一个查询,并使用过滤器注册查询(使用标记的ID字段)。

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

  3. 迭代比赛。每个匹配包括查询的_id。使用_id引用标记。

  4. 这也是一篇很好的文章:https://www.elastic.co/blog/percolator-redesign-blog-post

答案 2 :(得分:0)

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

curl -XGET "http://localhost:9200/tags/_search?pretty" -d '{
  "query": {
    "match" : {
      "tagName" : "Model 22340 Sound Spectrum Analyzer"
    }
  }
}'