แสดงผล / การรวม Elasticsearch ทั้งหมดไม่ใช่เพียง 10


166

ฉันพยายามที่จะแสดงรายการถังทั้งหมดในการรวม แต่ดูเหมือนว่าจะแสดงเพียง 10 รายการแรก

การค้นหาของฉัน:

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

ผลตอบแทน:

{
  "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
      } ]
    }
  }
}

ฉันมีมากกว่า 10 คีย์สำหรับการรวมนี้ ในตัวอย่างนี้ฉันมี 145 ปุ่มและฉันต้องการจำนวนสำหรับแต่ละปุ่ม มีการแบ่งหน้าในถังบ้างไหม? ฉันขอทั้งหมดได้ไหม

ฉันใช้ Elasticsearch 1.1.0

คำตอบ:


196

ขนาดพารามิเตอร์ควรเป็นพารามิเตอร์สำหรับตัวอย่างข้อความค้นหาเงื่อนไข:

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

ตามที่กล่าวไว้ในเอกสารใช้งานได้เฉพาะกับรุ่น 1.1.0 เป็นต้นไป

แก้ไข

อัปเดตคำตอบตามความคิดเห็น @PhaedrusTheGreek

การตั้งค่าsize:0จะเลิกใช้ใน 2.x เป็นต้นไปเนื่องจากปัญหาหน่วยความจำที่เกิดขึ้นในคลัสเตอร์ของคุณด้วยค่าฟิลด์ cardinality สูง คุณสามารถอ่านเพิ่มเติมเกี่ยวกับมันใน GitHub ปัญหาที่นี่

ขอแนะนำให้ตั้งค่าที่เหมาะสมอย่างชัดเจนสำหรับsizeตัวเลขระหว่าง 1 ถึง 2147483647


8
โปรดสังเกตว่าขนาดการตั้งค่า: 0 ถูกคัดค้านเนื่องจากปัญหาหน่วยความจำที่เกิดขึ้นในคลัสเตอร์ของคุณด้วยค่าฟิลด์ที่มีความสำคัญสูง github.com/elastic/elasticsearch/issues/18838 ให้ใช้ตัวเลขจริงที่สมเหตุสมผลระหว่าง 1 ถึง 2147483647
PhaedrusTheGreek

ขอบคุณ @PhaedrusTheGreek สำหรับการชี้เรื่องนี้ฉันได้แก้ไขคำตอบเพื่อรวมความคิดเห็นของคุณ
keety

0 กำลังทำงานบน 2.5.2 คุณหมายถึงอะไรโดย 2.x เป็นต้นไป หมายถึงอะไรหลังจากรุ่น 5? ฉันยังอยากรู้ว่าปัญหาหน่วยความจำแบบใดจะเกิดขึ้นได้หากฉันต้องการส่งคืน aggs ที่เป็นไปได้ทั้งหมดอะไรคือความแตกต่างระหว่างการตั้งค่า 0 (max_value) และ 10000 (ขีด จำกัด สูงสุดใหญ่)?
batmaci

4
@batmaci ถูกเลิกใช้ใน2.xดังนั้นจะยังคงใช้งานได้และถูกลบออกจาก5.x
keety

@ batmaci ฉันเชื่อว่าการใช้ขนาด: <big number> นั้นไม่ได้ใช้หน่วยความจำน้อย แต่ก็ทำให้ลูกค้ามีความชัดเจนมากขึ้นว่าค่าใช้จ่ายมีประสิทธิภาพ ฉันคิดว่านั่นคือเหตุผลที่อยู่เบื้องหลังการลดsize:0ลง คุณสามารถอ่านเพิ่มเติมเกี่ยวกับเรื่องนี้ในปัญหา
keety

37

จะแสดงที่เก็บทั้งหมดได้อย่างไร

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

บันทึก

  • "size":10000รับมากถึง 10,000 ถัง ค่าเริ่มต้นคือ 10

  • "size":0ผลลัพธ์"hits"ประกอบด้วยเอกสาร 10 รายการตามค่าเริ่มต้น เราไม่ต้องการพวกเขา

  • โดยค่าเริ่มต้นถังจะถูกจัดเรียงโดยdoc_countในลำดับที่ลดลง


เหตุใดฉันจึงได้รับFielddata is disabled on text fields by defaultข้อผิดพลาด

เพราะfielddata ถูกปิดใช้งานในช่องข้อความโดยค่าเริ่มต้น หากคุณยังไม่ได้เลือก wxplicitly การทำแผนที่ชนิดของฟิลด์ แต่ก็มีแมปแบบไดนามิกเริ่มต้นสำหรับเขตข้อมูลสตริง

ดังนั้นแทนที่จะเขียนคุณจะต้องมี"field": "your_field""field": "your_field.keyword"


การมีถังเก็บขนาดใหญ่ขึ้นส่งผลกระทบต่อประสิทธิภาพ (เวลาเรียกใช้คิวรี) ของคิวรีการค้นหาแบบยืดหยุ่น
3522967

เราจะเพิ่มเลขหน้าสำหรับถังได้อย่างไร
Miind

7

เพิ่มขนาด (ขนาดที่ 2) เป็น 10,000 ในการรวมคำของคุณและคุณจะได้รับชุดข้อมูลขนาด 10,000 โดยค่าเริ่มต้นจะถูกตั้งค่าเป็น 10 นอกจากนี้หากคุณต้องการเห็นผลการค้นหาเพียงแค่ทำให้ขนาดที่ 1 เป็น 1 คุณสามารถ ดูเอกสาร 1 ฉบับเนื่องจาก ES รองรับทั้งการค้นหาและการรวมตัว

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

         }
      }
   }
}'

4

หากคุณต้องการที่จะได้รับค่าที่ไม่ซ้ำกันทั้งหมดโดยไม่ต้องตั้งจำนวนมายากล ( size: 10000) จากนั้นใช้AGGREGATION คอมโพสิต (ES 6.5+)

จากเอกสารอย่างเป็นทางการ :

"หากคุณต้องการเรียกดูคำศัพท์ทั้งหมดหรือชุดคำศัพท์ทั้งหมดในการรวมคำแบบซ้อนคุณควรใช้การรวมคอมโพสิทซึ่งช่วยให้แบ่งหน้าคำที่เป็นไปได้ทั้งหมดแทนที่จะตั้งขนาดที่ใหญ่กว่าความสำคัญของฟิลด์ในการรวมคำ การรวมคำศัพท์มีวัตถุประสงค์เพื่อส่งคืนคำบนสุดและไม่อนุญาตการแบ่งหน้า "

ตัวอย่างการใช้งานใน 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);

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.