【问题标题】:Find all Lucene documents having a certain field查找所有具有特定字段的 Lucene 文档
【发布时间】:2010-09-14 14:54:36
【问题描述】:

我想在索引中查找具有特定字段的所有文档,而不管该字段的值。尽可能使用查询语言,而不是 API。

有办法吗?

【问题讨论】:

    标签: lucene


    【解决方案1】:

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

    new ConstantScoreQuery(new FieldValueFilter("field"))
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 这应该可以。如果该字段的值以数字或大写字母开头,它会稍微复杂一些。使用 OR 查询应该很容易做到。
      • 好点!但是如果它以大写字母开头,则以 a* 开头的范围应该捕获它,因为 TermRangeQuery 的 javadoc 声明它使用 String.compareTo 来确定字符串是否是范围的一部分。
      • 这看起来不错。不确定是否要捕获以数字开头的记录,但这是一个好的开始。谢谢!
      • 字符串的字典顺序在字母之前定义数字,因此范围 [0* TO z*] 将捕获所有以字母和数字开头的值。并且大写字母出现在小写字母之前(与我在之前的评论中所说的相反)。不要忘记检查您的值是如何被索引的:它们可能都是小写的!
      • 根据stackoverflow.com/questions/2686033/… 字段:[* TO *] 也可以,但是您可能必须在QueryParser 上启用SetAllowLeadingWildcard
      【解决方案3】:

      我做了一些实验,似乎最简单的方法是创建一个QueryParser 并调用SetAllowLeadingWildcard( true ) 并搜索field:*,如下所示:

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

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

      我不能保证这种方法相对于其他方法的效率如何,但作为我能找到的最简单的方法,我希望它至少与 field:[* TO *] 一样有效,并且它避免了像 @ 这样的黑客行为987654330@,可能无法考虑所有可能的值,例如以非字母数字字符开头的值。

      【讨论】:

        猜你喜欢
        • 2021-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-21
        • 2015-08-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多