在Lucene中搜索TokenStream字段

时间:2011-03-01 00:06:43

标签: c# .net lucene lucene.net

我刚刚开始使用Lucene,我觉得我必须对它有一个基本的误解,但从样本和文档中我无法弄清楚这个问题。

我似乎无法让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之一。)

这不会返回任何结果。

但是,如果我用

替换添加字段的行
doc.Add(new Field("fieldName", "Field Value Goes Here", Field.Store.NO, Field.Index.ANALYZED));

然后查询返回命中,正如我所料。如果我使用TextReader版本,它也可以。

这两个字段都被索引和标记化,我认为它们是相同的标记器/分析器(我也尝试过其他字段),并且都没有存储,所以我的直觉是它们的行为应该相同。我错过了什么?

1 个答案:

答案 0 :(得分:1)

我发现答案是套管。

StandardAnalyzer创建的令牌流有LowerCaseFilter,而直接创建StandardTokenizer则不会应用此类过滤器。