2

この番号抽出の問題があります。特定の番号を含まないすべての一致を取得したい例: 125501874、125001873 位置 2 で 55 のすべての番号は考慮されません。

最初の数字の範囲は 0 ~ 9 で、2 番目の数字の範囲は 1 ~ 9 なので、実際の範囲は [01 ~ 99] です (最初の 2 つの数字として 00 を使用することはできません)。

Lucene では、NOT フィールドを追加したかった:[01-99]55*

しかし、うまくいかないようです。??55* を検索して無視する簡単な方法はありますか ("NOT フィールド:[01-99]55*")?

ルセン先生ありがとう

4

2 に答える 2

4

Lucene は、3 桁目と 4 桁目のみを含む「インデックスのみ」のフィールドを作成すると、これを非常に効率的に行うことができます。完全な値は、元のフィールドに「保存」できます (または、他のクエリが整数を使用する場合は、保存してインデックスを作成できます)。


更新:フォローアップのコメントで、「2 桁目だけに一時インデックスを作成する方法はありますか?」という質問がありました。

インデックスのParallelReaderフィールドを「垂直に分割」します。1 つのパーティションは現在のインデックスとそのフィールドを保持でき、もう 1 つのパーティションは新しいフィールドを含む一時インデックスであり、おそらくRAMDirectory.

数値が元のインデックスに「格納」されていると仮定すると、元のインデックスの各ドキュメントを反復処理し、格納されているフィールドを取得し、キーの数字を解析してDocument、新しいフィールドを使用して一時インデックスに a を追加します。ドキュメントに記載されているようParallelReaderに、両方のインデックスでドキュメント番号が一致している必要があります。

于 2009-04-20T18:01:18.497 に答える
2

エリクソンに感謝します。一時インデックスを使用できる場合にのみParallelReaderを使用して、検索クエリをキャッシュするため、ソリューションはおそらく最良です。後でそれらが必要になります。

しかし、前に言ったように、関連する数字のインデックスから始めたほうがよいでしょう。

別の解決策があります。

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

これは、私が行っている検索には十分効率的であり、最初の文字のワイルドカード制限をバイパスします。チェックする桁が多い場合や、先頭から遠い場合は使用しません。今、私はこれを数百万行でテストしており、私たちのニーズにはかなり効率的です。

于 2009-04-24T13:30:10.630 に答える