Elasticsearch UpdateByQuery索引刷新问题

时间:2018-05-02 16:27:22

标签: c# elasticsearch nest

我正在使用C#

上的Elasticsearch(ES)5和NEST 5

我使用ES实现了工作流程。简化工作流程有两个步骤。

步骤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 :(得分:0)

如果你分两步完成,那么你应该这样做

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());
}