【问题标题】:elasticsearch ngrams: why is shorter token matched instead of longer?elasticsearch ngrams:为什么匹配较短的令牌而不是较长的?
【发布时间】:2014-05-05 02:19:17
【问题描述】:

我有一个带有以下映射和分析器的索引:

settings: {
    analysis: {
      char_filter: {
        custom_cleaner: {
          # remove - and * (we don't want them here)
          type: "mapping",
          mappings: ["-=>", "*=>"]
        }
      },
      analyzer: {
        custom_ngram: {
          tokenizer: "standard",
          filter: [ "lowercase", "custom_ngram_filter" ],
          char_filter: ["custom_cleaner"]
        }
      },
      filter: {
        custom_ngram_filter: {
          type: "nGram",
          min_gram: 3,
          max_gram: 20,
          token_chars: [ "letter", "digit" ]
        }
      }
    }
  },
  mappings: {
    attributes: {
      properties: {
        name: { type: "string"},
        words: { type: "string", similarity: "BM25", analyzer: "custom_ngram" }
      }
    }
  }
}

我在索引中有以下 2 个文档:

"name": "shirts", "words": [ "shirt"]

"name": "t-shirts", "words": ["t-shirt"]

我执行多重匹配查询

"query": {

            "multi_match": {
               "query": "t-shirt",
               "fields": [
                  "words",
                  "name"
               ],
               "analyzer": "custom_ngram"
            }

   }

问题:

shirts 得分为 1.17,而 t-shirt 得分为 0.8。 为什么会这样?我怎样才能使 t-shirt(直接匹配)得分更高?

我需要 ngrams 用于另一个用例,我必须检测包含匹配项。 (衬衫是肌肉衬衫,...)因此我想我不能跳过 ngram。

谢谢!

【问题讨论】:

    标签: search lucene elasticsearch n-gram


    【解决方案1】:

    我相信这是因为您使用了StandardTokenizer,它将字符串“t-shirt”标记为标记“t”和“shirt”。但是,“t”比最小克大小短,因此不会从中生成任何标记。因此,您在每种情况下都获得了相同的匹配项,但带有 t-shirt 的文档较长,因此得分较低。

    您可以使用Explain API 获取有关文档获得分数的原因的详细信息。

    您确定需要使用 ngram 吗?您的示例,“muscle-shirt”中的“shirt”应该由StandardAnalyzer处理得很好,它将在连字符上标记。

    【讨论】:

    • 感谢您的回复!我会在一分钟内尝试一下。我认为,我需要 ngram,因为我也想匹配“muscleshirt”。如果没有 ngram,这可行吗? (实际上应该匹配muscle-shirt 和muscleshirt [对不起,举错了例子])
    • 解释告诉我,你是绝对正确的。 char_filter 不应该从 T 恤上去掉 - 吗?当我分析 T 恤时,elasticsearch 返回的 ngrams 没有 - (tsh, shi, hir, irt, ...)
    • 嗯。你是对的,这不太合理。你能发布解释输出吗?
    • 原来,我忘了用这些设置初始化索引,所以它使用了默认设置......哦,我的......谢谢你的支持!
    猜你喜欢
    • 2018-09-06
    • 1970-01-01
    • 2016-09-15
    • 2015-06-07
    • 1970-01-01
    • 1970-01-01
    • 2014-06-26
    • 1970-01-01
    相关资源
    最近更新 更多