Collapse search results

本文介绍了Elasticsearch中如何使用`collapse`参数来优化搜索结果,通过折叠相同字段值的文档以提高查询效率。示例展示了如何根据`user.id`字段折叠结果并按`http.response.bytes`排序,以及如何利用`inner_hits`展开折叠结果以获取每个折叠组的详细信息。此外,还讨论了多级折叠、`search_after`参数的使用以及第二级折叠的应用。
摘要由CSDN通过智能技术生成

可以使用“collapse”参数根据字段值collapse搜索结果。collapse是通过每个collapse键仅选择排序靠前的文档来完成的。

例如,以下搜索按user.id折叠(collapse)结果,并按http.response.bytes对其进行排序。

GET my-index-000001/_search
{
  "query": {
    "match": {
      "message": "GET /search"
    }
  },
  "collapse": {
    "field": "user.id"         (1)
  },
  "sort": [
    {
      "http.response.bytes": { (2)
        "order": "desc"
      }
    }
  ],
  "from": 0                    (3)
}

(1)使用user.id字段折叠(collapse)结果集

(2)按http.response.bytes对结果进行排序

(3)定义第一个collapse结果的偏移量

用于collapse的字段必须是单值关键字(keyword)或激活了doc_值的数字(numeric)字段。

展开折叠结果

也可以使用“inner_hits”选项展开每个折叠的顶部点击。

GET /my-index-000001/_search
{
  "query": {
    "match": {
      "message": "GET /search"
    }
  },
  "collapse": {
    "field": "user.id",                       (1)
    "inner_hits": {
      "name": "most_recent",                  (2)
      "size": 5,                              (3)
      "sort": [ { "@timestamp": "desc" } ]    (4)
    },
    "max_concurrent_group_searches": 4        (5)
  },
  "sort": [
    {
      "http.response.bytes": {
        "order": "desc"
      }
    }
  ]
}

(1)使用user.id字段折叠结果集

(2)响应中用于内部命中部分的名称

(3)每个折叠关键点要检索的inner_hits命中数

(4)如何对每个组中的文档进行排序

(5)允许检索每个组的inner_hits命中的并发请求数

也可以为每个collapsed 请求多个inner_hits。当我们想要获得折叠点击的多个表示形式时,这非常有用。

GET /my-index-000001/_search
{
  "query": {
    "match": {
      "message": "GET /search"
    }
  },
  "collapse": {
    "field": "user.id",                   (1)
    "inner_hits": [
      {
        "name": "largest_responses",      (2)
        "size": 3,
        "sort": [
          {
            "http.response.bytes": {
              "order": "desc"
            }
          }
        ]
      },
      {
        "name": "most_recent",             (3)
        "size": 3,
        "sort": [
          {
            "@timestamp": {
              "order": "desc"
            }
          }
        ]
      }
    ]
  },
  "sort": [
    "http.response.bytes"
  ]
}

(1)使用user.id字段collapse结果集

(2)返回用户的三个最大HTTP响应

(3)返回用户最近的三个HTTP响应

Collapsing with search_after

字段collapsing可与search_after参数一起使用。只有在对同一字段进行排序和折叠(collapsing)时,才支持使用search_after。也不允许使用辅助排序。例如,我们可以在user.id上折叠和排序,同时使用search_after在以下内容之后对结果进行分页:

GET /my-index-000001/_search
{
  "query": {
    "match": {
      "message": "GET /search"
    }
  },
  "collapse": {
    "field": "user.id"
  },
  "sort": [ "user.id" ],
  "search_after": ["dd5ce1ad"]
}

Second level of collapsing

还支持第二级折叠,并将其应用于内部点击。

例如,以下搜索按geo.country_name折叠结果。在每个geo.country_name中,内部点击按user.id折叠。

第二级折叠不允许 inner_hits。

GET /my-index-000001/_search
{
  "query": {
    "match": {
      "message": "GET /search"
    }
  },
  "collapse": {
    "field": "geo.country_name",
    "inner_hits": {
      "name": "by_location",
      "collapse": { "field": "user.id" },
      "size": 3
    }
  }
}
{
  "hits" : {
    "hits" : [
      {
        "_index" : "my-index-000001",
        "_type" : "_doc",
        "_id" : "oX9uXXoB0da05OCR3adK",
        "_score" : 0.5753642,
        "_source" : {
          "@timestamp" : "2099-11-15T14:12:12",
          "geo" : {
            "country_name" : "Amsterdam"
          },
          "http" : {
            "request" : {
              "method" : "get"
            },
            "response" : {
              "bytes" : 1070000,
              "status_code" : 200
            },
            "version" : "1.1"
          },
          "message" : "GET /search HTTP/1.1 200 1070000",
          "source" : {
            "ip" : "127.0.0.1"
          },
          "user" : {
            "id" : "kimchy"
          }
        },
        "fields" : {
          "geo.country_name" : [
            "Amsterdam"
          ]
        },
        "inner_hits" : {
          "by_location" : {
            "hits" : {
              "total" : {
                "value" : 1,
                "relation" : "eq"
              },
              "max_score" : null,
              "hits" : [
                {
                  "_index" : "my-index-000001",
                  "_type" : "_doc",
                  "_id" : "oX9uXXoB0da05OCR3adK",
                  "_score" : 0.5753642,
                  "_source" : {
                    "@timestamp" : "2099-11-15T14:12:12",
                    "geo" : {
                      "country_name" : "Amsterdam"
                    },
                    "http" : {
                      "request" : {
                        "method" : "get"
                      },
                      "response" : {
                        "bytes" : 1070000,
                        "status_code" : 200
                      },
                      "version" : "1.1"
                    },
                    "message" : "GET /search HTTP/1.1 200 1070000",
                    "source" : {
                      "ip" : "127.0.0.1"
                    },
                    "user" : {
                      "id" : "kimchy"
                    }
                  },
                  "fields" : {
                    "user.id" : [
                      "kimchy"
                    ]
                  }
                }
              ]
            }
          }
        }
      }
    ]
  }
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值