2011-09-09 31 views
8

Tôi đang gặp sự cố với hành vi lạ với các toán tử trong cú pháp truy vấn Solr/Lucene. Nếu tôi thực hiện truy vấnHành vi Weird Solr/Lucene với toán tử boolean

-text AND -text 

tôi nhận được tất cả các kết quả mong đợi (rất nhiều), nhưng nếu tôi đặt một số ngoặc như

-text AND (-text) 

hoặc

(-text) AND (-text) 

sau đó tôi không nhận được kết quả tại tất cả các. Tôi không thể hiểu tại sao. Bạn có lời giải thích cho hành vi này không?

Cảm ơn bạn trước.

+0

bản sao có thể có của [sử dụng OR và NOT trong truy vấn solr] (http://stackoverflow.com/questions/634765/using-or-and-not-in-solr-query) –

Trả lời

10

Câu hỏi đã được trả lời rất tốt trong Solr mailing list. Họ cũng đã thêm mục nhập trong Câu hỏi thường gặp chính thức, có nội dung:

Truy vấn Boolean phải có ít nhất một biểu thức "dương" (nghĩa là PHẢI hoặc NÊN) để khớp. Solr cố gắng để thực hiện điều này, và nếu được yêu cầu thực thi BooleanQuery chỉ chứa mệnh đề negatived ở mức cao nhất, nó sẽ thêm một kết quả phù hợp với tất cả truy vấn tài liệu (ví dụ: *: *)

Nếu cấp cao nhất BoolenQuery có chứa một nơi nào đó bên trong nó một BooleanQuery lồng nhau chỉ chứa các mệnh đề phủ định, truy vấn lồng nhau sẽ không bị sửa đổi, và nó (theo định nghĩa) không khớp với bất kỳ tài liệu nào - nếu nó được yêu cầu, điều đó có nghĩa là truy vấn bên ngoài sẽ không khớp.

Vì vậy, các biểu thức chỉ có giá trị "âm" trả về luôn 0 kết quả, ngoại trừ ở mức cao nhất, nơi trình phân tích cú pháp âm thầm thêm *:* vào đầu truy vấn.

Do đó -text AND -text được chuyển thành *:* -text AND -text và vì vậy nó có kết quả, trong khi (-text) không chuyển thành (*:* -text), bởi vì nó không phải là ở cấp cao nhất, và do đó (-text) mang đến cho không có kết quả.

1

Giải thích phụ thuộc vào trình xử lý tìm kiếm bạn đang sử dụng và toàn bộ chuỗi truy vấn.

Ví dụ: bạn có thể tìm kiếm trên nhiều lĩnh vực, như

text AND text < - mà đã tìm kiếm trong tất cả các lĩnh vực (mặc định) - tùy thuộc vào bộ xử lý tìm kiếm

FIELD1:text AND text < - trong đó sử dụng AND để tìm kiếm bên trong field1

FIELD1:text1 AND (-text2) < - tìm kiếm (như tôi nhớ đúng) cho văn bản 1 trong FIELD1 VÀ NOT text2 trong tất cả các tài liệu (mặc định) khác - tùy thuộc vào trình xử lý tìm kiếm.

Tôi nghĩ rằng việc sử dụng () sẽ thay đổi phạm vi/trường tìm kiếm.

Có thể hành vi mà bạn mô tả sẽ thực hiện với một thứ như thế ?!

+0

Trường mặc định của tôi được gọi là "toàn văn bản ". Hành vi không thay đổi nếu tôi viết toàn văn: văn bản thay vì văn bản ... –

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