【发布时间】:2013-06-03 22:11:13
【问题描述】:
我在 Lucene.Net 中做了一个过滤器来限制搜索的结果。我遇到了一个非常奇怪的问题。过滤器不适用于文本值,而是处理数字值。
例如:
如果我正在制作一个带有数字值的过滤器,如下所示。它运行良好。
String field = "id";
Filter LE= new QueryWrapperFilter(new TermQuery( new Term(field, "1234567")));
indexSearcher.Search(QueryMaker(searchString, searchfields), LE, coll);
但是,如果我给出一个包含 Text 的值
String field = "id";
Filter LE = new QueryWrapperFilter(new TermQuery(new Term(field, "ZZZOCB9X9Y")));
indexSearcher.Search(QueryMaker(searchString, searchfields), LE, coll);
它失败了。结果没有显示任何记录。
谁能解释一下这个问题。此外,我已经对其进行了多次测试以提出此要求。我在一些论坛上读到 Lucene 版本低于 3 的 Term Query 可能会有这个问题。但是,我已将版本更改为 3.0.3,但错误仍然存在。我非常需要程序中的过滤器才能工作。否则我将不得不离开 Lucene 并寻找其他东西。
【问题讨论】:
-
我也尝试了所有其他过滤器。甚至布尔过滤器。它根本不适用于文本值。
-
索引内容时使用的是哪个
Analyzer?可能是您使用的那个没有像您期望的那样生成标记(例如,将文本转换为小写)。另外,您为什么使用 QueryMaker?我认为像String field = "id"; indexSearcher.search(new TermQuery(new Term(field, "ZZZOCB9X9Y")));这样更简单的东西也可以,虽然我不使用 Lucene.net,只使用 Lucene Core (Java)。 -
如果可以避免,则不应使用过滤器,因为查询会提供更好的性能,如shown here。此外,使用
TermQuery将向Lucene 发送原始值,需要它按字面意思匹配。你可以试试QueryParser吗? -
另外,如果您的问题没有得到足够的关注,您应该考虑添加Bounty。
-
感谢您来到这里。我正在使用标准分析器。标准分析器会区分文本值吗?此外,如您所见,我的值是文本和数字值的组合。 QueryMaker 是一种在搜索值后返回权重的方法。另外,我的问题是过滤器不是搜索器。
标签: c# lucene lucene.net