2016-05-02 2 views
0

Nest Версия: 2,10 Elasticsearch.Net Версия: 2,10Поиск использования Апи и BoolQueryDescriptor - Гнездо Клиент

Я пытаюсь написать запрос, который идет как ниже

BoolQueryDescriptor<ErrorLog> queryParameter; 
queryParameter = QueryFilterBuilder.BuildQueryFilter<ErrorLog>(searchInputs.SearchParameters); 



if (queryParameter != null) 
{ 
    var searchResultnew = elasticClient.Search<ErrorLog>(query => query 
    .Query(q=>q.Bool(queryParameter)) 
     .Index("errorlogs") 
     .Size(searchInputs.ResultCount) 
     .From(searchInputs.From) 
     .Sort(s => s.OnField(sortField) 
     .Order(sortOrder) 
    ) 
); 
} 

Здесь query.Query(q=>q.Bool(queryParameter)) не принимает queryParameter как параметр, хотя queryParameter имеет тип BoolQueryDescriptor. Не уверен, что здесь не так. Скопировали класс Builder класса Generic ниже, т.е. QueryFilterBuilder. Пожалуйста, дайте мне знать, если вам нужна дополнительная информация. Этот класс был написан с использованием Nest 1.x, теперь мы пытаемся исправить сломанную вещь с помощью Nest 2.0.

public static class QueryFilterBuilder 
    { 
     [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] 
     public static BoolQueryDescriptor<T> BuildQueryFilter<T>(IList<SearchParameters> searchParameterList) where T : class 
     { 
      QueryContainer filterContainer = null; 
      BoolQueryDescriptor<T> bqd = new BoolQueryDescriptor<T>(); 
      if (searchParameterList == null) 
      { 
       throw (new ArgumentNullException("searchParameterList")); 
      } 

      var fieldGroups = from parameter in searchParameterList 
          group parameter by parameter.FieldName into fieldList 
          orderby fieldList.Key 
          select fieldList; 
     foreach (var fgrp in fieldGroups) 
     { 
      string fieldName = string.Empty; 
      string fieldDataType = string.Empty; 
      string searchText = string.Empty; 
      SearchFilterType operand = SearchFilterType.Unknown; 
      foreach (var sp in fgrp.ToList()) 
      { 
       switch (sp.Operand) 
       { 
        case SearchFilterType.Equals: 
         bqd.Must(EqualTo(searchText, sp.FieldName, sp.Analysed)); 
         operand = sp.Operand; 
         break; 

        case SearchFilterType.Contains: 
         bqd.Must(Contains(searchText, sp.FieldName, sp.Analysed, fieldDataType)); 
         operand = sp.Operand; 
         break; 
       } 
      } 
     } 

     return bqd; 
    } 



public static QueryContainer EqualTo(string searchText, string field, bool fieldanalysis) 
    { 
     QueryContainer queryContainer = null; 
     if (searchText == null) 
     { 
      throw (new ArgumentNullException("searchText")); 
     } 

     if (fieldanalysis) 
     { 
      searchText = searchText.ToLower(); 
      queryContainer = new TermQuery() 
      { 
       Field = field + ".sort", 
       Value = searchText 
      }; 
     } 
     else 
     { 
      queryContainer &= new TermQuery() 
      { 
       Field = field, 
       Value = searchText 
      }; 
     } 
     return queryContainer; 
    } 


} 
--------------------- 
public class SearchParameters 
    { 
     /// <summary> 
     /// Gets or sets SearchText 
     /// </summary> 


     public String SearchText { get; set; } 

     /// <summary> 
    /// Gets or sets FieldName 
    /// </summary> 
    public String FieldName { get; set; } 

    /// <summary> 
    /// Gets or sets Operand 
    /// </summary> 
    public SearchFilterType Operand { get; set; } 

    /// <summary> 
    /// Gets or sets FieldName 
    /// </summary> 
    public String FieldDataType { get; set; } 

    /// <summary> 
    /// Gets or sets Analyzed status 
    /// </summary> 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Analysed")] 
    public bool Analysed { get; set; } 
    } 

Спасибо, Паван

ответ

1

В НЕСТ 2.x, .Bool() takes a Func<BoolQueryDescriptor<T>, IBoolQuery> и BoolQueryDescriptor<T> реализует IBoolQuery так что вы можете сделать

elasticClient.Search<ErrorLog>(query => query 
    .Query(q=>q.Bool(b => queryParameter)) 
     .Index("errorlogs") 
     .Size(searchInputs.ResultCount) 
     .From(searchInputs.From) 
     .Sort(s => s.OnField(sortField) 
     .Order(sortOrder) 
    ) 
);