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

Elasticsearch在查询中优先选择一个字段

诸龙野
2023-03-14

我创建了一个包含标题字段和文本字段的文档弹性搜索索引。给定一个查询,我的搜索的期望行为是首先检查title字段,如果有任何文档的标题与查询“良好”匹配,那么这些文档必须排在前面。只有在良好的标题匹配之后,才应该返回具有良好文本匹配的文档。

通过“良好的标题匹配”,我的意思是类似于“查询接近标题的某个子集,其中接近意味着levinshtein距离小于某个给定数字”。这是一个阈值条件。因此,标题要么是“好”匹配,并且应该排名很高,要么不是,并且应该不会因与查询获得“一些”匹配而获得任何好处。结果是二元的。

因此,如果有一个查询“How to garden like the best”,那么标题为“garden like the bests”的文档应该排在第一位,然后是与“text”字段中的查询匹配良好的文档。标题为“预算园艺”的文件不应因标题中有“园艺”而获得奖金,因为它不够匹配。

这是我的尝试。这是使用Python弹性_dsl库。但JSON等价物应该是显而易见的。

s = Search()

initiated = s.query(
    "multi_match",
    query=query,
    fields=[
        'title^280',
        'text^1'],
    type='best_fields',
    fuzziness='AUTO')

如您所见,我已经完成了一个多匹配,其中我赋予了“标题”字段更高的重要性。我还允许一些模糊,因为不知道标题中单词的确切拼写。该指数也是词干的。这种方法基本上是成功的,但我有两种不良行为:

  1. 标题与查询有任何共同之处的文档看起来非常高。例如,上述查询将匹配标题为“预算园艺”的文档,而不是具有更好文本字段匹配的文档。这是因为没有阈值。
  2. 具有非常好的正文匹配的文档仍然比标题实际上是精确查询字符串的文档显示得更高。

如何调整我的查询以获得所需的行为?谢谢。

共有1个答案

华森
2023-03-14

还没有真正测试过它,但是https://www.elastic.co/guide/en/elasticsearch/reference/master/query-dsl-function-score-query.html看起来对你的用例很有希望,你可以尝试用它来实现“阈值”。

 类似资料:
  • 问题内容: 我有两个用于查询表中行的SQL查询,具体取决于类型2或3。 查询1: 查询2: 现在,我只想获取和使用一个查询的值。如何使用一个查询获得计数。有没有办法做到这一点。我正在使用SQLite数据库。 编辑: 我想要分别为和的值,而不是两者都在一起(不使用)。 问题答案: 尝试使用 对于两个变量:

  • 问题内容: 基本上有属性表和翻译表-一个属性有很多翻译。 我需要从翻译中为指定属性的每个属性选择id和value,即使该语言没有翻译记录也是如此。我缺少某种连接技术,或者连接(不涉及语言表)在这里不起作用,因为以下操作不会返回具有指定语言的不存在的翻译的属性。 所以我正在使用这样的子查询,这里的问题是用相同的参数在同一个表中创建两个子查询(感觉像性能消耗,除非mysql将那些子查询分组,我怀疑这是

  • 问题内容: 如何查询或过滤一个字段不等于另一个字段?即,其中document1.city1.name不等于document1.city2.name。 这个的一些版本? http://www.elasticsearch.org/guide/zh- CN/elasticsearch/reference/current/search-request-script- fields.html 问题答案: 是

  • 问题内容: 我有桌子: 我想写一个返回BookName,FirstName,LastName,RubricName的SELECT查询。 我有两个单独的查询,但我不知道如何在一个选择中编写此查询。这就是我得到的: 它工作正常,但如何在一个选择中编写? 我尝试这样做,但是不起作用: 它返回错误: 问题答案: 试试这个查询

  • 问题内容: 我发现了具有正确答案的类似问题。但是它们对我来说有点复杂。我只想要一个简单的基本声明。 我有: …和: 如何合并它们? 问题答案: 有关OUTPUT子句的更多信息,请查看此文章。

  • 我创建了3个表:Employee、Department和EMPDept。 1)员工表字段为 我不知道在第三个表(即EmpDept)中包括哪些字段,以及如何将join应用于选择列 我的尝试