2013-06-11 23 views
8

Tôi có một danh sách các mục như:cách lọc tìm kiếm bằng giá trị mà không có sẵn

i = SearchQuerySet().models(Item) 

bây giờ, mỗi mục trong i có một thuộc tính, price

tôi muốn thu hẹp kết quả trong mà giá thông tin là không có sẵn cùng với những người rơi vào một phạm vi nhất định

cái gì đó như

i.narrow('price:(None OR [300 TO 400 ])') 

cách thực hiện điều đó?

+2

Tôi tự hỏi liệu [cú pháp này] (http://stackoverflow.com/questions/4238609/how-to-query-solr-for-empty-fields) có thể hoạt động không? –

+0

@MartijnPieters cú pháp đó hoạt động riêng biệt, nhưng không phải cùng với OR. Tôi đã cập nhật câu hỏi của tôi –

Trả lời

6

Hãy thử điều này:

-(-price:[300 TO 400] AND price:[* TO *]) 

là giống nhau và hoạt động trong Solr.

+0

tại sao ~ AND' không' OR' mặc dù nó hoạt động cho cả 'AND' và' OR ', tôi tự hỏi tại sao –

+0

Tôi không nghĩ rằng nó hoạt động với OR. hãy xem liên kết này: http://whatis.techtarget.com/definition/logic-gate-AND-OR-XOR-NOT-NAND-NOR-and-XNOR. Nếu bạn quên một giây tiêu cực bên trong parentesys những gì chúng tôi đang thực tế làm ở đây trong một NAND giữa 2 hạn và có thể khá giống với một OR nhưng không phải trong mọi trường hợp, hãy cẩn thận. –

5

Theo SolrQuerySyntax

Queries Negative tinh khiết: -

-field:[* TO *] finds all documents without a value for field

Bạn có thể thử: - q=(*:* -price:[* TO *]) OR price:[300 TO 400]

+0

nó vẫn không đưa cho tôi các mục với giá từ 300 đến 400 –

+0

loại trường giá nào? sint ?? hoặc chuỗi/văn bản? – Jayendra

+0

trường giá là số thập phân (phao) –

-1

Người ta có thể sử dụng một filter query nếu bạn không quan tâm đến tỷ số tài liệu và muốn để tận dụng bộ nhớ cache của bộ lọc, như:

?q=*:*&fq=((-price:[* TO *]) or (price:[300 TO 400])) 
+0

Cojucaru, Bạn có thể cung cấp truy vấn trong 'mô hình (mục) .filter' .. mẫu. Tôi thực sự mới để solr và không thể chuyển đổi mã của bạn thành hình thức đó –

+0

thử một cái gì đó như mô hình này (Item) .filter_or (giá = Không có, price__range = [300, 400]) dựa trên https://github.com/soby/django-haystack/commit/71c0b0bdf4e7a25421139901c910a978bb1c5386 cho các giá trị rỗng cần sử dụng None –

+0

Cung cấp lỗi 'Invalid Number: hoặc' với Solr 6.6 –

0

Mục đích là sắp xếp một số mục theo điểm dựa trên tăng cường theo loại và cộng thêm nếu loại: mục xe đạp có hình ảnh. Kết quả sẽ là:

  1. Ô tô
  2. Thuyền
  3. Bikes với một hình ảnh
  4. Bikes mà không có một hình ảnh

Đây là cách tiếp cận truy vấn đầu tiên của tôi: type:"car"^10000 OR type:"boat"^5000 OR (type:"bike" AND image-type:[* TO *])^100 OR type:"bike"^5 (hoạt động tốt)

Nhưng tôi đã quên các mục dữ liệu cũ mà không có trường loại. Phải ở trong tập hợp kết quả như thế này:

  1. Ô tô
  2. Thuyền
  3. Bikes với một hình ảnh
  4. Bikes mà không có một hình ảnh
  5. Tất cả các mục mà không có một loại

Vì vậy, tôi đã thay đổi truy vấn của mình thành -type:[* TO *] OR type:"car"^10000 OR type:"boat"^5000 OR (type:"bike" AND image-type:[* TO *])^100 OR type:"bike"^5 và kết thúc mà không có kết quả.

Vì vậy, tôi tìm thấy chủ đề này và đã cố gắng để thay đổi truy vấn của tôi để -(type:[* TO *] OR -type:"car"^10000 OR -type:"boat"^5000 OR -(type:"bike" AND image-type:[* TO *])^100 OR -type:"bike"^5) như thể hiện trong câu trả lời này https://stackoverflow.com/a/17211744/326905

Nhưng buồn thay tất cả các mục có số điểm tương tự :(

0

Các đôi phủ nhận truy vấn được đề xuất bởi Maurizio thể nguyên nhân lỗi:

unexpected docvalues type NUMERIC for field 'price' (expected one of [SORTED, SORTED_SET]). Re-index with correct docvalues type. 

(Ngay cả sau khi tái lập chỉ mục này có thể có cái gì để làm với indexstoredocvalues. thiết lập của lĩnh vực này)

gì bạn có thể làm thay vào đó là miễn cả hai dãy (trước và sau) của các giá trị bạn đang thực sự quan tâm đến:.

-(price:[* TO 300} price:{400 TO *]) 

Lưu ý rằng giá trị 300 và 400 được loại trừ bằng cách sử dụng dấu ngoặc nhọn trong truy vấn phủ định này và do đó được bao gồm trong kết quả tìm kiếm.

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