Elasticsearch优先查询中的一个字段

时间:2019-05-01 20:32:33

标签: python django elasticsearch search

我创建了一个带有标题字段和文本字段的文档的Elasticsearch索引。给定一个查询,我搜索的理想行为是 first 首先检查标题字段,如果有任何个文档,其标题与查询,那么这些文档必须排在最前面。只有在标题匹配良好之后,才应返回文本匹配良好的文档。

通过“良好的标题匹配”,我的意思是“查询接近标题的某些子集,其中close表示水平距离小于给定数字”。这是一个阈值条件。因此,标题是“良好”的匹配,应该排在高位,否则应该不是,并且与查询获得“某些”匹配不会有任何好处。结果是二进制的。

因此,如果存在“如何最好地园艺”查询,则应将标题为“最好的花园”的文档排在首位,然后在其“文本”中紧跟该查询的文档匹配领域。标题为“ Budget Gardening”的文档不会因其标题中包含“ Gardening”而获得任何奖励,因为它不够好。

这是我的尝试。这使用的是Python elastic_dsl库。但是等效的JSON应该很明显。

s = Search()

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

正如您所看到的,我进行了多次比赛,在其中我给“标题”字段赋予了更高的重要性。由于不知道标题中单词的确切拼写,我也感到有些困惑。该索引也被阻止。这种方法大体上是成功的,但是我有两种不良行为:

  1. 文档标题与 查询出现率很高。例如,上面的查询将匹配一个 标题为“预算园艺”的文档要高于文档 具有更好的文本字段匹配。这是因为没有 阈。
  2. 仍然具有很好的正文匹配的文档 高于标题实际上是确切查询的文档 字符串。

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

1 个答案:

答案 0 :(得分:0)

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