2

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

例如:年龄>3 年龄<4

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

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

4

2 回答 2

2

使用范围查询:

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

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

于 2013-08-21T09:52:10.157 回答
0

[如果您确实需要该字段的原始值,那么]将原始值
保存在单独的 Lucene 字段中,例如“originalAge”。

PS看起来你可以通过覆盖getFieldQuery在一定程度上控制查询解析器。这样,应该可以将文本查询委托给文本字段,同时将数字查询委托给整数字段。斯卡拉示例:

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

您还可以检查灵活的查询解析器

于 2013-08-21T08:50:22.167 回答