sử dụng HOẶC và KHÔNG trong truy vấn solr


83

Tôi đang làm việc trên một truy vấn solr tương tự như sau:

((myField:superneat AND myOtherField:somethingElse) OR NOT myField:superneat)

Khi chạy điều này, không có kết quả nào được trả về. Sử dụng tiêu chí ở hai bên của OR NOT trả lại kết quả mà tôi mong đợi - chúng không hoạt động tốt cùng nhau. Trong trường hợp myField khớp với superneat , tôi cũng dự định đảm bảo rằng myOtherField được đặt thành somethingElse , nhưng nếu myField không phải superneat , hãy đưa nó vào kết quả.

Ai đó có thể giải thích tại sao solr không trả về kết quả cho loại truy vấn này không? Truy vấn có nên được cấu trúc lại bằng cách nào đó - hay có cách nào khác mà bộ giải có thể được sử dụng để đạt được kết quả mong muốn?

Câu trả lời:


82

Tôi không biết tại sao điều đó không làm việc, nhưng là cái này một cách hợp lý tương đương và nó làm việc:

-(myField:superneat AND -myOtherField:somethingElse)

Có thể nó liên quan đến việc xác định cùng một trường hai lần trong truy vấn ...

Hãy thử hỏi trong nhóm solr-user , sau đó đăng lại câu trả lời cuối cùng ở đây!


Cảm ơn sự giúp đỡ của bạn! Điều này thực sự hoạt động - và tôi đã đặt điều này cho nhóm người dùng solr. Tôi sẽ đăng bất kỳ điều hữu ích nào mà tôi nghe được từ họ ở đây.
mất trộmricecakes

8
Lưu ý rằng -myField:superneat OR myOtherField:somethingElsecũng sẽ giống nhau và đơn giản hơn một chút.
Yorick Sijsling

3
@YorickSijsling vấn đề là mặc dù tương đương về mặt logic, Solr đôi khi không đối phó tốt với các truy vấn hoàn toàn tiêu cực như truy vấn OP đã đăng hoặc bạn đã đăng.
Mauricio Scheffer

@Mauricio Scheffer - Tôi hoàn toàn đặt câu hỏi về điều đó. Bạn có thể giải thích thêm về cách nó không đối phó rất tốt? Chúng tôi chạy các điều kiện khá phức tạp ở đây và thấy nó đối phó rất tốt với hàng tỷ tài liệu.
terrance.a.snyder

@ terrance.a.snyder "điều kiện phức tạp"! = "truy vấn hoàn toàn phủ định". Ngoài ra, mọi thứ có thể đã được cải thiện trong các phiên bản gần đây của Solr, tôi chưa kiểm tra.
Mauricio Scheffer

42
Instead of "NOT [condition]" use "(*:* NOT [condition])"

1
Cảm ơn nhiều! Điều này phù hợp với tôi ngay cả đối với các truy vấn phức tạp trong khi - (myField: superneat AND -myOtherField: somethingElse) - thì không!
dpetruha

33

Solr hiện đang kiểm tra truy vấn "thuần túy phủ định" và chèn *:*(khớp với tất cả các tài liệu) để nó hoạt động chính xác.

-foo được chuyển đổi bởi solr thành (*:* -foo)

Lưu ý lớn là Solr chỉ kiểm tra xem truy vấn cấp cao nhất có phải là truy vấn phủ định thuần túy hay không! Vì vậy, điều này có nghĩa là truy vấn like bar OR (-foo)không bị thay đổi vì truy vấn phủ định thuần túy nằm trong mệnh đề phụ của truy vấn cấp cao nhất. Bạn cần tự mình chuyển đổi truy vấn này thànhbar OR (*:* -foo)

Bạn có thể kiểm tra giải thích truy vấn solr để xác minh chuyển đổi truy vấn:

?q=-title:foo&debug=query

được chuyển thành

(+(-title:foo +MatchAllDocsQuery(*:*))

1
edismax xử lý các truy vấn thuần túy phủ định lồng nhau một cách chính xác, phải không? Đã có bất kỳ cuộc thảo luận nào về việc vá trình phân tích cú pháp truy vấn Lucene để hỗ trợ chúng theo cách tương tự?
Peter Dixon-Moses

24

Tổng hợp các nhận xét từ một vài câu trả lời khác nhau ở đây, trong tài liệu Solr và trên câu hỏi SO khác, tôi thấy rằng cú pháp sau tạo ra kết quả chính xác cho trường hợp sử dụng của tôi

(my_field = my_value hoặc my_field là null):

(my_field:"my_value" OR (*:* NOT my_field:*))

Điều này hoạt động cho solr 4.1.0. Điều này hơi khác so với trường hợp sử dụng trong OP; nhưng, tôi nghĩ rằng những người khác sẽ thấy nó hữu ích.


1
Hôm nay bạn sẽ gặp chính xác tình huống này trong Solr 5, và gợi ý này có hiệu quả.
Ryan Shelley,

9

Bạn có thể tìm thấy phần theo dõi nhóm solr-user trên: solr user mailling list

Suy nghĩ phổ biến là toán tử NOT chỉ có thể được sử dụng để xóa kết quả khỏi một truy vấn - không chỉ loại trừ những thứ ra khỏi toàn bộ tập dữ liệu. Tôi tình cờ thích cú pháp mà bạn đã đề xuất mausch - cảm ơn!


3

Chỉ để thêm một trường hợp không mong muốn khác, đây là truy vấn không trả lại kết quả mong đợi:

*:* AND ( ( field_a:foo AND field_b:bar ) OR !field_b:bar )

field_btrong trường hợp của tôi là thứ mà tôi thực hiện theo khía cạnh và cần phải nhắm mục tiêu cụm từ truy vấn "foo" chỉ trên loại (thanh) đó

Tôi đã phải chèn một cái khác *:* sau hoặc điều kiện để cái này hoạt động, như sau:

*:* AND ( ( field_a:foo AND field_b:bar ) OR ( *:* AND !field_b:bar ) )

chỉnh sửa: đây là trong solr 6.6.3


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.