【问题标题】:Comparison operators with strings using Lucene使用 Lucene 的字符串比较运算符
【发布时间】:2013-08-23 09:36:26
【问题描述】:

将 Lucene 的 QueryParser 集成到我的应用程序的搜索中。 我有一个 stringField,我还必须对其执行一些比较运算符。

例如:年龄>3 岁

但我无法将字段设为 Int。因为有时它可能包含“NIL”、“未定义”等字符串值。

那么,是否可以将多种类型应用于同一个字段。或者是否可以将比较运算符与 stringField 本身一起应用? 请帮忙。

【问题讨论】:

    标签: java search lucene query-parser


    【解决方案1】:

    使用范围查询:

    • 年龄:[3 TO 5] 相当于 3 到 5 岁(含)之间的年龄
    • age:[3 TO *] 相当于年龄 > 3

    它也适用于字符串类型。
    参考:http://lucene.apache.org/core/2_9_4/queryparsersyntax.html#Range%20Searches

    【讨论】:

    • age:{3 TO 5} 与字符串字段应该匹配,例如,“333”和“499999”,因为字母数字排序。可能不是你想要的。
    【解决方案2】:

    [如果你真的需要该字段的原始值那么]
    将原件保存在单独的 Lucene 字段中,例如“原始时代”。

    附:您似乎可以通过覆盖 getFieldQuery 在某种程度上控制查询解析器。这样,应该可以将文本查询委托给文本字段,同时将数字查询委托给整数字段。 Scala 示例:

    val qp = new org.apache.lucene.queryparser.classic.QueryParser (Version.LUCENE_43, "age", ANALYZER_RUS) {
      override def getFieldQuery (field: String, queryText: String, quoted: Boolean): org.apache.lucene.search.Query = {
        println (s"getFieldQuery ($field, $queryText, $quoted)")
        if (field == "age") {
          if (queryText.matches ("^age(\\>|\\<)\\d+$")) super.getFieldQuery (field, queryText, quoted)
          else super.getFieldQuery ("originalAge", queryText, quoted)
        } else super.getFieldQuery (field, queryText, quoted)
      }
    }
    println (qp.parse ("undefined"))  // originalAge:undefined
    println (qp.parse ("age>3"))  // age:age age:3
    

    您也可以查看flexible query parser。

    【讨论】:

    • 我准备将它们保存在两个单独的字段中(一个 intField 保存整数值,另一个 StringField 保存字符串值,如 nill、undefined 和 all)。但最终用户只会搜索“年龄”。我也可以将搜索映射到“orginalAge”吗? IE。如果用户搜索年龄:未定义 =>(即字符串搜索),则搜索必须针对字段 originalAge age(即整数搜索),则必须针对“年龄”进行搜索
    • 我已经更新了解决“age”到“originalAge”的条件映射的答案。
    猜你喜欢
    • 2017-03-28
    • 2016-10-22
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多