2009-04-20 15 views
2

この番号の抽出に問題があります。 特定の番号を持たないすべてのマッチを取得したい 例:125501874,125001873 2番の位置にある55個の数字は考慮されません。さLucene番号抽出

最初の数字の範囲は0〜9であり、第二は、1-9であるので、実際の範囲[01-99] (我々は最初の二つの数として00を持つことができません)

のLuceneと私がしたかったですNOTフィールドを追加してください:[01-99] 55 *

しかし、うまくいかないようです。 55 *を見つけて検索でそれを無視する簡単な方法はありますか( "NOT field:[01-99] 55 *")? 1はそれで唯一の第三及び第四の数字と「インデックスのみ」のフィールドを作成した場合

答えて

2

ありがとうericksonありがとうございました。私は一時インデックスを使用することができ、検索クエリをキャッシュするため、後で必要になる場合は、ParallelReaderを使用して解決策が最適です。

しかし、あなたが以前に言ったように、適切な桁のインデックスでより良いスタートをとってください。

私には別の解決策があります。

NOT field:0?55* 
NOT field:1?55* 
... 
NOT field:9?55* 

私がやっている検索には十分効率的で、最初の文字のワイルドカード制限をバイパスします。私は彼らがどこからもっと遠く離れているか、どこから離れていても、それを使用しないだろう。 今、私はこれを100万行でテストしており、私たちのニーズにはかなり効率的です。

+0

はい、それは良い回避策です。フィールドの最初の2文字が常に01-99であることがわかっている場合は、 "NOT field:?? 55 *"を使用できますか? – erickson

+0

私はそれを試しましたが、制限はこれです。 http://lucene.apache .org/java/2_3_2/queryparsersyntax.html#ワイルドカード%20検索 "注:*または?記号を検索の最初の文字として使用することはできません" – Khan

4

Luceneの教祖ありがとうLuceneには、非常に効率的にこれを行うことができます。元のフィールドに完全な値を「格納」する(または、他の照会が整数を使用する場合は、索引付けする)ことができます。


更新:フォローコメントは、「[あり]のみ二桁目に一時索引を作成する方法ですか?」、尋ねました

ParallelReaderを使用すると、インデックスのフィールドが「垂直方向に分割されます」。 1つのパーティションは現行の索引をそのフィールドと共に保持することができ、他方は新しいフィールドを持つ一時索引であり、可能であればRAMDirectoryに格納されます。

数値が元のインデックスに「格納されている」と仮定すると、元のインデックスの各ドキュメントを繰り返し、格納されたフィールドを取り出し、キー数値を解析し、新しいフィールドを使用してDocumentを一時インデックスに追加します。文書番号ParallelReaderでは、両方のインデックスで文書番号が一致することが必須です。

+0

他のインデックスを追加する可能性がありますか? これらの番号には既にインデックスがあります。 2番目の数字だけに一時インデックスを作成する方法はありますか? – Khan

関連する問題