【问题标题】:Elasticsearch Ranking on aggregation based on AND and OR基于 AND 和 OR 聚合的 Elasticsearch 排名
【发布时间】:2019-10-09 17:18:42
【问题描述】:

我有一个包含多个关键字的查询,并汇总了作者 ID。

我希望排名基于结合必须和应该。

例如,对于查询“X”、“Y”,文档字段中同时包含“X”和“Y”的作者应该排名较高,其次是包含“X”或“Y”的作者。

执行它们中的每一个(AND/OR)都很容易,我需要如何在一个 ES 查询中实现两者的想法/方向。

我对 X 和 Y 的当前查询是:

GET /docs/_search
{
  "size": 0,
  "query": {
    "bool": {
      "must": [
        {
          "query_string": {
            "query": "X",
            "fields": [
              "fulltext"
            ],
            "default_operator": "AND"
          }
        },
        {
          "query_string": {
            "query": "Y",
            "fields": [
              "fulltext"
            ],
            "default_operator": "AND"
          }
        }
      ]
    }
  },
  "aggs": {
    "search-users": {
      "terms": {
        "field": "author.id.keyword",
        "size": 200
      },
      "aggs": {
        "top-docs": {
          "top_hits": {
            "size": 100
          }
        }
      }
    }
  }
}

更改 must 应该将其更改为 OR,但我希望将两个排名作者的组合与 must 在聚合中排名更高。

【问题讨论】:

  • 你绝对应该显示你当前的查询
  • 我现在已经添加了。 @Val

标签: elasticsearch


【解决方案1】:

提升结果的常用方法是添加一个should 子句来查找这两个术语,如下所示。

GET /docs/_search
{
  "size": 10,
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "fulltext": "X Y",
            "operator": "AND"
          }
        }
      ],
      "must": [
        {
          "match": {
            "fulltext": "X Y",
            "operator": "OR"
          }
        }
      ]
    }
  },
  "aggs": {
    "search-users": {
      "terms": {
        "field": "author.id.keyword",
        "size": 200
      },
      "aggs": {
        "top-docs": {
          "top_hits": {
            "size": 100
          }
        }
      }
    }
  }
}

【讨论】:

  • 我认为它负责聚合内的排名,但原始查询仍然是 AND,例如刚刚使用单词“X”或“Y”的作者不是结果的一部分.
  • 谢谢。这是一个巨大的改进,但有两个小的实际问题。 1.查询本身“X”或“Y”可以在其中包含一个空格,我宁愿有一种方法可以一个一个地包含多个查询,而不是一个字符串。 2. 从全文和author.bio等多个字段搜索时,它也能工作吗?
  • 1.空格不是问题,您可以将所有术语放在一个字符串中,它们都会被分析。 2.如果有多个字段,可以使用multi_match。
猜你喜欢
  • 2018-06-03
  • 2016-12-02
  • 1970-01-01
  • 1970-01-01
  • 2020-07-11
  • 2018-06-13
  • 1970-01-01
  • 2021-12-04
  • 2017-03-28
相关资源
最近更新 更多