Использование SearchBuilder в клиенте NEST ElasticSearch

Мне было интересно, есть ли у кого-нибудь советы или примеры использования API SearchBuilder в NEST. Документов по-прежнему немного.

Я хочу динамически создавать запросы/фильтры на основе критериев, отправленных в параметрах URL. Пример:

www.mydomain.com/things/search?prop1=3&prop2=foo&prop3=bar

И как только я извлеку их, я хочу построить запрос с точным соответствием на основе имеющихся критериев.


person Cork    schedule 02.10.2012    source источник


Ответы (2)


Используя синтаксис запроса DSL, теперь вы можете просто сделать это:

var results = client.Search(s=>s
    .Fields(new string[0])
    .Query(q=>
        q.Term(ESFields.City, city)
        && q.Term(ESFields.State, state)
    )
);

Что зависит от поддержки conditionless query, добавленной в 0.9.10.0.

Это будет отображать запрос города только в том случае, если city содержит значение, и только запрос термина состояния, если state не является нулевым или пустым.

  • Если оба действительны, он выполнит логический запрос
  • Если только один действителен, он будет выполнять только один запрос термина
  • Если ни один из них недействителен, он вернется к запросу match_all.
person Martijn Laarman    schedule 02.12.2012

Вот как я это сделал:

  var boolQuery = QueryFactory.BoolQuery();
  if (!String.IsNullOrEmpty(city)) { boolQuery.Must(QueryFactory.TermQuery(ESFields.City, city)); }
  if (!String.IsNullOrEmpty(state)) { boolQuery.Must(QueryFactory.TermQuery(ESFields.State, state)); }
  //etc. for many fields

  var sb = SearchBuilder.Builder();
  //I want no actual data - this will ensure I only get IDs
  sb.Fields(new string[0]);
  sb.Query(boolQuery);

  var companyIds = ((ElasticClient)_elasticClient).Search(sb, ESIndexes.Client, ESIndexTypes.Client, tenantId)
    .DocumentsWithMetaData.Select(d => d.Id).ToList();

Не уверен, что это самый эффективный/эффективный способ сделать это, но он работает.

person Cork    schedule 05.10.2012