Lucene の QueryParser をアプリケーションの検索に統合しました。いくつかの比較演算子も実行する必要がある stringField があります。
例: 年齢>3 年齢<4
しかし、フィールドを Int にすることはできません。「NIL」、「Undefined」などの文字列値が含まれることがあるためです。
とにかく、同じフィールドに複数のタイプを適用する方法はありますか?それとも、stringField 自体に比較演算子を適用することは可能ですか? 助けてください。
Lucene の QueryParser をアプリケーションの検索に統合しました。いくつかの比較演算子も実行する必要がある stringField があります。
例: 年齢>3 年齢<4
しかし、フィールドを Int にすることはできません。「NIL」、「Undefined」などの文字列値が含まれることがあるためです。
とにかく、同じフィールドに複数のタイプを適用する方法はありますか?それとも、stringField 自体に比較演算子を適用することは可能ですか? 助けてください。
範囲クエリを使用:
String 型でも動作します。
参照: 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
また、柔軟なクエリ パーサーを確認することもできます。