2013-01-22 12 views

Trả lời

18

Bạn có thể tạo terms facet trên trường 'full_name' của mình. Nhưng để làm điều đó đúng, bạn cần phải chắc chắn rằng bạn không tokenize nó trong khi lập chỉ mục, nếu không mọi mục nhập trong các khía cạnh sẽ là một thuật ngữ khác nhau là một phần của nội dung lĩnh vực. Bạn rất có thể cần phải cấu hình nó là 'not_analyzed' trong ánh xạ của bạn. Nếu bạn cũng đang tìm kiếm trên đó và bạn vẫn muốn mã hóa nó, bạn chỉ có thể lập chỉ mục nó theo hai cách khác nhau bằng cách sử dụng multi field.

Bạn cũng cần phải tính đến tùy thuộc vào số lượng cụm từ duy nhất là một phần của trường full_name, thao tác này có thể tốn kém và yêu cầu khá nhiều bộ nhớ.

12

Đối Elasticsearch 1.0 và sau đó, bạn có thể tận dụng terms aggregation để làm điều này,

truy vấn DSL:

{ 
    "aggs": { 
    "NAME": { 
     "terms": { 
     "field": "", 
     "size": 10 
     } 
    } 
    } 
} 

Một ví dụ thực tế:

{ 
    "aggs": { 
    "full_name": { 
     "terms": { 
     "field": "authors", 
     "size": 0 
     } 
    } 
    } 
} 

Sau đó, bạn có thể nhận được tất cả các giá trị duy nhất của trường authors. size = 0 có nghĩa là không giới hạn số lượng các thuật ngữ (điều này yêu cầu es là 1.1.0 hoặc cao hơn).

đáp ứng:

{ 
    ... 

    "aggregations" : { 
     "full_name" : { 
      "buckets" : [ 
       { 
        "key" : "Ken", 
        "doc_count" : 10 
       }, 
       { 
        "key" : "Jim Gray", 
        "doc_count" : 10 
       }, 
      ] 
     } 
    } 
} 

thấy Elasticsearch terms aggregations.

+0

gì FULL_NAME nghĩa là gì? – neustart47

+2

@ neustart47 full_name chỉ là tên của tập hợp –

4

Những câu trả lời hiện không làm việc cho tôi trong Elasticsearch 5.X, vì những lý do sau đây:

  • tôi cần phải tokenize đầu vào của tôi trong khi lập chỉ mục.
  • "size": 0 không phân tích cú pháp vì "[size] phải lớn hơn 0."
  • "Fielddata is disabled on text fields by default." Điều này có nghĩa là theo mặc định, bạn không thể tìm kiếm trên trường full_name. Tuy nhiên, có thể sử dụng trường keyword không được kiểm soát để tổng hợp.

Giải pháp 1: sử dụng Scroll API. Nó hoạt động bằng cách giữ ngữ cảnh tìm kiếm và thực hiện nhiều yêu cầu, mỗi lần trả lại các kết quả theo sau. Nếu bạn đang sử dụng Python, mô-đun elasticsearch có scan() helper function để xử lý cuộn cho bạn và trả về tất cả các kết quả.

Giải pháp 2: sử dụng Search After API. Nó tương tự như Scroll, nhưng cung cấp một con trỏ trực tiếp thay vì giữ một ngữ cảnh tìm kiếm. Vì vậy, nó hiệu quả hơn cho các yêu cầu thời gian thực.

+0

Tôi không chắc chắn điều này làm việc xung quanh "kích thước": 0 vấn đề, bởi vì mặc định như xa như tôi có thể nhìn thấy từ các tài liệu là 10 ... – Trejkaz

+0

@Trejkaz Cảm ơn; Tôi đã cập nhật câu trả lời của mình. –

0

Làm việc cho Elasticsearch 5.2.2

curl -XGET http://localhost:9200/articles/_search?pretty -d ' 
{ 
    "aggs" : { 
     "whatever" : { 
      "terms" : { "field" : "yourfield", "size":10000 } 
     } 
    }, 
    "size" : 0 
}' 

"size":10000 có nghĩa là nhận được (tối đa) 10000 giá trị duy nhất. Nếu không có điều này, nếu bạn có nhiều hơn 10 giá trị duy nhất, chỉ có 10 giá trị được trả về.

"size":0 có nghĩa là kết quả là "hits" sẽ không chứa tài liệu. Theo mặc định, 10 tài liệu được trả lại, mà chúng tôi không cần.


tham khảo: bucket terms aggregation

Cũng lưu ý, theo this page, khía cạnh đã được thay thế bằng quy tụ trong Elasticsearch 1.0, mà là một superset của khía cạnh.

0

Trực giác: Trong SQL cách nói:

Select distinct full_name from authors;

tương đương với

Select full_name from authors group by full_name;

Vì vậy, chúng ta có thể sử dụng nhóm/tổng hợp cú pháp trong ElasticSearch để tìm mục riêng biệt .

Giả sử sau đây là cấu trúc lưu trữ trong tìm kiếm đàn hồi:

[{ 
    "author": "Brian Kernighan" 
    }, 
    { 
    "author": "Charles Dickens" 
    }] 

gì đã không làm việc: Plain hợp

{ 
    "aggs": { 
    "full_name": { 
     "terms": { 
     "field": "author" 
     } 
    } 
    } 
} 

Tôi đã nhận lỗi sau:

{ 
    "error": { 
    "root_cause": [ 
     { 
     "reason": "Fielddata is disabled on text fields by default...", 
     "type": "illegal_argument_exception" 
     } 
    ] 
    } 
} 

gì đã làm việc như một nét duyên dáng: Phụ thêm .keyword với lĩnh vực

{ 
    "aggs": { 
    "full_name": { 
     "terms": { 
     "field": "author.keyword" 
     } 
    } 
    } 
} 

Và sản lượng mẫu có thể là:

{ 
    "aggregations": { 
    "full_name": { 
     "buckets": [ 
     { 
      "doc_count": 372, 
      "key": "Charles Dickens" 
     }, 
     { 
      "doc_count": 283, 
      "key": "Brian Kernighan" 
     } 
     ], 
     "doc_count": 1000 
    } 
    } 
} 

Mẹo thêm:

Chúng ta hãy giả định trường trong hàng đợi stion được lồng như sau:

[{ 
    "authors": [{ 
     "details": [{ 
      "name": "Brian Kernighan" 
      }] 
     }] 
    }, 
    { 
    "authors": [{ 
     "details": [{ 
      "name": "Charles Dickens" 
      }] 
     }] 
    } 
] 

Bây giờ truy vấn chính xác trở thành:

{ 
    "aggregations": { 
    "full_name": { 
     "aggregations": { 
     "author_details": { 
      "terms": { 
      "field": "authors.details.name" 
      } 
     } 
     }, 
     "nested": { 
     "path": "authors.details" 
     } 
    } 
    }, 
    "size": 0 
}