代码之家  ›  专栏  ›  技术社区  ›  user2768439

在Nest 1.7.1中,Delete或DeleteByQuery无效

  •  0
  • user2768439  · 技术社区  · 10 年前

    在Nest 1.7.1中,Delete或DeleteByQuery对我没有任何作用。

    我正在尝试删除以下文档:

    Article article1 = new Article()
                {
                    Id = 1111,
                    Title = "Title - Test Elastic Search",
                    Summary = "Summary - Test Elastic Search",
                    Body = "Body - Test Elastic Search",
                    ArticleDate = _dateToday,
                    Author = new Author() { Id = 100, Name = "Mikey" },
                };
    
    Article article2 = new Article()
                {
                    Id = 2222,
                    Title = "Title - Test Elastic Search",
                    Summary = "Summary - Test Elastic Search",
                    Body = "Body - Test Elastic Search",
                    ArticleDate = _dateToday,
                    Author = new Author() { Id = 100, Name = "Mikey" },
                    Published = true
                };
    

    我希望下面的查询将删除单个文档和索引中的所有文档,但没有查询正在删除。

    _elasticClient.Delete(article).Found;

    _elasticClient.DeleteByQuery<Article>(q => q.Query(t => t.Term(m => m.OnField(f => f.Id).Value(articleId))))
                                          .Found;
    
    
    _elasticClient.DeleteByQuery<Article>(q => q.MatchAll()).IsValid;
    

    如果我做错了什么,请纠正我。

    2 回复  |  直到 10 年前
        1
  •  0
  •   Russ Cam    10 年前

    下面是一个工作示例

    void Main()
    {
        var settings = new ConnectionSettings(new Uri("http://localhost:9200"), "articles");
        var client = new ElasticClient(settings);
    
        if (client.IndexExists("articles").Exists)
        {
            client.DeleteIndex("articles");
        }
    
        client.CreateIndex("articles", c => c
            .AddMapping<Article>(m => m
                .MapFromAttributes()
            )
        );
    
        var today = DateTime.Now.Date;
    
        var article1 = CreateArticle(1111, today);
        var article2 = CreateArticle(2222, today);
        var article3 = CreateArticle(3333, today);
        var article4 = CreateArticle(4444, today);
    
        var bulkRequest = new BulkDescriptor();
        bulkRequest.Index<Article>(i => i.Document(article1));
        bulkRequest.Index<Article>(i => i.Document(article2));
        bulkRequest.Index<Article>(i => i.Document(article3));
        bulkRequest.Index<Article>(i => i.Document(article4));
        bulkRequest.Refresh();
    
        client.Bulk(bulkRequest);
    
        var searchResponse = client.Search<Article>(q => q.MatchAll());
    
        Console.WriteLine("Documents from search: {0}. Expect 4", searchResponse.Documents.Count());
    
        client.Delete(article1, d => d.Refresh());
    
        searchResponse = client.Search<Article>(q => q.MatchAll());
        Console.WriteLine("Documents from search {0}. Expect 3", searchResponse.Documents.Count());
    
        client.Delete(article2, d => d.Refresh());
    
        searchResponse = client.Search<Article>(q => q.MatchAll());
        Console.WriteLine("Documents from search {0}. Expect 2", searchResponse.Documents.Count());
    
        client.DeleteByQuery<Article>(q => q.MatchAll());
    
        searchResponse = client.Search<Article>(q => q.MatchAll());
        Console.WriteLine("Documents from search {0}. Expect 0", searchResponse.Documents.Count());
    
    }
    
    private Article CreateArticle(int id, DateTime articleDate)
    {
        return  new Article()
        {
            Id = id,
            Title = "Title - Test Elastic Search",
            Summary = "Summary - Test Elastic Search",
            Body = "Body - Test Elastic Search",
            ArticleDate = articleDate,
            Author = new Author() { Id = 100, Name = "Mikey" },
            Published = true
        };
    }
    
    public class Article
    {
        public int Id { get; set;}
        public string Title{ get; set;}
        public string Summary { get; set;}
        public string Body { get; set;}
        public DateTime ArticleDate { get; set; }
        public Author Author { get; set; }
        public bool Published { get; set;}
    }
    
    public class Author
    {
        public int Id { get; set; }
        public string Name { get; set;}
    }
    

    结果在

    Documents from search: 4. Expect 4
    Documents from search 3. Expect 3
    Documents from search 2. Expect 2
    Documents from search 0. Expect 0
    

    如预期的那样。

    需要记住的是,Elasticsearch 最终一致 这意味着索引的文档不会出现在 搜索 结果,直到 refresh interval (默认为1秒);同样,对于删除查询,标记为删除的文档将出现在搜索结果中,直到刷新间隔结束。

    对具有给定id的给定文档的GET请求 然而,在刷新间隔之前返回文档。

    如果您需要可搜索的文档(或删除后不显示在搜索结果中),可以在操作后刷新索引,就像我对上面的批量和删除调用所做的那样,使用 .Refresh() 。您可能会在之后调用refresh 每一个 但是,我建议只在您确实需要时使用它,因为它会增加集群的开销并调用 全部的 时间可能会降低性能。

        2
  •  0
  •   user2768439    10 年前

    我终于成功了。

    通过发送的删除请求 NEST 在小提琴中 DELETE /articlestest/article/_query 插件中的查询是这样的 DELETE /articlestest/articles/_query (文档类型名称在代码中拼写错误)。这就是为什么query没有通过删除文档 糟糕的是,它甚至没有抱怨不存在的文档类型:(我花了一段时间才发现这个问题。