当前位置: 首页 > 知识库问答 >
问题:

Elasticsearch:在匹配查询中应用恒定分数,但在分析搜索词之后?

梁烨
2023-03-14

假设我有一些文档,在名为“名称”的文本字段中包含以下值

  • 文档1:abc xyz group
  • 文档2:组x/组y
  • 文档3:组1、组2、组3、组4

现在,假设我向ES发送一个简单的匹配查询,查询术语“组”:

{
    "query": {
        "match": {
            "name": "group"
        }
    }
}

我期望的结果是,无论术语出现的频率、出现的位置等,所有3个文档都会以相同的分数返回。现在,我已经知道,我可以通过将我的匹配项包装为常量分数来实现这一点,如下所示:

{
    "query": {
        "constant_score": {
            "filter": {
                "match": {
                    "name": "group"
                }
            },
            "boost": 1
        }            
    }
}

但是,假设我现在想使用搜索词abc组进行查询。在这种情况下,我希望Document2和Document3返回相同的分数(匹配组),但Document1的分数更好,因为它同时匹配abc和组。

使用常量分数包装我的匹配查询,包含任何术语的文档返回相同的分数(即文档1、2和3为abc组返回相同的分数)。如果我删除了常量评分,那么文档3的评分可能是最好的,因为它包含了更多与搜索文本匹配的内容(组出现了4次)。

似乎我需要一种方法,在匹配查询分析了我的搜索文本后,将常量_分数查询移动到。有效地使abc组的查询成为两个恒定分数查询-一个用于abc组,另一个用于abc组。

有人知道实现这一目标的方法吗?


共有1个答案

华星剑
2023-03-14

我利用Elasticsearch的独特令牌过滤器成功解决了这个问题:https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-unique-tokenfilter.html

我已经将它添加到索引映射中的name字段中,它看起来正在检索所需的结果,而不必担心constant_score

然而,请注意,所有这一切都是为了消除术语频率对得分的任何影响-其他指标(如字段长度)仍然会对结果产生影响。因此,这并不等同于我在问题中假设的使用后分析版本的常量分数,但这足以满足我当前的要求。

 类似资料:
  • 我有一个带有标准分析器的弹性搜索集群。我知道使用这个分析仪,术语“300”被分析为一种类型。 假设我正在搜索一个具有字段“name”的文档,该字段的值为“纸巾300 CT”,分析为[“Paper”(ALPHANUM)、“tower”(ALPHANUM)、“300”(NUM)、“CT”(ALPHANUM)] 目前,当我使用模糊/通配符查询时,如下所示: 无论模糊性如何调整,模糊查询都不匹配。我希望术

  • 这个问题类似于我的另一个问题,在这里输入Val回答的链接描述。 我有一个包含3个文档的索引。 当我搜索“Ann”时,我希望elastic返回所有这3个文档(因为它们在一定程度上都与术语“Ann”匹配)。但是,我希望符晓薇·雷具有较低的分数(相关性排名),因为搜索词“Ann”在本文档中出现的位置比该词在其他两个文档中出现的位置要晚。 这是我的索引设置… 以下查询返回了预期的文档,但Leanne Ra

  • 问题内容: 我正在寻找给定此数组的函数, 我想寻找针头 “面包” 并得到以下结果 问题答案: 使用。您可以提供一个回调,该回调确定哪些元素保留在数组中以及哪些元素应删除。(从回调返回的值指示应删除给定的元素。)类似这样的东西: 欲获得更多信息: 返回值

  • 我的目标是搜索一个词,而不管添加了什么分析器。 我使用了匹配查询与关键字分析器,但我认为它可以与添加到该属性中的默认分析器一起工作。 在弹性搜索中,我的作者文档结构如下所示

  • 问题内容: 我正在尝试为最终用户提供搜索类型,这更像sqlserver。我能够为给定的SQL场景实现ES查询: 但是ES查询不适用于此sql查询 在我的elasticsearch以及通配符查询中,我还需要执行一些布尔过滤查询 上面的带有通配符搜索的弹性查询可以很好地工作,并让我获得所有与pete匹配且不是xyz和abc类型的文档。但是当我尝试使用以空格分隔的2个独立单词执行通配符时,相同的查询返回

  • 问题内容: 我正在使用Elasticsearch构建URL索引。 我将一个URL提取为3个部分,分别是“域”,“路径”和“查询”。 例如:将分为 当我想在索引中部分搜索域时出现问题,例如“ user = who”或“ ing.com”。 甚至在索引时没有使用“ Analyzer”时,是否可以使用“ Analyzer”? 如何基于分析仪进行部分搜索? 非常感谢你。 问题答案: 2种方法: 1.通配符