2

lucene数値範囲クエリをデモしようとしていますが、正しく機能しません。これが私がやろうとしていることです:

public static void main( String[] args ) throws Exception{
    Path indexDir = Files.createTempDirectory("index");
    Directory directory = FSDirectory.open(indexDir.toFile());
    Analyzer analyzer = new EnglishAnalyzer(Version.LUCENE_36);
    IndexWriterConfig writerConfig = new IndexWriterConfig(Version.LUCENE_36, analyzer);
    writerConfig.setOpenMode(IndexWriterConfig.OpenMode.CREATE);
    IndexWriter writer = new IndexWriter(directory, writerConfig);
    for (int i=0; i<100; i++) {
        Document doc = new Document();
        for (int j = 0; j<10; j++) {
            NumericField field = new NumericField("numericField", Field.Store.YES, true);
            field.setDoubleValue(Math.random());
            doc.add(field);
        }
        writer.addDocument(doc);
    }
    writer.close(true);
    directory.close(); //just to be safe

    analyzer = new EnglishAnalyzer(Version.LUCENE_36);
    directory = FSDirectory.open(indexDir.toFile());
    IndexReader reader = IndexReader.open(directory);
    IndexSearcher searcher = new IndexSearcher(reader);
    QueryParser parser = new MultiFieldQueryParser(Version.LUCENE_36, new String[] {"someField", "someOtherField"}, analyzer);
    Query q = parser.parse("numericField:[0 TO 0.5]");
    TopDocs results = searcher.search(q, 100);
    System.out.println("got "+results.scoreDocs.length+" results");
}

基本的に、新しいFSディレクトリを作成し、100個のドキュメントにインデックスを付けます。各ドキュメントには、ランダムな値を持つ10個の数値フィールドがあり、同じ名前で(luceneドキュメントはこれが許可されていると言っていますか?)、範囲クエリを使用してこの新しく作成されたインデックスを検索します。

毎回ほぼ100ヒットになると思いますが、毎回0になります。

私は明らかに何か間違ったことをしているが、何がわからない。手がかり/アイデアは大歓迎です。

java7とlucene3.6.1を使用しているim。このコードをコンパイルするには、luceneコアとluceneアナライザーのアーティファクトが必要です

4

1 に答える 1

2

NumericFieldから:「NumericFieldに対して範囲クエリまたはフィルタリングを実行するには、NumericRangeQueryまたはNumericRangeFilterを使用します。」クエリパーサーは、これが数値フィールドであることをアプリオリに認識していないため、その出力は文字列ベースです。

<TermRangeQuery: numericField:[0 TO 0.5]>

それ以外の:

<NumericRangeQuery: numericField:[0.0 TO 0.5]>

このような問題の解析を回避するために、可能な限りプログラムでクエリを作成することをお勧めします。

于 2012-12-02T20:19:08.620 に答える