I've punya aplikasi melakukan awalan pencarian untuk sementara waktu. Baru-baru ini indeks ukuran meningkat dan ternyata bahwa beberapa awalan yang terlalu terkutuk banyak untuk lucene untuk menangani. Itu terus melemparkan saya Terlalu Banyak Klausul kesalahan, yang sangat frustasi karena saya terus melihat Botol dan mengkonfirmasikan bahwa tidak ada termasuk kode benar-benar digunakan boolean query.
Mengapa doesn't itu melemparkan sesuatu seperti Terlalu Banyak Adalah pengecualian? Dan mengapa tidak meningkatkan boolean query's statis max klausa bilangan bulat benar-benar membuat kesalahan ini pergi, ketika saya'm pasti hanya menggunakan awalan query? Apakah ada sesuatu yang mendasar bagaimana query dijalankan bahwa saya'm tidak memahami; mereka diam-diam menjadi Boolean query?
I've hit ini sebelumnya. Itu ada hubungannya dengan fakta bahwa lucene, di bawah selimut, ternyata banyak (semua?) hal-hal yang menjadi boolean query ketika anda memanggil Query.rewrite()
public Query rewrite(IndexReader reader)
throws IOException
Expert: called to re-write queries into primitive queries.
For example, a PrefixQuery will be rewritten into a
BooleanQuery that consists of TermQuerys.
Throws:
IOException
API halaman referensi dari TooManyClauses menunjukkan bahwa PrefixQuery, FuzzyQuery, WildcardQuery, dan RangeQuery diperluas dengan cara ini (ke BooleanQuery). Karena dalam referensi API, itu harus menjadi perilaku yang pengguna dapat mengandalkan. Lucene tidak sewenang-wenang batas pada jumlah hits (lain dari dokumen ID yang int) jadi "terlalu banyak hits" pengecualian mungkin tidak masuk akal. Mungkin PrefixQuery.rewrite(IndexReader) harus menangkap TooManyClauses dan membuang "terlalu banyak prefiks" pengecualian, tapi sekarang tidak berperilaku seperti itu.
By the way, cara lain untuk melakukan pencarian berdasarkan prefix adalah dengan menggunakan PrefixFilter. Baik filter permintaan anda dengan itu atau bungkus filter dengan ConstantScoreQuery.
Ketika menjalankan sebuah awalan query, Lucene pencarian untuk semua hal dalam "kamus" yang sesuai permintaan. Jika lebih dari 1024 (by default) pertandingan, TooManyClauses-Pengecualian dilemparkan.
Anda dapat menghubungi BooleanQuery.setMaxClauseCount untuk meningkatkan jumlah maksimum klausul yang diizinkan per BooleanQuery.