折叠搜索结果编辑

您可以使用 collapse 参数根据字段值折叠搜索结果。折叠操作是通过为每个折叠键仅选择排名最高的文档来完成的。

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

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

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

http.response.bytes 对结果进行排序

定义第一个折叠结果的偏移量

响应中的总命中数表示不进行折叠的匹配文档数。不同组的总数未知。

用于折叠的字段必须是启用了 doc_values 的单值 关键字数字 字段。

折叠仅应用于排名靠前的结果,不会影响聚合。

展开折叠结果编辑

也可以使用 inner_hits 选项展开每个折叠的排名靠前的结果。

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

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

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

要为每个折叠键检索的 inner_hits 的数量

如何对每个组内的文档进行排序

允许为每个组检索 inner_hits 的并发请求数

有关支持选项的完整列表和响应的格式,请参阅内部命中

也可以为每个折叠的命中请求多个 inner_hits。当您想要获得折叠命中的多个表示形式时,这非常有用。

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

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

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

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

组的展开是通过为响应中返回的每个折叠命中发送针对每个 inner_hit 请求的附加查询来完成的。如果您有太多组或 inner_hit 请求,这可能会大大降低搜索速度。

max_concurrent_group_searches 请求参数可用于控制此阶段允许的最大并发搜索数。默认值基于数据节点数和默认搜索线程池大小。

collapse 不能与 滚动重新评分 一起使用。

使用 search_after 进行折叠编辑

字段折叠可以与 search_after 参数一起使用。仅当在同一字段上进行排序和折叠时,才支持使用 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"]
}

二级折叠编辑

也支持二级折叠,并将其应用于 inner_hits

例如,以下搜索按 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",
        "_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" : 0.5753642,
              "hits" : [
                {
                  "_index" : "my-index-000001",
                  "_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"
                    ]
                  }
                }
              ]
            }
          }
        }
      }
    ]
  }
}

跟踪分数编辑

collapsesort 在某个字段上一起使用时,不会计算分数。将 track_scores 设置为 true 会指示 Elasticsearch 计算和跟踪分数。