Построение динамического запроса с использованием синтаксиса инициализатора объекта - PullRequest
0 голосов
/ 27 мая 2018

Я использую Nest для запроса Elasticsearch, и я написал этот запрос для своего поиска:

var searchResponse = _elasticClient.Search<AdDocument>(s => s
    .Query(q => q
       .Bool(b => b
          .Must(m => m
             .MultiMatch(mm => mm
                .Fields(f => f.Field(p => p.Title, 1.5).Field(p => p.Description))
                .Query("MyKeyword")
                .Fuzziness(Fuzziness.Auto)
             )
       )
       .Filter(fi => fi
          .Bool(fb => fb
             .Must(m => m.Range(r => r.Field(f => f.NoOfBedrooms == 3)),
                   m => m.Range(r => r.Field(f => f.NoOfBathrooms == 2)),
                   m => m.Range(r => r.Field(f => f.Price > 2000))
             )
          )
       )
    )
  )
);

Что я хочу достичь, это построить этот запрос динамически, в зависимости от фильтров, которые передаются вКак я могу написать этот запрос, используя Object Initializer ?

Например, я хочу создать эти три фильтра диапазона вне запроса и поместить их в 3 объекта, скажем rangeFilter1, rangeFilter2 и rangeFilter3, а затем внутри запроса используйте логические AND (&&) для их объединения.

1 Ответ

0 голосов
/ 05 июня 2018

Это синтаксис инициализатора объекта:

var boolQuery = new BoolQuery
{
  Must = new QueryContainer[]
  {
    new MultiMatchQuery
    {
      Fields = Field<AdDocument>(p => p.Title, 1.5).And<AdDocument>(p => p.Description),
      Query = "MyKeyword",
      Fuzziness = Fuzziness.Auto
    }
  },
  Filter = new QueryContainer[]
  {
    new TermQuery { Field = Field<AdDocument>(f => f.NoOfBedrooms), Value = 3 } &&
    new TermQuery { Field = Field<AdDocument>(f => f.NoOfBathrooms), Value = 2 } &&
    new NumericRangeQuery { Field = Field<AdDocument>(p => p.Price), GreaterThan = 2000 }
  }
};

var searchResponse = _elasticClient.Search<AdDocument>(new SearchRequest<AdDocument>
{
  Query = boolQuery
});

Это приведет к следующему DSL JSON:

{
  "query": {
    "bool": {
      "must": [
        {
          "multi_match": {
            "query": "MyKeyword",
            "fuzziness": "AUTO",
            "fields": [
              "title^1.5",
              "description"
            ]
          }
        }
      ],
      "filter": [
        {
          "bool": {
            "must": [
              {
                "term": {
                  "noOfBedrooms": {
                    "value": 3
                  }
                }
              },
              {
                "term": {
                  "noOfBathrooms": {
                    "value": 2
                  }
                }
              },
              {
                "range": {
                  "price": {
                    "gt": 2000.0
                  }
                }
              }
            ]
          }
        }
      ]
    }
  }
}
...