Làm thế nào để truy vấn SOLR cho các trường trống?


112

Tôi có một 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).

Đ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 chúng không hoạt động:

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

Có cách nào để truy vấn các trường trống không?

Cảm ơn

Câu trả lời:


144

Thử cái này:

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

7
Mặc dù trang SolrQuerySyntax cho biết -id: [* TO *], chỉ -id: ["" TO *] phù hợp với tôi trên solr 1.4.
Jonathan Tran

1
@ user2043553 Không, nếu bạn ?q=-id:*nhận đượcCannot parse '-q:*': '*' or '?' not allowed as first character in WildcardQuery
Yzmir Ramirez

1
@YzmirRamirez Tôi đã thử với ví dụ của Solr 4.5.1 và ?q=-id:*dường như hoạt động như mong đợi. Có thể lỗi phân tích cú pháp liên quan đến vấn đề này .
user2043553

Xin lỗi, quên phiên bản ... Lucene Specification Version: 3.2.0tôi đang sử dụng. Rất vui vì họ đã thêm cú pháp trong Solr 4.5.1.
Yzmir Ramirez

Lưu ý rằng cú pháp này dường như cũng trả về các hàng có giá trị trường bắt đầu bằng khoảng trắng (trong Solr 4.3)
metatechbe

89

Một caveat! Nếu bạn muốn soạn thư này qua HOẶC hoặc VÀ, bạn không thể sử dụng nó trong biểu mẫu này:

-myfield:*

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

(*:* NOT myfield:*)

Hình thức này hoàn toàn có thể kết hợp được. Rõ ràng SOLR sẽ mở rộng hình thức đầu tiên sang hình thức 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 nhận được nhiều điểm hơn so với thực tế. Bạn đã tiết kiệm cho chúng tôi rất nhiều thời gian!
Zac

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

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

Bạn đã cứu tôi rất nhiều đau đầu. Tôi không chắc lời cảm ơn là đủ.
Camway


11

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

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

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


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

Tôi đoán, nó sẽ hoạt động theo cách tương tự. Nhưng tôi chưa bao giờ kiểm tra nó.
Matthias M


1

Nếu bạn đang sử dụng SolrSharp, nó không hỗ trợ các 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, ghi đè ToString (), xem tham số Phủ định có đúng khô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. Đơn giản thay đổi cà vạt thích hợp

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

1

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

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.