Поиск по списку диапазонов дат в упругом поиске - PullRequest
0 голосов
/ 03 мая 2018

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

Я хочу иметь возможность использовать список DateRanges в качестве моего поискового запроса, но я не уверен, как на самом деле сделать это эффективно в эластичном NEST.

Вот пример кода для того, что я пытаюсь сделать эффективно.

// my list of date ranges
var dateQuery = new List<DateRangeQuery>();

// make query foreach day
foreach (var day in valid_days)
{
    dateQuery.Add(new DateRangeQuery
    {
        Field = "Date",
        GreaterThanOrEqualTo = day.Item1, // DateTime start of day tuple
        LessThanOrEqualTo = day.Item2 // DateTime end of day tuple
    });
}

// query by list of search request           
var search = new SearchRequest
{
    // how do i use a list of date time's here?
    Query = dateQuery;
}

var example = _client.Search(search);

EDIT:

Решено с помощью этого кода, спасибо за помощь!

Примечание: API NEST довольно запутанный, если вы не знаете синтаксис DSL.

var dateQuery = new QueryContainer();

// make date range query from valid day list
foreach (var day in daylist)
{
    // x = x || y
    dateQuery = dateQuery || new DateRangeQuery
    {
        Field = "date",
        GreaterThanOrEqualTo = day.Item1, // start of day
        LessThanOrEqualTo = day.Item2 // end of day
    };
}

// match by query
var search = _client.Search(
    s => s.Query(
        q => && q.Bool(b => b.Should(dateQuery)));

Говоря о гибкости, они хотят сделать NEST API проще для разработчиков C # и в будущем, так что следите за этим.

Все селекторы в коде кажутся слишком раздутыми.

Я использовал || оператор вместо | потому что || имеет преимущества в производительности, если ваше выражение оценивается и соответствует совпадению, оно возвращается быстрее.

Надеюсь, это поможет любому, кто его ищет.

1 Ответ

0 голосов
/ 03 мая 2018

Полагаю, вам нужно использовать запрос bool с must для запросов с несколькими диапазонами. Что-то вроде

{
"query": {
    "bool": {
        "must": [
            {
                "range": {
                    "created_at": {
                        "gte": "2013-12-09T00:00:00.000Z"
                    }
                }
            },
            {
                "range": {
                    "happens_on": {
                        "lte": "2013-12-16T00:00:00.000Z"
                    }
                }
            }
        ]
    }
 }
}

В клиенте .Net я думаю, что вы можете использовать QueryContainer. Пожалуйста, обратитесь по этой ссылке , так как я не очень знаком с клиентом .Net изasticsearch.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...