将 Lucene 的 QueryParser 集成到我的应用程序的搜索中。我有一个 stringField,我还必须对其执行一些比较运算符。
例如:年龄>3 年龄<4
但我无法将字段设为 Int。因为有时它可能包含字符串值,如“NIL”、“Undefined”等。
那么是否可以将多种类型应用于同一个字段。或者是否可以将比较运算符与 stringField 本身一起应用?请帮忙。
将 Lucene 的 QueryParser 集成到我的应用程序的搜索中。我有一个 stringField,我还必须对其执行一些比较运算符。
例如:年龄>3 年龄<4
但我无法将字段设为 Int。因为有时它可能包含字符串值,如“NIL”、“Undefined”等。
那么是否可以将多种类型应用于同一个字段。或者是否可以将比较运算符与 stringField 本身一起应用?请帮忙。
使用范围查询:
它也适用于字符串类型。
参考: http: //lucene.apache.org/core/2_9_4/queryparsersyntax.html#Range%20Searches
[如果您确实需要该字段的原始值,那么]将原始值
保存在单独的 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
您还可以检查灵活的查询解析器。