【问题标题】:How to limit search results from each index in a multi index search query?如何限制多索引搜索查询中每个索引的搜索结果?
【发布时间】:2019-08-19 10:54:44
【问题描述】:

我使用的是 Elasticsearch 6.3 版,我想跨多个索引进行查询。Elasticsearch 支持这一点,我可以在 url 中将多个索引作为逗号分隔值提供给请求正文中的一个查询,还可以提供 size 参数来限制返回的搜索结果的数量。但是,这限制了整体搜索结果的大小,并且可能导致某些索引没有结果 - 所以我想从每个索引中获取前 n 个结果。

我尝试使用多搜索 api (_msearch) 但似乎我必须为所有索引提供相同的查询和大小并且有效,但我无法获得整个结果的单一聚合,是否存在有什么办法可以解决这两个问题?

【问题讨论】:

    标签: elasticsearch lucene


    【解决方案1】:

    解决方案 1:

    _msearch 查询让您走在正确的道路上。我要做的是为每个索引发出一个查询(没有聚合!),该查询具有您想要的索引大小,以及另一个仅针对聚合的查询,如下所示:

    { "index": "index1" }
    { "size": 5, "query": { ... }}
    { "index": "index2" }
    { "size": 5, "query": { ... }}
    { "index": "index3" }
    { "size": 5, "query": { ... }}
    { "index": "index1,index2,index3" }
    { "size": 0, "query": { ... }, "aggs": { ... } }
    

    因此,前三个查询将返回三个索引中每一个的文档命中,最后一个查询将返回对所有索引计算的聚合,但不返回文档。

    解决方案 2:

    如果您的规模较小,另一种解决此问题的方法是在 query 部分中进行单个查询,然后聚合索引名称并使用 top_hits 从每个索引中检索命中,如下所示:

    POST index1,index2,index3/_search
    {
      "size": 0,
      "query": { ... },
      "aggs": {
        "indexes": {
          "terms": {
            "field": "_index",
            "size": 50
          },
          "aggs": {
            "hits": {
              "top_hits": {
                "size": 5
              }
            }
          }
        }
      }
    }
    

    【讨论】:

    • 谢谢这对我来说非常有效,但是有没有其他方法可以在不使用 _msearch API 的情况下做到这一点,因为必须为所有单个索引重复相同的查询和大小参数,这似乎有点多余的?
    • 我们在谈论什么尺寸?是 5-10 还是 1000 ?查看我的更新答案
    • 哦,刚刚看到你答案的更新部分。是的,这个也可以。我期待一长串指数(从 20 到 30),但绝对少于 1000。
    猜你喜欢
    • 2021-08-04
    • 1970-01-01
    • 2016-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    相关资源
    最近更新 更多