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

ElasticSearch字段增强

公冶安怡
2023-03-14

我有以下ElasticSearch DSL查询

query = Q("bool", should=[
    Q("match_phrase", title=term),
    Q("match_phrase", description=term),
    Q("match_phrase", name=term),
    Q("match_phrase", some_other_field=term),
])

我希望在术语名称字段匹配时提高得分,也希望在描述字段匹配时降低得分。

我试过很多事情,比如:

Q("match_phrase", description={'query': term, boost: '0.1'}),

Q("match_phrase", name={'query': term, boost: 10}),

但不能让它工作。我也尝试过将should和must等结合起来,但并没有走得太远--甚至不值得分享。有没有一种简单的方法可以做到这一点,而不需要重新对我所有的文档进行重新德行/重新打分?使用ES查询(而不是ES-DSL)的答案也会很有帮助。

共有1个答案

有骏祥
2023-03-14

您可以使用multi_match查询并将类型设置为most_fields来实现这一点。默认情况下,multi_match查询使用best_fields类型

查找与任何字段匹配的文档,但使用最佳字段中的_score。

由于希望通过多个匹配字段操作得分,因此必须将类型设置为most_fields,其中

查找与任何字段匹配的文档,并将每个字段的_score组合在一起。

因此,查询将是:

{
  "query": {
    "multi_match": {
      "query": "match",
      "type": "most_fields",
      "fields": [
        "title",
        "description^-1",
        "name^5",
        "some_other_field"
      ]
    }
  }
}

您可能已经注意到,在上面的查询中,如果match位于name中,我给name设置了5的boost以便得分更高,并且在description字段中设置了-1(-ve)boost以便降低match的得分。

这样你就可以利用boost值来获得想要的分数。

 类似资料:
  • 字段自增 const flow = await this.ctx.model.Flow.findOne({ where: { art_id } }); await flow.increment('index', { by: 900 }); 字段自减 const flow = await this.ctx.model.Flow.findOne({ where: { art_id } }); awai

  • 问题内容: 我有超过9,000,000个文档的索引。 我定义了自己的映射,一切正常。 唯一的问题是我忘记启用_size字段,现在我需要它来本地化大尺寸的文档。 从文档中,我发现可以将PUT映射API与以下参数一起使用是很好的: 新映射是否将与已设置的映射合并? 是否为已存储的文档启用了大小字段? 我有点担心更改映射,因为上次我使用新的分析仪更新设置时,由于分片重定位导致服务出现问题,并且一切卡住了

  • 问题内容: 我正在建立搜索,但需要使用不同的分析器分析1个字段。我的问题是,对于一个字段,我需要在其上安装一个分析器以进行词干分析(雪球),然后还需要一个分析器将完整的单词保留为一个标记(关键字)。我可以通过以下索引设置来使其工作: 在标题字段中搜索单个单词时出现问题。如果其中装有“帽子里的猫”,它将存储为“帽子里的猫”,但是如果我搜索猫,我什么也得不到。 这是否有可能实现?还是我需要有2个单独的

  • 我配置了一个带有两个字段的Elasticsearch索引:“name”和“type”。当我执行下面的查询时,没有得到任何结果,因为“actor”在“type”字段中。 有没有任何方法可以执行一个包含多个单词的查询,并且即使一些单词在“name”字段中而其他单词在“type”字段中也可以得到结果。 谢谢你的帮助!

  • 我遇到了一些实际的问题,比如使用字段增强来处理ElasticSearch。我已经看过关于这个主题的Nest文档,但它们没有特别大的帮助,所以我的代码实际上是基于这个问题的解决方案:使用Nest Field Boosting进行弹性搜索。 如果运行以下查询,我会得到一个结果,正如预期的那样: 然而,如果我尝试使用场增强,使用以下方法,我没有得到匹配: .OnFieldsWithBoost(d=>d.

  • 问题内容: 我是JPA和Hibernate的新手,我对乐观锁定有疑问。我有一个拥有@Version注释字段的类。当我更新此类所代表的实体时,版本计数器不会增加。这是我的代码:该类: 这是主要方法: 控制台的内容如下: 有人可以告诉我怎么了吗? 编辑: 好的,我尝试了一些。我已将锁定设置为LockModeType.OPTIMISTIC_FORCE_INCREMENT并收到以下错误消息: 因此,很明显