【问题标题】:Elasticsearch - use a "tags" index to discover all tags in a given stringElasticsearch - 使用“标签”索引来发现给定字符串中的所有标签
【发布时间】:2016-06-17 20:11:39
【问题描述】:

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

例如,给定字符串:

Model 22340 Sound Spectrum Analyzer

以下标签应匹配:

sound analyzersoundspectrumanalyzer

但不是

sound meterlight spectrumchemical analyzer

【问题讨论】:

  • 当然可以。您只需使用 match 查询和 standard 分析器即可实现您想要的结果。
  • 您可以发布一个示例作为答案吗?我很想给你功劳。
  • 我发布了一个示例作为新答案。 :)

标签: elasticsearch elasticsearch-2.0


【解决方案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 来引用标签。

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

【讨论】:

    【解决方案2】:
    "query": {
    "match": {
      "tagName": {
        "query":     "Model 22340 Sound Spectrum Analyzer",
        "fuzziness": "AUTO",
        "operator":  "or"
      }
    }
    

    }

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

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

    模糊性仅适用于基本匹配和多匹配查询。它不适用于短语匹配、常用术语或 cross_fields 匹配。

    因此您需要做出决定:模糊性与接近性。

    【讨论】:

    • 这确实有效,但我澄清了我的问题,因为结果过于慷慨。当仅找到其中一个标记时,具有多个标记的标记将匹配。仅当标签中的所有标记都在某个邻近范围内(例如 5 个单词内)的字符串中找到时,标签才应匹配。
    • 计算查询字符串中的术语似乎无关紧要,因为它由产品的名称和描述组成,这与任何给定匹配标签的术语计数无关.如果这条评论是我的查询字符串,我想匹配标签“查询字符串”而不是“查询描述”,所以接近很重要。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2016-11-07
      • 1970-01-01
      • 2013-11-20
      • 2023-04-10
      • 2018-07-11
      • 2019-06-21
      • 1970-01-01
      • 1970-01-01
      • 2019-08-12
      相关资源
      最近更新 更多