2011-03-01 126 views
4

我剛剛開始使用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版本,它也可以。

這兩個領域的索引和標記,與(我認爲)相同的標記器/分析器(我也試過其他人),並且都不存儲,所以我的直覺是,他們應該表現相同。我錯過了什麼?

回答

1

我發現答案是套管。

StandardAnalyzer創建的令牌流具有LowerCaseFilter,而直接創建StandardTokenizer不會應用此類過濾器。

+0

不僅如此,StandardAnalyzer還可以通過StopFilter過濾掉常見的英語StopWords。使用Lucene的經驗法則是在兩側使用完全相同的TokenStream設置進行搜索和索引。在你的代碼中,你不應該直接實例化StandardTokenizer,而是使用StandardAnalyzer.TokenStream()來創建它 –