【问题标题】:Elasticsearch: union of several sorted and limited queriesElasticsearch:几个排序和有限查询的联合
【发布时间】:2016-07-03 09:12:36
【问题描述】:

我需要执行两个查询,得到这两个的并集,然后对合并的结果进行排序和限制。

查询只是术语查询:

{
  "query": {
    "term": { "a.field": "A" }
  },
  "sort": [
     { "another.field": {"order": "desc"}}
  ],
  "size": 25
}

我查看了 dis_max 查询,但无法单独对查询进行排序和限制。

等效的 SQL 是:

select * from (
  (select * from my_table where a_field="A" order by another_field desc limit 25)
  union
  (select * from my_table where a_field="B" order by another_field desc limit 25)
) t order by yet_another_field limit 25;

此查询的另一部分在弹性搜索中比在关系数据库中要快得多。这就是为什么我希望看到这在弹性搜索中起作用。有可能吗?

编辑

不能选择同时使用“A”和“B”值的术语查询。这是因为当按“another.field”排序时,没有“B”文档可能会进入结果集以便稍后按“yet_another_field”排序。

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    您只需要使用terms query

    {
      "query": {
        "terms": { "a.field": ["A","B"] }
      },
      "sort": [
         { "another.field": {"order": "desc"}}
      ],
      "size": 25
    }
    

    查询是:25 results from Documents 其中a.field is either A or B 的值按another.field 降序排列

    【讨论】:

    • 我忘了说为什么这不是一个选项。这种方法的问题在于,例如如果它们与“A”文档一起排序,则值为“B”的文档可能不在结果集中。所以在实践中,"terms": { "a.field": ["A","B"] } 的结果集与 "term": { "a.field": "A" } 完全相同。我会将这个添加到问题中。
    • 您的联合查询也可能发生这种情况,不是吗?那么你想要 A 和 B 都存在的文件吗?
    • 联合查询确保 25 个 A 和 25 个 B 将按 yet_another_field 排序。
    • 示例:有两个家庭 - A 和 B。A 有两个孩子:Tom(5 岁)和 Cheryl(8 岁)。 B 有三个孩子:Ben (1)、John-John (4) 和 Rachel (6)。我想得到每个家庭中最小的两个孩子,按他们的名字对他们进行排序,然后将结果限制为 2 个孩子。使用 terms 查询,当正确的结果是 Ben 和 Cheryl 时,我总是会返回 Ben 和 John-John。
    • 好的..现在我明白了。让我检查一下。
    猜你喜欢
    • 1970-01-01
    • 2019-12-19
    • 2014-05-12
    • 1970-01-01
    • 2019-05-25
    • 1970-01-01
    • 2018-11-11
    • 1970-01-01
    • 2014-08-04
    相关资源
    最近更新 更多