Проблема обновления индекса Elasticsearch UpdateByQuery - PullRequest
0 голосов
/ 02 мая 2018

Я работаю с Elasticsearch (ES) 5 и NEST 5 на C #

У меня есть рабочий процесс, реализованный с использованием ES. Упрощение рабочего процесса состоит из 2 шагов.

Шаг 1: Я генерирую получателей для сообщения с использованием оператора UpdateByQuery на основе некоторых критериев.

Шаг 2: Я запрашиваю всех получателей, сгенерированных на шаге 1, для фактической доставки сообщения.

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

Я попытался установить «WaitForCompletion (true)» (по умолчанию для Nest), но я получил тот же результат. Также я заметил, что UpdateByQuery не поддерживает refresh = wait_for, поэтому не уверен, как это сделать.

Мое обновление по запросу выглядит так:

query
.Index(allIndexesStr)

// Exclude all contact in this list
.Query(q =>
    ...
)
.WaitForCompletion(true)
// Update script
.Script(script => script
    .Inline(scriptStr)
    .Params(p =>
        ...
    )
)
.Routing(customerSiteId.ToString());

Мой поиск выглядит так:

search
.Index(allIndexesStr)
.Size(size)
.Scroll(timeout)
.Query(q =>
    ...
)
.Sort(sort => sort
    .Ascending("contactGuid.keyword")
)
.Routing(customerSiteId.ToString());

Так что мне интересно, как лучше решить эту проблему с помощью ES ...

Любая помощь будет признательна

1 Ответ

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

Если вы делаете это в 2 шага, то вы должны что-то вроде этого

var result = ...
            .Index(allIndexesStr)

        // Exclude all contact in this list
        .Query(q =>
            ...
        )
        .WaitForCompletion(true)
        // Update script
        .Script(script => script
            .Inline(scriptStr)
            .Params(p =>
                ...
            )
        )
        .Refresh(true)
        .Routing(customerSiteId.ToString());

if (result.IsValid)
{
    search
    .Index(allIndexesStr)
    .Size(size)
    .Scroll(timeout)
    .Query(q =>
    ...
    )
    .Sort(sort => sort
        .Ascending("contactGuid.keyword")
    )
    .Routing(customerSiteId.ToString());
}
...