C# 为什么过滤器不能处理Lucene.Net中的文本/字符串值?
我在Lucene.Net中做了一个过滤器来限制搜索结果。我遇到了一个非常奇怪的问题。过滤器不使用文本值,而是使用数字值 例如: 如果我制作一个带有如下数值的过滤器。它工作得很好C# 为什么过滤器不能处理Lucene.Net中的文本/字符串值?,c#,lucene,lucene.net,C#,Lucene,Lucene.net,我在Lucene.Net中做了一个过滤器来限制搜索结果。我遇到了一个非常奇怪的问题。过滤器不使用文本值,而是使用数字值 例如: 如果我制作一个带有如下数值的过滤器。它工作得很好 String field = "id"; Filter LE= new QueryWrapperFilter(new TermQuery( new Term(field, "1234567"))); indexSearcher.Search(QueryMaker(searchString, searchfields),
String field = "id";
Filter LE= new QueryWrapperFilter(new TermQuery( new Term(field, "1234567")));
indexSearcher.Search(QueryMaker(searchString, searchfields), LE, coll);
但是,如果我给出一个包含文本的值
String field = "id";
Filter LE = new QueryWrapperFilter(new TermQuery(new Term(field, "ZZZOCB9X9Y")));
indexSearcher.Search(QueryMaker(searchString, searchfields), LE, coll);
它正在失败。结果不显示任何记录
谁能给我解释一下这个问题吗。此外,我已经多次测试过它,以证明这一点。我在一些论坛上读到,3以下Lucene版本中的术语查询可能会有这个问题。但是,我已将版本更改为3.0.3,但错误仍然存在。我急需程序中的过滤器才能工作。否则,我将不得不离开Lucene,找到其他东西。
StandardAnalyzer
将把您的令牌流中的所有字符都小写
试试这个:
Filter LE = new QueryWrapperFilter(new TermQuery(new Term(field, "ZZZOCB9X9Y".ToLowerInvariant())));
StandardAnalyzer
将把TokenStream
中的所有字符小写
试试这个:
Filter LE = new QueryWrapperFilter(new TermQuery(new Term(field, "ZZZOCB9X9Y".ToLowerInvariant())));
我也尝试过所有其他过滤器。偶数布尔滤波器。它根本不适用于文本值。为内容编制索引时,您使用的是哪个Analyzer
?这可能是因为您正在使用的标记没有生成您期望的标记(例如,将文本转换为小写)。还有,为什么要使用QueryMaker?我想到了一些更简单的东西,比如stringfield=“id”;搜索(新术语查询(新术语(字段,“ZZZOCB9X9Y”))代码>也可以工作,尽管我不使用Lucene.net,只使用Lucene Core(Java)。如果可以避免的话,就不应该使用过滤器,因为查询会提供更好的性能。此外,使用TermQuery
将发送针对Lucene的原始值,需要它进行字面匹配。你能试试<代码> QueryParser < /代码>吗?同样,你应该考虑添加一个如果你的问题没有得到足够的关注。谢谢你来到这里。我用的是标准分析仪。标准Analyzer是否会显示文本值?此外,正如您所看到的,我的值是文本值和数值的组合。QueryMaker是一种在搜索值后返回权重的方法。另外,我的问题是过滤器而不是搜索器。我也尝试过所有其他过滤器。偶数布尔滤波器。它根本不适用于文本值。为内容编制索引时,您使用的是哪个Analyzer
?这可能是因为您正在使用的标记没有生成您期望的标记(例如,将文本转换为小写)。还有,为什么要使用QueryMaker?我想到了一些更简单的东西,比如stringfield=“id”;搜索(新术语查询(新术语(字段,“ZZZOCB9X9Y”))代码>也可以工作,尽管我不使用Lucene.net,只使用Lucene Core(Java)。如果可以避免的话,就不应该使用过滤器,因为查询会提供更好的性能。此外,使用TermQuery
将发送针对Lucene的原始值,需要它进行字面匹配。你能试试<代码> QueryParser < /代码>吗?同样,你应该考虑添加一个如果你的问题没有得到足够的关注。谢谢你来到这里。我用的是标准分析仪。标准Analyzer是否会显示文本值?此外,正如您所看到的,我的值是文本值和数值的组合。QueryMaker是一种在搜索值后返回权重的方法。另外,我的问题是过滤器,而不是搜索器。工作起来很神奇。哇!非常感谢你。真是松了一口气。多好的回答啊。再次非常感谢。很长一段时间以来,我一直在为它疯狂。如果我想准确地存储我的代币,我应该使用什么分析仪?建议这样做吗?如果在创建字段时将Field.Index构造函数参数设置为Field.Index.NOT_analysis,它将按原样编制索引。还有KeywordAnalyzer()也有相同的行为。如果你使用NOT_analysis,理论上会更快,尤其是在索引方面,但可能还不足以注意到它的神奇功能。哇!非常感谢你。真是松了一口气。多好的回答啊。再次非常感谢。很长一段时间以来,我一直在为它疯狂。如果我想准确地存储我的代币,我应该使用什么分析仪?建议这样做吗?如果在创建字段时将Field.Index构造函数参数设置为Field.Index.NOT_analysis,它将按原样编制索引。还有KeywordAnalyzer()也有相同的行为。如果使用NOT_analysis,理论上会更快,尤其是在索引方面,但可能还不足以注意到它