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

Eric Wilson
sumber

Jawaban:

144

Coba ini:

?q=-id:["" TO *]
netcoder
sumber
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!

KK1402
sumber
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 *]

Matthias M
sumber
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
2

Anda juga bisa menggunakannya seperti ini.

fq=!id:['' TO *]
pengguna1976546
sumber
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));
Adriano Galesso Alves
sumber
1

Anda dapat melakukannya dengan kueri filter q = *: * & fq = -id: *

Nimrod Cohen
sumber