【问题标题】:Why is filter not working with text/string values in Lucene.Net?为什么过滤器不适用于 Lucene.Net 中的文本/字符串值?
【发布时间】: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


【解决方案1】:

StandardAnalyzer 会将TokenStream 中的所有字符小写。

试试这个:

Filter LE = new QueryWrapperFilter(new TermQuery(new Term(field, "ZZZOCB9X9Y".ToLowerInvariant())));

【讨论】:

  • 像魔术一样工作。哇!!!!非常感谢你。终于解脱了。多么好的答案。再次感谢一吨。很长一段时间以来我都为它而疯狂。如果我想准确地存储我的令牌,我应该使用什么分析器?你会推荐吗?
  • 如果在创建时将 Field.Index 构造函数参数设置为 Field.Index.NOT_ANALYZED,它将按原样进行索引。还有 KeywordAnalyzer() 具有相同的行为。
  • 如果你使用 NOT_ANALYZED,理论上它会更快,尤其是索引,但可能不足以注意到它
猜你喜欢
  • 2021-03-09
  • 2023-03-21
  • 2021-11-06
  • 2013-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-06
  • 1970-01-01
相关资源
最近更新 更多