Значение в списке значений существует в elasti c поле списка гнезд c# - PullRequest
0 голосов
/ 08 февраля 2020

Не удалось решить проблему с помощью elasti c.

Дано:

  1. Список с цветами: var colors_to_filter = ["red", "blue", "black"];
  2. Цвета полей вasticsearch: colors: ["green", "red", "black"]

Задание:

Получить все продукты из эластичного поиска с цветами, определенными в списке colors_to_filter. Если какой-либо из цветов в colors_to_filter существует в полеasticsearch colors, верните этот продукт.

Мой текущий код, который не работает: (посмотрите на эту строку):
.Bool(bl => bl.Filter(fl => fl.Terms( tr => tr.Field(fs => fs.Sizes.Suffix("keyword")).Terms(sizesList))

  .Aggregations(a => a.Terms(sizesAggName, tt => tt.Field(o => o.Sizes.Suffix("keyword")))
                                .Max(priceAggNameMax, st => st.Field(o => o.SalePrice)))
  .TrackTotalHits()
  .Sort(p => GetSortType(sortType))
  .Index(GetIndexName())
  .From(from)
  .Size(size)
  .Query(q => q.Bool(b => GetQuery(mainCategory, subCategory, subSubcategory, term)))
  .PostFilter( ppf => ppf
  .Bool(bl => bl.Filter(fl => fl.Terms( tr => tr.Field(fs => fs.Sizes.Suffix("keyword")).Terms(sizesList))
  && ppf.Range(r => {
               r = r.Field(f => f.SalePrice);
               if (minPrice > 0) r = r.GreaterThanOrEquals((double)minPrice);
               if (maxPrice > 0) r = r.LessThanOrEquals((double)maxPrice);
               return r;
  })))));

Ответы [ 2 ]

0 голосов
/ 09 февраля 2020

Рабочий код:

.Aggregations(a => a.Terms(sizesAggName, tt => tt.Field(o => o.Sizes.Suffix("keyword")))
                                .Max(priceAggNameMax, st => st.Field(o => o.SalePrice)))
  .TrackTotalHits()
  .Sort(p => GetSortType(sortType))
  .Index(GetIndexName())
  .From(from)
  .Size(size)
  .Query(q => q.Bool(b => GetQuery(mainCategory, subCategory, subSubcategory, term)))
  .PostFilter( ppf => ppf
  .Terms(tr =>
         {
             var tt = tr.Field(fs => fs.Sizes.Suffix("keyword"));
             return sizesList.Lenght() > 0 ? tt.Terms(selectedSizes) : tt;
         })
  && ppf.Range(r => {
             r = r.Field(f => f.SalePrice);
             if (minPrice > 0) r = r.GreaterThanOrEquals((double)minPrice);
             if (maxPrice > 0) r = r.LessThanOrEquals((double)maxPrice);
             return r;
  })));
0 голосов
/ 08 февраля 2020

Я понятия не имею об упругом поиске. Однако требования кажутся ясными:

Первый фильтр, элементы которого имеют цвет colors_to_filter. Затем снова отфильтруйте результаты по цветам и в colors. Только вещи, которые переживают обе фильтрации, находятся в конечном результате.

Оптимизация будет заключаться в сокращении этих двух списков до одного со всеми цветами, которые есть в обоих (которые будут "красными" и "черными") , Затем используйте этот массив амальгмы в качестве фильтра. Я не уверен, к какому типу присоединения это было снова.

Я догадываюсь elastisearch должен делать эту оптимизацию автоматически, и это пример, чтобы показать это вам? Точный порядок или даже подготовительное объединение двух похожих фильтров для производительности? Это единственное, что я могу назвать «elasti c» при любом поиске / фильтрации.

...