我正在努力处理 ngrams 字段上的 Elasticsearch 查询。我正在尝试获取那些在该字段中具有值的文档,其 ngram 标记与我的查询输入的标记最相似。准确地说,我希望将不匹配的标记计入给定文档的分数中。如果我查询“当前资产”,我希望“我的当前资产”之类的文档的得分高于“这是当前资产的本期报告。第二个文档有更多与我的查询相同的术语(“当前”出现两次),但它还有更多不常见的术语(“这个”,“是”...)。 如何让Elasticseach在评分时考虑到不常见的术语?
我尝试检查如何计算不同文档的分数的解释。 奇怪的是,对于 bot 文档,在计算同一术语的分数时,由于 IDF 不同,它们会得到不同的值。换句话说,当要求对不同文档进行解释时,它表明同一术语(即“curr”)是不同数量的文档。这怎么可能?另外,我只有 Elasticsearch 节点。
准确地说,我希望将不匹配的标记计入给定文档的分数中。
这不能直接完成,因为在搜索过程中不容易获得有关不匹配标记的信息,但是,您可以访问整个文档长度,因此可以对文档长度进行惩罚。在默认算法(BM25)中,它由参数
b
控制。请参阅相似性模块文档了解更多信息。
如何让Elasticseach在评分时考虑到不常见的术语?
如果“常见”指的是匹配,则查询和文档之间的匹配术语是评分中最重要的部分。我们需要看一下解释,才能准确地告诉您为什么会得到意想不到的结果。在谈论评分时使用术语“常见”有点令人困惑,因为“常见”术语可能会被误解为 IDF 中的“频繁”术语。
换句话说,当要求对不同的文档进行解释时,它表明同一个术语(即“curr”)是不同数量的文档。这怎么可能?
默认情况下,IDF 是在每个分片上独立计算的。对于大量文档,这个数字在不同分片上往往相似,但如果文档数量较少且罕见术语,则可能会出现一些差异。解决此问题的最简单方法是使用单个分片或将
search_type
设置为 dfs_query_then_fetch
。有关此主题的更多信息,请参阅文档。
很抱歉给出笼统的答案,但您问题中的大部分抱怨都可以归因于 DFS 的问题。如果切换到单个分片或使用
dfs_query_then_fetch
后您仍然遇到具体问题,请提出一个新问题,其中包含一些文档和查询示例,并打印出评分解释和说明,具体说明您对分片不满意的原因您获得的分数。