1

apache lucene を使用して、ログ ファイルのテキスト検索アプリケーションを作成しています。次のコードを使用してファイルのインデックスを作成しています

doc.add(new LongField("modified", file.lastModified(), Field.Store.NO));
doc.add(new TextField("contents", new BufferedReader(new InputStreamReader(fis, "UTF-8"))));
doc.add(new StoredField("filename", file.getCanonicalPath()));

ここでは、ファイルごとに 3 つのインデックスを作成していますが、検索すると、1 つのインデックスの値しか取得できず、他の 2 つが null になります。これは検索側のコードです

Document d = searcher.doc(docId);
System.out.println(i+":File name is"+d.get("filename"));
System.out.println(i+":File name is"+d.get("modified"));
System.out.println(i+":File name is"+d.get("contents"));

私が得ている出力は

2 total matching documents
0:File name is/home/maclean/NetBeansProjects/LogSearchEngine/src/SimpleSearcher.java
0:File name isnull
0:File name isnull
1:File name is/home/maclean/NetBeansProjects/LogSearchEngine/src/SimpleFileIndexer.java
1:File name isnull
1:File name isnull   

私は何を間違っていますか

4

1 に答える 1

2

Lucene では、フィールドの値を取得する場合、そのフィールドを保存する必要があります。フィールドが保存されていない場合、検索時にその値は になりますnull

の場合、引数;modifiedを渡すことにより、保存されていないフィールドとして明示的に指定しました。Field.Store.NOその結果、その値はインデックスに格納されていないため、検索時に null が返されます。その値を保存および取得するには、コンストラクター呼び出しを次のように変更する必要があります。

doc.add(new LongField("modified", file.lastModified(), Field.Store.YES));

の場合contents、使用したコンストラクターは格納されていないフィールドを作成します。そのコンストラクターを次のように変更する必要があります。

doc.add(new TextField("contents", new BufferedReader(new InputStreamReader(fis, "UTF-8")), Field.Store.YES));

これらの変更後、両方のフィールドを取得できるはずです。

filenameデフォルトで格納されたフィールドを作成するコンストラクターを使用しているため、値を取得できます。

于 2013-03-08T13:03:34.927 に答える