2010-11-21 31 views
87

Tôi có chỉ mục solr lớn và tôi nhận thấy một số trường không được cập nhật chính xác (chỉ mục là động).Cách truy vấn SOLR cho các trường trống?

Điều này đã dẫn đến một số trường có trường "id" trống.

Tôi đã thử các truy vấn này, nhưng họ đã không làm việc:

id:'' 
id:NULL 
id:null 
id:"" 
id: 
id:['' TO *] 

Có cách nào để truy vấn các lĩnh vực có sản phẩm nào?

Cảm ơn

Trả lời

114

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

?q=-id:["" TO *] 
+6

Mặc dù trang SolrQuerySyntax nói -id: [* TO *], chỉ -id: ["" TO *] làm việc cho tôi trên trang 1.4. –

+2

Không '? Q = -id: *' hoạt động không? – user2043553

+1

@ user2043553 Không, nếu bạn '? Q = -id: *' bạn nhận được 'Không thể phân tích cú pháp' -q: * ':' * 'hoặc'? ' không được phép làm ký tự đầu tiên trong WildcardQuery' –

63

Theo SolrQuerySyntax, bạn có thể sử dụng q=-id:[* TO *].

+0

Điều này làm việc cho tôi trong Solr 4.0 với trường int. –

+1

Điều này cần được đánh dấu như là câu trả lời chính xác. Xem http://stackoverflow.com/questions/10722145/solr-how-do-i-construct-a-query-that-requires-a-not-null-location-field –

1

Nếu bạn đang sử dụng SolrSharp, nó không hỗ trợ truy vấn phủ định.

Bạn cần thay đổi QueryParameter.cs (Tạo một tham số mới)

private bool _negativeQuery = false; 

public QueryParameter(string field, string value, ParameterJoin parameterJoin = ParameterJoin.AND, bool negativeQuery = false) 
{ 
    this._field = field; 
    this._value = value.Trim(); 
    this._parameterJoin = parameterJoin; 
    this._negativeQuery = negativeQuery; 
} 

public bool NegativeQuery 
{ 
    get { return _negativeQuery; } 
    set { _negativeQuery = value; } 
} 

Và trong lớp QueryParameterCollection.cs, ToString() ghi đè lên, trông nếu tham số âm là đúng

arQ[x] = (qp.NegativeQuery ? "-(" : "(") + qp.ToString() + ")" + (qp.Boost != 1 ? "^" + qp.Boost.ToString() : ""); 

Khi bạn gọi trình tạo tham số, nếu đó là giá trị âm. thay đổi đơn giản các propertie

List<QueryParameter> QueryParameters = new List<QueryParameter>(); 
QueryParameters.Add(new QueryParameter("PartnerList", "[* TO *]", ParameterJoin.AND, true)); 
8

Nếu bạn có chỉ mục lớn, bạn nên sử dụng một giá trị mặc định

<field ... default="EMPTY" /> 

và sau đó truy vấn cho giá trị mặc định này. Điều này hiệu quả hơn nhiều so với q = -id: ["" TO *]

+0

Điều này sẽ chỉ hoạt động cho các trường kiểu String? Làm thế nào bạn sẽ làm điều đó cho boolean? – jared

+0

Tôi đoán, nó sẽ làm việc theo cùng một cách.Nhưng tôi chưa bao giờ kiểm tra nó –

2

Bạn cũng có thể sử dụng nó như thế này.

fq=!id:['' TO *] 
1

bạn có thể làm điều đó với truy vấn lọc q = *: * & fq = -ID: *

55

Một caveat! Nếu bạn muốn soạn này qua OR hoặc AND bạn không thể sử dụng nó trong hình thức này:

-myfield:* 

nhưng bạn phải sử dụng

(*:* NOT myfield:*) 

hình thức này là hoàn toàn composable. Rõ ràng SOLR sẽ mở rộng hình thức đầu tiên đến thứ hai, nhưng chỉ khi nó là một nút trên cùng. Hy vọng điều này giúp bạn tiết kiệm thời gian!

+2

Câu trả lời này xứng đáng có nhiều điểm hơn nó thực sự có. – Zac

+0

+1 ở đây là tốt.Tôi thực hiện các tùy chọn khác nhưng tôi đã phải bao gồm nó trong một fq = chứ không phải là q = và cũng đã phải thực hiện một OR để kiểm tra xem lĩnh vực có sản phẩm nào HOẶC đã có một giá trị cụ thể. Đây là tùy chọn duy nhất hoạt động cho trường hợp sử dụng đó. –

+0

Tôi đồng ý rằng đây phải là câu trả lời được chấp nhận cho câu hỏi – tinker

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