elasticsearch,n-gram,Search,Lucene,elasticsearch,N Gram" /> elasticsearch,n-gram,Search,Lucene,elasticsearch,N Gram" />

elasticsearch ngrams:为什么匹配的令牌较短而不是较长?

elasticsearch ngrams:为什么匹配的令牌较短而不是较长?,search,lucene,elasticsearch,n-gram,Search,Lucene,elasticsearch,N Gram,我有一个带有以下映射和分析器的索引: settings: { analysis: { char_filter: { custom_cleaner: { # remove - and * (we don't want them here) type: "mapping", mappings: ["-=>", "*=>"] } }, analyzer:

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

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" }
      }
    }
  }
}
我在索引中有以下两个文档:

“姓名”:“衬衫”,“文字”:[“衬衫”]

“姓名”:“t恤”,“文字”:[“t恤”]

我执行多重匹配查询,如下所示:

"query": {

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

   }
问题:

衬衫的得分为1.17,而t恤的得分为0.8。 这是为什么?我怎样才能使t恤(直接比赛)得分更高

我需要另一个用例的ngram,在这个用例中我必须检测包含匹配的内容。(衬衫是肌肉衬衫,…)所以我想我不能跳过ngrams


谢谢大家!

我认为这是因为您使用的是
标准标记器
,它将字符串“t-shirt”标记为标记“t”和“shirt”。然而,“t”比最小克大小短,因此不会从中生成令牌。因此,在每种情况下,您都会得到相同的匹配,但带有
t-shirt
的文档较长,因此得分较低

通过使用,您可以获得有关文档为什么会获得分数的详细信息


您确定需要使用ngrams吗?您的示例“肌肉衬衫”中的“衬衫”应该由
标准分析器处理,它将在连字符上标记。

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

通过使用,您可以获得有关文档为什么会获得分数的详细信息


您确定需要使用ngrams吗?您的示例“肌肉衬衫”中的“衬衫”应由
StandardAnalyzer处理,它将在连字符上标记。

谢谢您的回复!我马上就去试试。我想,我需要ngrams,因为我也想配上“肌肉衫”。如果没有ngrams,这是否可行?(事实上,它应该与肌肉衬衫和肌肉衬衫相匹配[为错误的例子感到抱歉])解释告诉我,你完全正确。char_过滤器不应该去掉t恤上的污点吗?当我分析t恤时,elasticsearch返回的ngrams没有-(tsh,shi,hir,irt,…)嗯。你说得对,这没有什么意义。你能发布解释输出吗?结果是,我忘了用这些设置初始化索引,所以它使用了默认设置。。。哦,我的。。。谢谢你的支持!谢谢你的回复!我马上就去试试。我想,我需要ngrams,因为我也想配上“肌肉衫”。如果没有ngrams,这是否可行?(事实上,它应该与肌肉衬衫和肌肉衬衫相匹配[为错误的例子感到抱歉])解释告诉我,你完全正确。char_过滤器不应该去掉t恤上的污点吗?当我分析t恤时,elasticsearch返回的ngrams没有-(tsh,shi,hir,irt,…)嗯。你说得对,这没有什么意义。你能发布解释输出吗?结果是,我忘了用这些设置初始化索引,所以它使用了默认设置。。。哦,我的。。。谢谢你的支持!