我有2个文档,并且正在搜索关键字“ Twitter”。假设两个文档都是带有“标签”字段的博客文章。
文档A在“标签”字段中只有1个术语,即“ Twitter”。文档B在“标签”字段中有100个术语,但其中3个是“ Twitter”。
即使文档B的出现频率较高,“elasticsearch”也会给文档A更高的分数。但是该分数是“稀释的”,因为它具有更多的术语。由于文档B的搜索词频率较高,我如何给它更高的分数?
我知道ElasticSearch / Lucene根据文档中的术语数量执行一些标准化。如何禁用此规范化,以便文档B的得分更高?
正如另一个答案所说,查看单个分片是否具有相同的结果将很有趣。我想您会并且这取决于标签字段的规范,在使用tf / idf相似度(默认)来计算分数时会考虑到这一点。
实际上,lucene确实考虑了术语频率,换句话说,术语在字段中出现的次数(在您的情况下为1或3),以及倒置的文档频率,换句话说,术语在文档中的使用频率如何索引,以便将其与查询中的其他字词进行比较(如果您要搜索单个字词,则没有任何区别)。
但是还有另一个称为规范的因素,它奖励较短的字段并考虑到最终的索引时间增加,这可以针对每个字段(在映射中)甚至针对每个文档。您可以验证规范是您的结果启用搜索请求中的explain选项并查看explain输出的原因。
我猜,第一个文档仅包含该标签的事实使它比包含该标签的其他文档多次但也包含许多其他标签更为重要。如果您不喜欢这种行为,则可以在标签字段的映射中禁用规范。如果该字段为"index":"analyzed"(默认),则默认情况下应启用它。"index":"not_analyzed"如果您不希望分析标签字段(通常很有意义,但取决于您的数据和域),则可以切换到该字段,也可以"omit_norms": true在标签字段的映射中添加选项。
"index":"analyzed"
"index":"not_analyzed"
"omit_norms": true