0

lucene.Netにデータを保存しています。複数のフィールドを持つドキュメントを追加します。

var doc = new Document();

doc.Add(new Field("CreationDate", dt, Field.Store.YES, Field.Index.ANALYZED));
doc.Add(new Field("FileName", path, Field.Store.YES, Field.Index.ANALYZED));
doc.Add(new Field("Directory", dtpath, Field.Store.YES, Field.Index.NOT_ANALYZED));
doc.Add(new Field("Text", text.ToString(), Field.Store.YES, Field.Index.ANALYZED));
...
writer.AddDocument(doc);

すべてのアイテムを移動して、各ドキュメントのフィールド「CreationDate」と「Directory」を返します。ただし、用語は1つのフィールドしか除外できません。

var termEnum = reader.Terms(new Term( "CreationDate"));

2つのフィールドを返すようにするにはどうすればよいですか?

ありがとうマーティン

4

2 に答える 2

1

検索結果を反復処理するときは、ドキュメントを読み取り、そこから値を読み込みます。

int docId = hits[i].doc;  
Document doc = searcher.Doc(docId); 
String creationDate = doc.Get("CreationDate");
String directory = doc.get("Directory");
// ...and so on
于 2012-11-27T12:58:02.987 に答える
0

次の方法で、特定の用語を含むすべてのドキュメントの列挙を取得できます。

var termDocEnum = reader.TermDocs(new Term("CreationDate"));

その列挙を使用して、docId を使用してドキュメントを取得できます。

Document doc = searcher.doc(termDocEnum.doc);

これにより、ドキュメント APIを使用して探している情報を簡単に取得できるようになります。

前に示唆したように、これは指定された用語に指定された値を持つドキュメントのみを取得することに注意してください! それが問題である場合は、関連する引数ごとに TermDocs を 1 回呼び出し、必要に応じてセットをマージする (docId でインデックス付けされたハッシュ テーブルなどで十分に簡単に実行できます) か、引数なしで TermDocs を呼び出し、seekを使用できます。適切な条件を見つけます (必要に応じて、マージは手動で行う必要があります)。

「terms」メソッドから渡された TermEnum は、docId を提供しません (enum 内の各用語でそれらを取得するには、termDocs メソッドを使用する必要があると思います)。

于 2012-11-27T17:18:21.080 に答える