4

Nest を使用してネストされたオブジェクトをクエリする必要がありますが、クエリは動的に構築されています。以下は、ネストされた「本」に対してクエリを静的に使用する方法を示すコードです。

QueryContainer qry;
         qry = new QueryStringQuery()
         {
             DefaultField = "name",
             DefaultOperator = Operator.And,
             Query = "salman"
         };

         QueryContainer qry1 = null;

         qry1 = new RangeQuery() // used to search for range ( from , to)
         {
             Field = "modified",
             GreaterThanOrEqualTo = Convert.ToDateTime("21/12/2015").ToString("dd/MM/yyyy"),
         };

         QueryContainer all = qry && qry1;

            var results = elastic.Search<Document>(s => s
               .Query(q => q
                    .Bool(qb => qb
                        .Must(all)))
                .Filter(f =>
                        f.Nested(n => n
                             .Path("books")
                                .Filter(f3 => f3.And(
                                            f1 => f1.Term("book.isbn", "122"),
                                            f2 => f2.Term("book.author", "X"))

                                        )
                                )
                        )   

                );

問題は、動的な方法で「本」の複数のクエリを (And、OR 演算子を使用して) 組み合わせる必要があることです。たとえば、次の一連の条件を満たす本を取得します。

  1. 条件1:著者「X」、ISBN「1」の本
  2. 条件 2: 著者が「X」で、ISBN が「2」の書籍
  3. 条件3:著者「Z」、ISBN「3」の本
  4. その他の条件: .....

ここで、ネストされたクエリのフィルターは、次の場合に書籍を取得する必要があります:
条件 1 AND条件 2または条件 3

次の属性を含むクラス名 FilterOptions があるとします。

  1. フィールド名
  2. 価値
  3. 演算子 (次のフィルターを結合します)

指定された FilterOptions 配列をループして、クエリを作成します。

質問:

ネストされたクエリを作成するには何を使用すればよいですか? それは FilterDeciptor ですか?それらを組み合わせる方法は、ネストされたクエリを検索メソッドに追加しますか?

貴重なリンクや例をお勧めしてください。

4

2 に答える 2

12

最初の 2 つの条件は矛盾しているようで、AND を一緒に使用すると機能しません。それを無視して、これが私の解決策です。私はあなたが持っている 3 つの特定の条件以上を可能にするような方法でこれを実装しました。bool私も、ステートメントに適していると感じています。

QueryContainer andQuery = null;
QueryContainer orQuery = null;
foreach(var authorFilter in FilterOptions.Where(f=>f.Operator==Operator.And))
{
    andQuery &= new TermQuery
    {
        Field = authorFilter.FieldName,
        Value = authorFilter.Value
    };
}
foreach(var authorFilter in FilterOptions.Where(f=>f.Operator==Operator.Or))
{
    orQuery |= new TermQuery
    {
        Field = authorFilter.FieldName,
        Value = authorFilter.Value
    };
}

その後、.Nested呼び出しに次のように入力します。

.Path("books")
    .Query(q=>q
        .Bool(bq=>bq
            .Must(m=>m.MatchAll() && andQuery)
            .Should(orQuery)
    ))
于 2016-01-04T16:37:30.693 に答える