c# – 在Lucene中搜索TokenStream字段
发布时间:2020-12-15 21:16:09 所属栏目:百科 来源:网络整理
导读:我刚刚开始使用Lucene,我觉得我必须对它有一个基本的误解,但是从样本和文档中我无法弄清楚这个问题. 我似乎无法让Lucene返回用TokenStream初始化的字段的结果,而用字符串初始化的字段工作正常.我正在使用Lucene.NET 2.9.2 RC2. [编辑]我也尝试使用最新的Java
我刚刚开始使用Lucene,我觉得我必须对它有一个基本的误解,但是从样本和文档中我无法弄清楚这个问题.
我似乎无法让Lucene返回用TokenStream初始化的字段的结果,而用字符串初始化的字段工作正常.我正在使用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,但这仅仅是为了简洁…假装指定版本的参数在那里,我使用了一个新的搜索). 这不会返回任何结果. 但是,如果我替换添加字段的行 doc.Add(new Field("fieldName","Field Value Goes Here",Field.Store.NO,Field.Index.ANALYZED)); 然后查询返回命中,正如我所料.如果我使用TextReader版本,它也有效. 两个字段都被索引和标记化,(我认为)是相同的标记器/分析器(我也尝试过其他字段),并且都没有存储,所以我的直觉是它们的行为应该相同.我错过了什么? 解决方法
我找到了答案是套管.
StandardAnalyzer创建的令牌流具有LowerCaseFilter,而直接创建StandardTokenizer不会应用此类过滤器. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |