1

タイトルのように、困惑した問題に遭遇しました。テストプログラムのインデックスを作成し、IndexWriterを使用してドキュメントをインデックスに追加します。コードは:

IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_CURRENT, analyzer);
IndexWriter iwriter = new IndexWriter(directory, config);
Document doc1 = new Document();
doc1.add(new Field("name", "张三", Field.Store.YES, Field.Index.ANALYZED));
doc1.add(new IntField("year", 2013, Field.Store.YES));
doc1.add(new TextField("content", "123456789", Field.Store.YES));
iwriter.addDocument(doc1);
iwriter.commit();
iwriter.close();

このインデックスで検索しようとすると、このドキュメントを取得できません。私は本当に正しい結果カウントを取得します、それは以前より1つ多くなっています。しかし、doc.get('name')を出力しようとすると、出力が間違っています。

検索部分のコードは次のとおりです。

DirectoryReader ireader = DirectoryReader.open(directory);
System.out.println(ireader.numDeletedDocs());
IndexSearcher isearcher = new IndexSearcher(ireader);
// Parse a simple query that searches for "text":
QueryParser parser = new QueryParser(Version.LUCENE_CURRENT, "name", analyzer);
Query query = parser.parse("张");

ScoreDoc[] hits = isearcher.search(query, null, 1000).scoreDocs;
System.out.println(hits.length);

結果として、「名前:李四」があります。インデックス作成と検索の際には、必ずStandardAnalyzerを使用しています。また、StandardAnalyzerは、1つの漢字を1つのトークンとして作成します。「张」を検索すると「李四」が表示されるのはなぜですか?ドキュメントを追加するときに何か問題がありますか?または、docidが不一致ですか?

4

1 に答える 1

0

ドキュメントを追加した後、インデックスを(再)開きましたか?Lucene検索では、検索用にインデックスが開かれた時点で存在していたドキュメントのみが返されます。

[編集...]

IndexReader.Open()またはIndexReader.doOpenIfChanged()を使用して、インデックスを再度開きます。doOpenIfChanged()には、古いIndexReaderインスタンスを引き続き使用できる場合(インデックスが変更されていないため)、nullを返すという利点があります。

(正しく思い出せば、DirectoryReader.Open()はインデックスディレクトリを開くだけなので、 DirectoryReader.Openを呼び出すだけでは、上位レベルのLuceneコードはインデックスが変更されたことを認識しません。)

于 2013-03-05T22:29:14.070 に答える