Hiển thị tất cả các kết quả / nhóm tổng hợp của Elaticsearch và không chỉ 10


164

Tôi đang cố gắng liệt kê tất cả các nhóm trên một tập hợp, nhưng dường như chỉ hiển thị 10 nhóm đầu tiên.

Tìm kiếm của tôi:

curl -XPOST "http://localhost:9200/imoveis/_search?pretty=1" -d'
{
   "size": 0, 
   "aggregations": {
      "bairro_count": {
         "terms": {
            "field": "bairro.raw"
         }
      }
   }
}'

Trả về:

{
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 16920,
    "max_score" : 0.0,
    "hits" : [ ]
  },
  "aggregations" : {
    "bairro_count" : {
      "buckets" : [ {
        "key" : "Barra da Tijuca",
        "doc_count" : 5812
      }, {
        "key" : "Centro",
        "doc_count" : 1757
      }, {
        "key" : "Recreio dos Bandeirantes",
        "doc_count" : 1027
      }, {
        "key" : "Ipanema",
        "doc_count" : 927
      }, {
        "key" : "Copacabana",
        "doc_count" : 842
      }, {
        "key" : "Leblon",
        "doc_count" : 833
      }, {
        "key" : "Botafogo",
        "doc_count" : 594
      }, {
        "key" : "Campo Grande",
        "doc_count" : 456
      }, {
        "key" : "Tijuca",
        "doc_count" : 361
      }, {
        "key" : "Flamengo",
        "doc_count" : 328
      } ]
    }
  }
}

Tôi có nhiều hơn 10 chìa khóa cho tập hợp này. Trong ví dụ này tôi có 145 khóa và tôi muốn đếm cho từng khóa. Có một số phân trang trên xô? Tôi có thể có được tất cả chúng?

Tôi đang sử dụng Elaticsearch 1.1.0

Câu trả lời:


195

Kích thước param phải là một param cho ví dụ truy vấn thuật ngữ:

curl -XPOST "http://localhost:9200/imoveis/_search?pretty=1" -d'
{
   "size": 0,
   "aggregations": {
      "bairro_count": {
         "terms": {
            "field": "bairro.raw",
             "size": 0
         }
      }
   }
}'

Như đã đề cập trong tài liệu chỉ hoạt động cho phiên bản 1.1.0 trở đi

Biên tập

Cập nhật câu trả lời dựa trên bình luận @PhaedrusTheGalet.

cài đặt size:0không được chấp nhận trong 2.x trở đi, do các vấn đề về bộ nhớ xảy ra trên cụm của bạn với các giá trị trường có độ chính xác cao. Bạn có thể đọc thêm về nó trong vấn đề github ở đây .

Nên đặt giá trị hợp lý cho sizemột số trong khoảng từ 1 đến 2147483647.


8
Lưu ý rằng kích thước cài đặt: 0 hiện không được chấp nhận do các vấn đề về bộ nhớ xảy ra trên cụm của bạn với các giá trị trường có độ chính xác cao. github.com/elastic/elaticsearch/issues/18838 . Thay vào đó, hãy sử dụng một số thực, hợp lý trong khoảng từ 1 đến 2147483647.
PhaedrusTheGalet

cảm ơn @PhaedrusTheGalet đã chỉ ra điều này, tôi đã chỉnh sửa câu trả lời để kết hợp nhận xét của bạn.
keety

0 đang làm việc trên 2.5.2. bạn có ý nghĩa gì bởi 2.x trở đi? bạn có nghĩa là sau phiên bản 5? Tôi cũng tò mò loại vấn đề bộ nhớ nào có thể gây ra nếu tôi muốn trả lại tất cả các lỗi có thể xảy ra, sự khác biệt giữa cài đặt 0 (max_value) và 10000 (Một số giới hạn trên lớn) là gì?
batmaci

4
@batmaci nó không được dùng nữa trong 2.x nên vẫn hoạt động và bị xóa khỏi 5.x
keety

