Bagaimana cara menanyakan SOLR untuk bidang kosong?


112

Saya memiliki indeks solr yang besar, dan saya perhatikan beberapa bidang tidak diperbarui dengan benar (indeksnya dinamis).

Hal ini mengakibatkan beberapa bidang memiliki bidang "id" yang kosong.

Saya telah mencoba kueri ini, tetapi tidak berhasil:

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

Apakah ada cara untuk mengkueri bidang kosong?

Terima kasih

Jawaban:


144

Coba ini:

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

7
Meskipun halaman SolrQuerySyntax mengatakan -id: [* TO *], hanya -id: ["" TO *] yang bekerja untuk saya di solr 1.4.
Jonathan Tran

1
@ user2043553 Tidak, jika ?q=-id:*Anda mendapatkanCannot parse '-q:*': '*' or '?' not allowed as first character in WildcardQuery
Yzmir Ramirez

1
@YzmirRamirez Saya sudah mencoba dengan contoh Solr 4.5.1 dan ?q=-id:*tampaknya berfungsi seperti yang diharapkan. Mungkin kesalahan penguraian terkait dengan masalah ini .
pengguna2043553

Maaf, lupa versinya ... yang Lucene Specification Version: 3.2.0saya gunakan. Senang mereka menambahkan sintaks di Solr 4.5.1.
Yzmir Ramirez

Berhati-hatilah karena sintaks ini tampaknya juga mengembalikan baris yang nilai bidangnya dimulai dengan spasi (dalam Solr 4.3)
metatechbe

89

Satu peringatan! Jika Anda ingin menulis ini melalui ATAU atau DAN Anda tidak dapat menggunakannya dalam formulir ini:

-myfield:*

tetapi Anda harus menggunakan

(*:* NOT myfield:*)

Formulir ini dapat disusun dengan sempurna. Rupanya SOLR akan memperluas formulir pertama ke yang kedua, tetapi hanya jika itu adalah node teratas. Semoga ini menghemat waktu Anda!


2
Jawaban ini layak mendapatkan lebih banyak poin daripada yang sebenarnya dimilikinya. Anda menghemat banyak waktu kami!
Zac

+1 di sini juga. Saya menerapkan opsi lain tetapi saya harus memasukkannya ke dalam fq = daripada q = dan juga harus menerapkan OR untuk memeriksa apakah bidang kosong ATAU memiliki nilai tertentu. Ini adalah satu-satunya opsi yang berfungsi untuk kasus penggunaan tersebut.
Pixelmixer

Saya setuju ini harus menjadi jawaban yang diterima untuk pertanyaan
mengotak

Kau menyelamatkanku dari sakit kepala. Saya tidak yakin terima kasih sudah cukup.
Camway


11

Jika Anda memiliki indeks yang besar, Anda harus menggunakan nilai default

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

dan kemudian menanyakan nilai default ini. Ini jauh lebih efisien daripada q = -id: ["" TO *]


Apakah ini hanya berfungsi untuk bidang bertipe String? Bagaimana Anda melakukannya untuk boolean?
Jared

Saya kira, itu harus bekerja dengan cara yang sama. Tapi saya tidak pernah memeriksanya.
Matthias M


1

Jika Anda menggunakan SolrSharp, itu tidak mendukung pertanyaan negatif.

Anda perlu mengubah QueryParameter.cs (Buat parameter baru)

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; }
}

Dan di kelas QueryParameterCollection.cs, toString () override, terlihat jika parameter Negatif benar

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

Saat Anda memanggil pembuat parameter, jika nilainya negatif. Ubah propertie secara sederhana

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.