查询 Lucene.NET 索引中是否有字段(无论其内容)的文档的最佳方法?
The best way to query the Lucene.NET index for documents HAVING or not a field (no matter it's content)?
我使用的是 Lucene.NET 4.8 的最新(测试版)版本。
我有一个非常棘手的访问系统,我需要我的搜索引擎尊重它。因此,我需要通过有或没有字段的文档来过滤我的搜索查询。有问题的字段是一个“标签”字段(也就是一个文档可以有多个这样的字段),如果没有分配“标签”字段,我们认为文档是“私有的”。所以我事先不知道那个字段会有什么内容。
到目前为止我找到的唯一方法是使用:
var filterQuery = new WildcardQuery(new Term("tag", "?*"));
虽然使用匹配至少一个符号的通配符查询在我看来有点矫枉过正 - 即使它实际上看起来工作得很好。
有没有不重新索引和引入新字段的更好的解决方案?
我认为您希望能够根据文档是否具有字段进行过滤。我不相信这个功能存在于 Lucene 中。我以前在 Whosebug 上看到过这个问题。
在 Lucene 中,字段指向术语列表,术语指向文档列表。因此,查找不在字段的任何术语列表中的文档并不是 Lucene 真正设计的目的。
更好的方法是添加另一个所有文档都有的字段,并根据相关字段是否存在将其设置为 true 或 false。然后对该字段进行查询,可能与其他字段结合使用。对于后者,您可以使用 BooleanQuery
.
无论如何,这是我的看法。希望对你有帮助。
我使用的是 Lucene.NET 4.8 的最新(测试版)版本。
我有一个非常棘手的访问系统,我需要我的搜索引擎尊重它。因此,我需要通过有或没有字段的文档来过滤我的搜索查询。有问题的字段是一个“标签”字段(也就是一个文档可以有多个这样的字段),如果没有分配“标签”字段,我们认为文档是“私有的”。所以我事先不知道那个字段会有什么内容。
到目前为止我找到的唯一方法是使用:
var filterQuery = new WildcardQuery(new Term("tag", "?*"));
虽然使用匹配至少一个符号的通配符查询在我看来有点矫枉过正 - 即使它实际上看起来工作得很好。
有没有不重新索引和引入新字段的更好的解决方案?
我认为您希望能够根据文档是否具有字段进行过滤。我不相信这个功能存在于 Lucene 中。我以前在 Whosebug 上看到过这个问题。
在 Lucene 中,字段指向术语列表,术语指向文档列表。因此,查找不在字段的任何术语列表中的文档并不是 Lucene 真正设计的目的。
更好的方法是添加另一个所有文档都有的字段,并根据相关字段是否存在将其设置为 true 或 false。然后对该字段进行查询,可能与其他字段结合使用。对于后者,您可以使用 BooleanQuery
.
无论如何,这是我的看法。希望对你有帮助。