2016-03-21 9 views
1

LuceneがFieldsで提供するreaderValue()を使用してフィールドのインデックスを作成しようとしました。事は、用語が索引付けされていないということです。これは、コードの興味深い部分である:インデックスフィールドの使用:new TextField(String fieldName、Reader reader)

IndexWriterConfig config = new IndexWriterConfig(new SimpleAnalyzer()); 
IndexWriter indexWriter = new IndexWriter(directory, config); 
indexWriter.deleteAll(); 
String str = "Some random text to be indexed"; 
Reader reader = new StringReader(str); 
Document doc = new Document(); 
doc.add(new TextField("content", reader));   
indexWriter.addDocument(doc); 

、I指数は、他のTextFieldのコンストラクタを持つ文字列として、それが正常に動作しているテキストが、ときに私のようにそれは、インデックスの用語は、代わりにnullを返していない場合検索した後、フィールドの値を取得しよう:

QueryParser queryParser = new QueryParser("content", new SimpleAnalyzer()); 
Query query = queryParser.parse(text); 
TopDocs topDocs = indexSearcher.search(query,10); 
for (ScoreDoc scoreDoc : topDocs.scoreDocs) {   
    Document document = indexSearcher.doc(scoreDoc.doc); 
    Reader r = document.getField("content").readerValue(); 

私は実際には問題を見ることができない、多分それは私が逃したいくつかのダムの事である、または多分私はそれが間違って使っていますか?助けを前にありがとう。

答えて

2

デフォルトでは、TextFieldは保存されません。表示されている動作は、保存されていないフィールドが必要です。検索はできますが、索引からは検索できません。フィールドの内容の文字列引数を取るコンストラクタでは、フィールドを格納するかどうかを設定できるため、異なる動作が可能です。

保存オプションがコンストラクタで利用できない理由は、Luceneが格納されたフィールドをReaderまたはTokenStreamの値で明示的に設定できないことです。フィールドを保存する場合は、Readerから文字列値を取得するだけで済みます。