我剛剛開始使用Lucene,我覺得我必須對它有一個基本的誤解,但是從樣本和文檔中我找不到這個問題。在Lucene中搜索TokenStream字段
我似乎無法讓Lucene返回使用TokenStream
初始化的字段的結果,而使用string
初始化的字段正常工作。我正在使用Lucene.NET 2.9.2 RC2。
[編輯]我也試過用最新的Java版本(3.0.3),並看到相同的行爲,所以它不是一些怪異的端口。
這是一個基本的例子:
Directory index = new RAMDirectory();
Document doc = new Document();
doc.Add(new Field("fieldName", new StandardTokenizer(new StringReader("Field Value Goes Here"))));
IndexWriter iw = new IndexWriter(index, new StandardAnalyzer());
iw.AddDocument(doc);
iw.Commit();
iw.Close();
Query q = new QueryParser("fieldName", new StandardAnalyzer()).Parse("value");
IndexSearcher searcher = new IndexSearcher(index, true);
Console.WriteLine(searcher.Search(q).Length());
(我知道這與使用2.9棄用的API,但是這只是爲了簡潔...假裝指定版本的論點在那裏,我用的一個新的Search
s)。
這不會返回任何結果。
不過,如果我更換與
doc.Add(new Field("fieldName", "Field Value Goes Here", Field.Store.NO, Field.Index.ANALYZED));
則該查詢返回的命中增加的領域,如我所期望的線路。如果我使用TextReader
版本,它也可以。
這兩個領域的索引和標記,與(我認爲)相同的標記器/分析器(我也試過其他人),並且都不存儲,所以我的直覺是,他們應該表現相同。我錯過了什麼?
不僅如此,StandardAnalyzer還可以通過StopFilter過濾掉常見的英語StopWords。使用Lucene的經驗法則是在兩側使用完全相同的TokenStream設置進行搜索和索引。在你的代碼中,你不應該直接實例化StandardTokenizer,而是使用StandardAnalyzer.TokenStream()來創建它 –