1

Elastic4s で動的クエリを作成したいと思います。

2 つのフィールド (fieldA と fieldB) を持つ myRequest というリクエスト オブジェクトがあります。

実際、私は次のようにクエリを作成します:

val req =
      search in indexName -> indexType query {
        bool {
          should(
            matchQuery("fieldA", myRequest.fieldA.getOrElse("")),
            matchQuery("fieldB", myRequest.fieldA.getOrElse("")),

          )
        }
      }

しかし、私がしたいのは、fieldAが空の場合、クエリにmatchQueryが追加されないことです

ご協力いただきありがとうございます

hbelahc。

4

1 に答える 1

5

flatten を使用して、すべてのサブクエリを含むリストを作成できます。これは、説明するための非常に詳細なコードです。

val fieldA: Option[String] = ...
val fieldB: Option[String] = ...
val shouldA: Option[QueryDefinition] = fieldA.map(a => matchQuery("fieldA", a))
val shouldB: Option[QueryDefinition] = fieldB.map(b => matchQuery("fieldB", b))
val req =
  search in indexName -> indexType query {
    bool {
      should(Seq(shouldA, shouldB).flatten: _*)
    }
  }

型注釈に注意してください_*: 引数のリストをアンパックする必要があります。一般的に言えば、それぞれが T 型のパラメータの可変長リストを持つメソッドを呼び出すときはいつでも、Seq[T]を使用してアンパックできます: T*。便宜上、_*代わりに言うと、コンパイラが型を推測します。

したがって、簡潔な方法は次のとおりです。

def search(maybeA: Option[String], maybeB: Option[String]) = 
  search in indexName -> indexType query {
    bool {
      should(
        Seq(
          maybeA.map(a => matchQuery("fieldA", a),
          maybeB.map(b => matchQuery("fieldB", b)
        ).flatten: _*
      )
    }
  }
于 2015-09-04T11:15:46.613 に答える