2010-09-14 170 views

回答

5

如果您知道存储在您的字段中的数据的类型,则可以尝试范围查询。根据示例,如果您的字段包含字符串数据,那么像field:[a* TO z*]这样的查询将返回该字段中存在字符串值的所有文档。

+0

这应该工作。如果字段的值以数字或大写字母开头,则会稍微复杂一些。 OR查询应该很容易做到。 – 2010-09-14 16:58:53

+0

好点!但是如果它以大写开头,那么以*开头的范围应该可以捕捉它,因为TermRangeQuery的javadoc声明它使用String.compareTo来确定字符串是否是范围的一部分。 – 2010-09-14 17:13:03

+0

这看起来不错。不知道从数字开始捕捉记录,但这是一个好的开始。谢谢! – 2010-09-14 17:33:55

3

我已经做了一些试验,似乎实现这一目标的最简单的方法是创建一个QueryParser并调用SetAllowLeadingWildcard(true)和搜索field:*像这样:

var qp = new QueryParser(Lucene.Net.Util.Version.LUCENE_29, field, analyzer); 
qp.SetAllowLeadingWildcard(true); 
var query = qp.Parse("*")); 

(请注意我设置默认字段的QueryParserfield在其构造函数中,因此在Parse()中仅搜索"*")。

我不能保证这种方法的效率有多高是其它方法相比,但作为我能找到的最简单的方法,我希望它至少与field:[* TO *]高效,而且避免了不得不做的hackish之类的东西field:[0* TO z*] ,这可能不会考虑所有可能的值,例如以非字母数字字符开头的值。

1

另一种解决方案是使用ConstantScoreQuery与FieldValueFilter

new ConstantScoreQuery(new FieldValueFilter("field")) 
相关问题