@batmaci Tôi tin rằng việc sử dụng kích thước: <số lớn> không tốn nhiều bộ nhớ mà chỉ làm cho khách hàng rõ ràng hơn rằng có chi phí hiệu năng. Tôi nghĩ rằng đó là lý do đằng sau sự phản đối size:0. Bạn có thể đọc về nó nhiều hơn trong vấn đề
keety

37

Làm thế nào để hiển thị tất cả các thùng?

{
  "size": 0,
  "aggs": {
    "aggregation_name": {
      "terms": {
        "field": "your_field",
        "size": 10000
      }
    }
  }
}

Ghi chú

  • "size":10000Nhận tối đa 10000 thùng. Mặc định là 10.

  • "size":0Kết quả là "hits"chứa 10 tài liệu theo mặc định. Chúng tôi không cần chúng.

  • Theo mặc định, các thùng được sắp xếp theo doc_countthứ tự giảm dần.


Tại sao tôi nhận được Fielddata is disabled on text fields by defaultlỗi?

Bởi vì fielddata bị tắt trên các trường văn bản theo mặc định . Nếu bạn chưa chọn một ánh xạ loại trường, nó có ánh xạ động mặc định cho các trường chuỗi .

Vì vậy, thay vì viết "field": "your_field"bạn cần phải có "field": "your_field.keyword".


Có kích thước lớn hơn cho các thùng, có ảnh hưởng đến hiệu suất (thời gian chạy truy vấn) của truy vấn tìm kiếm không?
dùng3522967

Làm thế nào chúng ta có thể thêm phân trang cho các thùng?
Miind

7

Tăng kích thước (kích thước 2) lên 10000 trong tập hợp thuật ngữ của bạn và bạn sẽ nhận được nhóm có kích thước 10000. Theo mặc định, nó được đặt thành 10. Ngoài ra, nếu bạn muốn xem kết quả tìm kiếm, chỉ cần đặt kích thước 1 thành 1, bạn có thể xem 1 tài liệu, vì ES không hỗ trợ cả tìm kiếm và tổng hợp.

curl -XPOST "http://localhost:9200/imoveis/_search?pretty=1" -d'
{
   "size": 1,
   "aggregations": {
      "bairro_count": {
         "terms": {
             "field": "bairro.raw",
             "size": 10000

         }
      }
   }
}'

3

Nếu bạn muốn nhận được tất cả các giá trị duy nhất mà không cần đặt số ma thuật ( size: 10000), thì hãy sử dụng COMPOSITE AGGREGATION (ES 6.5+) .

Từ tài liệu chính thức :

"Nếu bạn muốn truy xuất tất cả các thuật ngữ hoặc tất cả các kết hợp thuật ngữ trong tập hợp thuật ngữ lồng nhau, bạn nên sử dụng TỔNG HỢP COMPOSITE cho phép phân trang trên tất cả các thuật ngữ có thể thay vì đặt kích thước lớn hơn tổng số của trường trong tập hợp thuật ngữ. điều khoản tổng hợp có nghĩa là trả về các điều khoản hàng đầu và không cho phép phân trang. "

Ví dụ triển khai trong JavaScript:

const ITEMS_PER_PAGE = 1000;

const body =  {
    "size": 0, // Returning only aggregation results: https://www.elastic.co/guide/en/elasticsearch/reference/current/returning-only-agg-results.html
    "aggs" : {
        "langs": {
            "composite" : {
                "size": ITEMS_PER_PAGE,
                "sources" : [
                    { "language": { "terms" : { "field": "language" } } }
                ]
            }
        }
     }
};

const uniqueLanguages = [];

while (true) {
  const result = await es.search(body);

  const currentUniqueLangs = result.aggregations.langs.buckets.map(bucket => bucket.key);

  uniqueLanguages.push(...currentUniqueLangs);

  const after = result.aggregations.langs.after_key;

  if (after) {
      // continue paginating unique items
      body.aggs.langs.composite.after = after;
  } else {
      break;
  }
}

console.log(uniqueLanguages);

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.