在 Elasticsearch 中使用我的查询使用最常见的术语搜索文档,但也使用最少不常见的术语

问题描述 投票:0回答:1

我正在努力处理 ngrams 字段上的 Elasticsearch 查询。我正在尝试获取那些在该字段中具有值的文档,其 ngram 标记与我的查询输入的标记最相似。准确地说,我希望将不匹配的标记计入给定文档的分数中。如果我查询“当前资产”,我希望“我的当前资产”之类的文档的得分高于“这是当前资产的本期报告。第二个文档有更多与我的查询相同的术语(“当前”出现两次),但它还有更多不常见的术语(“这个”,“是”...)。 如何让Elasticseach在评分时考虑到不常见的术语?

我尝试检查如何计算不同文档的分数的解释。 奇怪的是,对于 bot 文档,在计算同一术语的分数时,由于 IDF 不同,它们会得到不同的值。换句话说,当要求对不同文档进行解释时,它表明同一术语(即“curr”)是不同数量的文档。这怎么可能?另外,我只有 Elasticsearch 节点。

elasticsearch search lucene full-text-search opensearch
1个回答
0
投票

准确地说,我希望将不匹配的标记计入给定文档的分数中。

这不能直接完成,因为在搜索过程中不容易获得有关不匹配标记的信息,但是,您可以访问整个文档长度,因此可以对文档长度进行惩罚。在默认算法(BM25)中,它由参数

b
控制。请参阅相似性模块文档了解更多信息。

如何让Elasticseach在评分时考虑到不常见的术语?

如果“常见”指的是匹配,则查询和文档之间的匹配术语是评分中最重要的部分。我们需要看一下解释,才能准确地告诉您为什么会得到意想不到的结果。在谈论评分时使用术语“常见”有点令人困惑,因为“常见”术语可能会被误解为 IDF 中的“频繁”术语。

换句话说,当要求对不同的文档进行解释时,它表明同一个术语(即“curr”)是不同数量的文档。这怎么可能?

默认情况下,IDF 是在每个分片上独立计算的。对于大量文档,这个数字在不同分片上往往相似,但如果文档数量较少且罕见术语,则可能会出现一些差异。解决此问题的最简单方法是使用单个分片或将

search_type
设置为
dfs_query_then_fetch
。有关此主题的更多信息,请参阅文档

很抱歉给出笼统的答案,但您问题中的大部分抱怨都可以归因于 DFS 的问题。如果切换到单个分片或使用

dfs_query_then_fetch
后您仍然遇到具体问题,请提出一个新问题,其中包含一些文档和查询示例,并打印出评分解释和说明,具体说明您对分片不满意的原因您获得的分数。

© www.soinside.com 2019 - 2024. All rights reserved.