使用Lucene比较运算符和字符串

时间:2013-08-21 06:25:35

标签: java search lucene query-parser

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

例如:年龄> 3岁<4岁

但是我不能把字段设为Int.Because因为有时它可能有字符串值,如“NIL”,“Undefined”等。

所以无论如何都要将多个类型应用于同一个字段。或者可以将比较运算符应用于stringField本身吗? 请帮忙。

2 个答案:

答案 0 :(得分:1)

使用范围查询:

  • 年龄:[3至5]相当于3至5岁(含)的年龄
  • 年龄:相当于年龄的[3 TO *]&gt; 3

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

答案 1 :(得分:0)

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

P.S。看来你可以通过覆盖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