Создайте несколько фильтров в Elasticsearch

Можете ли вы предложить, как мне построить запрос на основе нескольких фильтров. В настоящее время я хочу реализовать функцию поиска, используя следующие фильтры:

  • Наименование товара
  • Страны (массив)
  • Города (массив)

Требования заключаются в том, что, если округа или города не имеют выбранного значения, запрос предполагает, что вы ищете все страны и города. Если есть выбранные округа и города, то результат должен основываться на выбранных округах и городах.

У меня есть запрос ниже, чтобы начать с.

static void Main(string[] args)
{   
    var uri = new Uri("http://localhost:9200");
    var connectionPool = new SingleNodeConnectionPool(uri);
    var settings = new ConnectionSettings(connectionPool);

    var client = new ElasticClient(settings);

    if (counties.Count > 0) 
    {
        foreach(string country in counties)
        {
            // Add a query to be added in client.Search     
        }
    }

    if (cities.Count > 0)
    {
        foreach(string city in cities)
        {
            // Add a query to be added in client.Search
        }
    }

    client.Search<Product>(s => s
                            .Query(q => q
                                .Bool(b => b
                                    .Must(mu => mu
                                        .Match(m => m
                                            .Field(f => f.ProductName)
                                            .Query("some text")
                                        ),
                                        .
                                    )
                                )
                            )
                        );
}

person klaydze    schedule 27.04.2017    source источник
comment
У вас есть поля для городов и для стран? Что они содержат?   -  person ghusse    schedule 27.04.2017
comment
Да. Поле - Страна и Город, а тип данных - строка.   -  person klaydze    schedule 27.04.2017


Ответы (2)



Я просто отвечаю на свой вопрос. В настоящее время я пришел с этим подходом.

var sd = new SearchDescriptor<object>();
var qc = new QueryContainer();
var qd = new QueryContainerDescriptor<object>();

sd.From(0);
sd.Size(100);
sd.Index("Products");
sd.Type("Product");

if (!string.IsNullOrEmpty(title))
{
    qc = qd.Match(m1 => m1
        .Field("title")
        .Query(title)
    );
}

if (countries.Count > 0)
{
    qc = qd.Terms(t => t
            .Field("country")
            .Terms(countries.ToArray())
        );
}

if (cities.Count > 0)
{
    qc = qd.Terms(t => t
            .Field("city")
            .Terms(cities.ToArray())
        );
}

sd.Query(q => q
        .Bool(b => b
            .Must(qc)
        )
    );

var result = client.Search<object>(s => s = sd);
person klaydze    schedule 02.05.2017