查找具有特定字段的所有Lucene文档

查找具有特定字段的所有Lucene文档,lucene,Lucene,我希望在索引中查找所有具有某个字段的文档,而不考虑该字段的值。如果可能,请使用查询语言,而不是API 有办法吗?如果您知道字段中存储的数据类型,可以尝试范围查询。例如,如果您的字段包含字符串数据,像字段:[a*到z*]这样的查询将返回该字段中有字符串值的所有文档。我做了一些实验,实现这一点的最简单方法似乎是创建QueryParser并调用setAllowReadingWildcard(true)并搜索字段:如下: var qp = new QueryParser( Lucene.Net.Util

我希望在索引中查找所有具有某个字段的文档,而不考虑该字段的值。如果可能,请使用查询语言,而不是API


有办法吗?

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

我做了一些实验,实现这一点的最简单方法似乎是创建
QueryParser
并调用
setAllowReadingWildcard(true)
并搜索
字段:
如下:

var qp = new QueryParser( Lucene.Net.Util.Version.LUCENE_29, field, analyzer );
qp.SetAllowLeadingWildcard( true );
var query = qp.Parse( "*" ) );
(注意,我正在将
QueryParser
的默认字段设置为其构造函数中的
字段
,因此只在
Parse()中搜索
“*”


我无法保证这种方法比其他方法的效率有多高,但作为我能找到的最简单的方法,我希望它至少和
字段:[*到*]
一样有效,并且它避免了像
字段:[0*到z*]
这样的黑客行为,这可能无法解释所有可能的值,例如以非字母数字字符开头的值。

另一种解决方案是使用带有FieldValueFilter的ConstantCoreQuery

new ConstantScoreQuery(new FieldValueFilter("field"))

这应该行得通。如果字段中的值以数字或大写字母开头,则会稍微复杂一些。使用OR查询应该很容易。很好!但是如果它以大写字母开头,那么以*开头的范围应该会捕获它,因为TermRangeQuery的javadoc声明它使用String.compareTo来确定字符串是否是范围的一部分。这看起来不错。不确定是否要捕获以数字开头的记录,但这是一个好的开始。谢谢字符串的字典顺序定义字母之前的数字,因此[0*到z*]范围将捕获以字母和数字开头的所有值。大写字母出现在小写之前(与我之前的评论相反)。别忘了检查你的值是如何被索引的:它们可能都是小写的!根据字段:[*到*]也可以工作,但是您可能必须在
QueryParser
上启用
setAllowReadingWildcard