Поиск использования API и BoolQueryDescriptor - Nest Client

Версия Nest: 2.10 Elasticsearch.Net Версия: 2.10

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

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, Не уверен, что здесь не так. Скопировали приведенный ниже класс построителя запросов общего класса, т. Е. 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 ответ

Решение

В NEST 2.x, .Bool() занимает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)
    )
);
Другие вопросы по тегам