2013-04-26 31 views
12

Tôi đang chơi với ElasticSearch kết hợp với NEST trong dự án C# của tôi. Trường hợp sử dụng của tôi bao gồm một số chỉ mục với các loại tài liệu khác nhau mà tôi truy vấn riêng cho đến nay. Bây giờ tôi muốn thực hiện một chức năng tìm kiếm toàn cầu truy vấn tất cả các chỉ mục hiện có, các loại tài liệu và ghi kết quả đúng cách.NEST: Cách truy vấn nhiều chỉ mục và xử lý các lớp con khác nhau (loại tài liệu)?

Vì vậy, câu hỏi của tôi: Làm cách nào để thực hiện điều đó bằng cách sử dụng NEST?

Hiện tại tôi đang sử dụng hàm SetDefaultIndex nhưng làm cách nào để xác định nhiều chỉ mục?

Có lẽ đối với một sự hiểu biết tốt hơn, đây là câu hỏi tôi muốn thực hiện với NEST:

{ 
    "query": { 
    "indices": { 
     "indices": [ 
     "INDEX_A", 
     "INDEX_B" 
     ], 
     "query": { 
     "term": { 
      "FIELD": "VALUE" 
     } 
     }, 
     "no_match_query": { 
     "term": { 
      "FIELD": "VALUE" 
     } 
     } 
    } 
    } 
} 

TIA

Trả lời

15

Bạn có thể nói một cách rõ ràng NEST sử dụng nhiều chỉ số:

client.Search<MyObject>(s=>s 
    .Indices(new [] {"Index_A", "Index_B"}) 
    ... 
) 

Nếu bạn muốn tìm kiếm trên tất cả các chỉ số

client.Search<MyObject>(s=>s 
    .AllIndices() 
    ... 
) 
.210

Hoặc nếu bạn muốn tìm kiếm một chỉ mục (thats không phải là chỉ số mặc định)

client.Search<MyObject>(s=>s. 
    .Index("Index_A") 
    ... 
) 

Nên nhớ kể từ elasticsearch 19,8 bạn cũng có thể chỉ định các kí hiệu khi tên chỉ số

client.Search<MyObject>(s=>s 
    .Index("Index_*") 
    ... 
) 

Đối với bạn indices_query

client.Search<MyObject>(s=>s 
    .AllIndices() 
    .Query(q=>q 
     .Indices(i=>i 
      .Indices(new [] { "INDEX_A", "INDEX_B"}) 
      .Query(iq=>iq.Term("FIELD","VALUE")) 
      .NoMatchQuery(iq=>iq.Term("FIELD", "VALUE")) 
     ) 
    ) 
); 

CẬP NHẬT

Những thử nghiệm chứng tỏ làm thế nào bạn có thể làm cho C# 's hiệp phương sai việc cho bạn:

https://github.com/Mpdreamz/NEST/blob/master/src/Nest.Tests.Integration/Search/SubClassSupport/SubClassSupportTests.cs

Trong trường hợp của bạn nếu tất cả các loại không phải là lớp con của một cơ sở chia sẻ, bạn vẫn có thể sử dụng 'đối tượng'

ví dụ:

.Search<object>(s=>s 
     .Types(typeof(Product),typeof(Category),typeof(Manufacturer)) 
     .Query(...) 
); 

này sẽ tìm kiếm trên /yourdefaultindex/products,categories,manufacturers/_search và thiết lập mặc định ConcreteTypeSelector mà hiểu những gì gõ từng trở docume nt là.

Sử dụng ConcreteTypeSelector(Func<dynamic, Hit<dynamic>, Type>) bạn có thể trả lại theo cách thủ công một loại dựa trên một số giá trị json (trên động) hoặc trên siêu dữ liệu lượt truy cập.

+0

Xin chào Martijn, cảm ơn bạn đã trả lời! Cách để truy vấn các chỉ số khác nhau mà tôi đã tìm ra. Vấn đề chính tôi hiện gặp phải là tôi có ** loại tài liệu khác nhau với cấu trúc khác nhau ** được lưu trữ trong các chỉ mục chết như Sách, Ô tô, v.v. Ví dụ: khách hàng.Search MyObject sẽ nằm trong trường hợp một cái gì đó chung chung hơn vì tôi muốn lấy sách, xe hơi, vv với một truy vấn. Tôi đã thử với kiểu generic nhưng không thành công. – Neil

+0

Cách duy nhất tôi nhận được tài liệu trở lại là bằng cách sử dụng client.Search (truy vấn).Tôi cũng đã thêm MapTypeIndices vào cài đặt kết nối (…). Bạn có thể vui lòng đưa ra một ví dụ để thực hiện điều gì đó như 'var results = Client.Search (s => s .Indices (new [] {"Book-index", "Car-index"}) . Kích thước (200) .MatchAll() ); ' Hoặc bạn có đề xuất phương pháp tiếp cận khác không? Đánh giá cao nỗ lực của bạn! – Neil

+0

Cập nhật: Hiện tại tôi đang sử dụng các lớp cơ sở của Sách, Ô tô, vv nhưng nó không phải là một giải pháp sạch. 'client.Search ' – Neil

Các vấn đề liên quan