2

Lucene の QueryParser をアプリケーションの検索に統合しました。いくつかの比較演算子も実行する必要がある stringField があります。

例: 年齢>3 年齢<4

しかし、フィールドを Int にすることはできません。「NIL」、「Undefined」などの文字列値が含まれることがあるためです。

とにかく、同じフィールドに複数のタイプを適用する方法はありますか?それとも、stringField 自体に比較演算子を適用することは可能ですか? 助けてください。

4

2 に答える 2

2

範囲クエリを使用:

  • age:[3 TO 5] 3歳以上5歳以下に相当
  • age:[3 TO *] age > 3 に相当

String 型でも動作します。
参照: 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 に答える