【问题标题】:Does Elasticsearch Nest support Update By QueryElasticsearch Nest 是否支持按查询更新
【发布时间】:2018-04-28 08:41:54
【问题描述】:

我想在高级客户端上使用 UpdateByQuery 方法,但找不到 Nest 的任何文档。如果我想发出 CURL 请求,但 NEST 没有,他们有很好的文档。 https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-update-by-query.html 如果有人有他们使用它的例子,或者可以分享他们发现的文档,那就太棒了!

【问题讨论】:

    标签: elasticsearch nest


    【解决方案1】:

    Update By Query API 在 NEST 中受支持。这是一个例子adapted from the integration testsNEST Documentation 用于索引和更新 API 计划中:)

    private static void Main()
    {
        var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200"));
    
        var settings = new ConnectionSettings(pool)
            .DefaultMappingFor<Test>(m => m
                .IndexName("tests")
                .TypeName("test")
            );
    
        var client = new ElasticClient(settings);
        var index = IndexName.From<Test>();
    
        if (client.IndexExists(index).Exists)
            client.DeleteIndex(index);
    
        client.CreateIndex(index, c => c
            .Mappings(m => m
                .Map<Test>(map => map
                    .Properties(props => props
                        .Text(s => s.Name(p => p.Text))
                        .Keyword(s => s.Name(p => p.Flag))
                    )
                )
            )
        );
    
        client.Bulk(b => b
            .IndexMany(new[] {
                new Test { Text = "words words", Flag = "bar" },
                new Test { Text = "words words", Flag = "foo" }
            })
            .Refresh(Refresh.WaitFor)
        );
    
        client.Count<Test>(s => s
            .Query(q => q
                .Match(m => m
                    .Field(p => p.Flag)
                    .Query("foo")
                )
            )
        );
    
        client.UpdateByQuery<Test>(u => u
            .Query(q => q
                .Term(f => f.Flag, "bar")
            )
            .Script("ctx._source.flag = 'foo'")
            .Conflicts(Conflicts.Proceed)
            .Refresh(true)
        );
    
        client.Count<Test>(s => s
            .Query(q => q
                .Match(m => m
                    .Field(p => p.Flag)
                    .Query("foo")
                )
            )
        );
    }
    
    public class Test
    {
        public string Text { get; set; }
        public string Flag { get; set; }
    }
    

    观察到第一次 Count API 调用的计数为 1,而在 Update By Query API 调用之后的第二次 Count API 调用中,计数为 2。

    【讨论】:

    • 下面两个有没有例子: 1.如何更新多个字段? 2.如何更新整个对象/文档?顺便说一句,您提供的链接已更改:github.com/elastic/elasticsearch-net/blob/master/src/Tests/…
    • 例如: 1. 是否可以一次调用更新两个字段,或者我必须为每个字段调用UpdateByQuery? 2.是否可以一次调用更新所有字段而不指定所有字段(只需将一个对象输入到某个方法中以更新文档)?
    • 您可以使用脚本"ctx._source.flag = 'foo'; ctx._source.flag2 = 'bar';" 更新两个字段。您可以通过脚本获得创意,以便能够将对象作为参数传递给脚本,并迭代其属性以更新文档的属性。没有像Update&lt;TDocument, TPartialDocument&gt; 那样传递文档的方法。我认为最初的意图是用户可能希望使用每个文档的属性值来更新它们。
    猜你喜欢
    • 2016-10-11
    • 2015-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-23
    • 1970-01-01
    • 1970-01-01
    • 2015-06-27
    相关资源
    最近更新 更多