2017-11-24 14 views
5

Khi có thiết lập sau trên Solr 6.6.2:Solr 6.6.2 Truy vấn được nhóm

Bộ sưu tập đám mây Solr có tài liệu có ID trường, ContactId, Thuộc tính và chạy và khóa duy nhất trên id.

Có thể có nhiều tài liệu với cùng một ContactId.

Mỗi tài liệu liên hệ có thuộc tính trường văn bản chứa dòng văn bản. Trường thuộc tính được lập chỉ mục có phân tách bằng ',' để ví dụ: Thuộc tính: Lượt truy cập xanh lục.

Ví dụ:

+----+-----------+--------------+ 
| ID | ContactId | Properties | 
+----+-----------+--------------+ 
| 1 | C1  | Blue,Green | 
| 2 | C1  | Blue,Yellow | 
| 3 | C2  | Green,Yellow | 
+----+-----------+--------------+ 

Bây giờ tôi cần phải tìm tất cả ContactIds nơi Thuộc tính đã "xanh" VÀ "vàng", nơi nó được cho phép truy vấn này phù hợp với tất cả các tài liệu trên của ContactID này. Vì vậy, kết quả sẽ là trong trường hợp đó C1, C2.

Tôi đã cố gắng nhóm các kết quả nhưng tôi vẫn không thể truy vấn kết quả được nhóm.

group=true&group.field=ContactId&group.query=(Green AND Yellow)&q=(Green OR Yellow) 

Ý tưởng Tôi đi theo là truy vấn (q) để nhận tất cả các tài liệu trong đó có một trong hai màu xanh lá cây hoặc màu vàng hơn làm nhóm trên group.field ContactId và sau đó các group.query với VÀ Điều kiện màu xanh lá cây và màu vàng. Nhưng điều đó đã không thành công.

trong MySQL người ta sẽ làm chỉ là một

group_concat(Properties) as grouped 

và làm một như trên chuỗi:

grouped LIKE '%Green%' AND grouped LIKE '%Yellow%' 

Làm thế nào tôi có thể đạt được truy vấn này về chỉ số Solr?

Cố gắng cho đến nay như đề xuất với dấu ngoặc kép và không có:

intersect( 
    search(w3, q=Properties:("Green"), fl="ContactId", sort="ContactId asc"), 
    search(w3, q=Properties:("Yellow"), fl="ContactId", sort="ContactId asc"), 
    on="ContactId") 

có nguồn gốc từ các ví dụ Solr của giao nhau:

intersect( 
    search(w3, q=Properties:("Green" OR "Green" AND "Yellow"), fl="ContactId", sort="ContactId asc"), 
    search(w3, q=Properties:("Yellow" OR "Green" AND "Yellow"), fl="ContactId", sort="ContactId asc"), 
    on="ContactId") 

Nhưng vẫn chỉ kết quả hiện ra nơi cả hai tính chất này là bên trong cùng một tài liệu và không phải là nơi mà mỗi người trong số đó được phân chia trên nhiều tài liệu của cùng một ContactId (Chỉ C2 trong trường hợp đó, nhưng không phải C1).

+0

bạn bắt buộc phải làm điều đó với mô hình dữ liệu hiện tại? vì vậy không có thời gian tham gia có thể cho bạn hay không? – Mysterion

+0

Không, tôi không thể thay đổi nó – gantners

Trả lời

1

Bạn có thể làm điều này bằng cách sử dụng một Streaming Expression, và lấy các tài liệu contained in the intersection giữa hai truy vấn của bạn (ví dụ: một truy vấn phù hợp Yellow, một phù hợp Green):

intersect(
    search(collection, q=Properties:Yellow, fl="ContactId", sort="ContactId asc"), 
    search(collection, q=Properties:Green, fl="ContactId", sort="ContactId asc"), 
    on="ContactId" 
) 

Bạn cho một biểu thức streaming thông qua các tham số expr đến trình xử lý yêu cầu /stream. Bạn cũng có thể kiểm tra trực tiếp (không có expr=) trong phần "Luồng" trong giao diện quản trị Solr cho bộ sưu tập của bạn.

Ngoài ra, ví dụ MySQL của bạn sẽ không thực sự giống nhau, vì nó bao gồm bất kỳ phần tử nào có văn bản hiện diện ở đâu đó - vì vậy "Màu xanh đậm" sẽ có một kết quả dương tính giả.

+0

tôi đã thử cách tiếp cận đó, nhưng nó không cung cấp kết quả chính xác. Dường như, giao lộ được thực hiện dựa trên các tài liệu trả về khác nhau về C1, Doc1 cho Green và Doc2 cho màu vàng. Nhưng tôi cần giao lộ trên tài sản ContactID của các tài liệu trả lại thay vì các tài liệu chính nó. – gantners

+0

Giao lộ phải được thực hiện trên trường được đưa ra trong 'on' cho toán tử giao nhau; điều quan trọng là bạn _also_ sắp xếp theo trường này, vì đó là cách mà toán tử giao lộ sẽ biết tiến tới tài liệu tiếp theo trên một trong hai luồng. Bạn có một ví dụ mà điều này không thành công, với kết quả từ biểu thức? – MatsLindh

+0

Thats những gì tôi nghĩ là tốt, nhưng kết quả nói khác nhau. Tôi đã thử của bạn cũng như bắt nguồn từ các ví dụ. – gantners

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