1

現在、RamDirectory の Lucene インデックス (v. 4) からすべてのドキュメントを取得しようとしています。

インデックスの作成では、次の addDocument 関数が使用されます。

public void addDocument(int id, String[] values, String[] fields) throws IOException{
    Document doc = new Document();

    doc.add(new IntField("getAll", 1, IntField.TYPE_STORED));    
    doc.add(new IntField("ID", id, IntField.TYPE_STORED));                                              
    for(int i = 0; i < fields.length; i++){
        doc.add(new TextField(fields[i], values[i], Field.Store.NO));
    }

    writer.addDocument(doc);
}

すべてのドキュメントに対してこれを呼び出した後、ライターは閉じられます。ドキュメントに追加された最初のフィールドからわかるように、すべてのドキュメントを簡単に取得できるように「getAll」フィールドを追加しました。私の理解が正しければ、クエリ "getAll:1" はインデックス内のすべてのドキュメントを返すはずです。しかし、そうではありません。そのために次の関数を使用しています。

public List<Integer> getDocIds(int noOfDocs) throws IOException, ParseException{
    List<Integer>   result    = new ArrayList<Integer>(noOfDocs);
    Query           query     = parser.parse("getAll:1");
    ScoreDoc[]      docs      = searcher.search(query, noOfDocs).scoreDocs;

    for(ScoreDoc doc : docs){
        result.add(doc.doc);
    }

    return result;
}

noOfDocs は、索引付けされたドキュメントの数です。もちろん、IndexSearcher を作成するときに同じ RamDirectory を使用しました。解析されたクエリを手動で作成された TermQuery に置き換えても、どちらも役に立ちませんでした。クエリは結果を返しません。

誰かが私のエラーを見つけるのを手伝ってくれることを願っています. ありがとう

4

2 に答える 2

1

たとえば、StringField や TextField ではなく IntField を使用しているため、検索に問題があると思います。IntField およびその他の数値フィールドは、数値範囲のクエリ用に設計されており、生の形式ではインデックスが作成されません。NumericRangeQueryを使用してそれらを検索できます。

ただし、実際には、IntField は、私の考えでは、数字の文字列ではなく、数値にのみ使用する必要があります。これは、あなたが持っているように見えるものです。通常、ID はキーワードまたはテキスト フィールドにする必要があります。

すべてのレコードを取得する限り、フィールドを追加する必要はありません。MatchAllDocsQueryを使用するだけです。

于 2013-01-18T20:31:53.820 に答える
0

まず、 Lukeを実行してインデックスの内容を確認する必要があると思います。

また、*を使用してクエリの最初の文字として許可するとqueryParser.setAllowLeadingWildcard(true);、次のようなクエリでgetAllフィールドID:*を含めなくてもすべてのドキュメントが取得されます。

于 2013-01-18T18:42:56.133 に答える