CRUD 使用示例编辑

本页面帮助您了解如何使用 .NET 客户端执行各种基本的 Elasticsearch CRUD(创建、读取、更新、删除)操作。它演示了如何通过将对象索引到 Elasticsearch 来创建文档,读取文档,通过 ID 检索文档或执行搜索,更新文档中的字段以及删除特定文档。

这些示例假设您有一个可通过名为 client 的局部变量访问的 ElasticsearchClient 实例,并且您的 C# 文件中有多个 using 指令。

using System;
using Elastic.Clients.Elasticsearch;
using Elastic.Clients.Elasticsearch.QueryDsl;
var client = new ElasticsearchClient(); 

默认构造函数假定一个不安全的 Elasticsearch 服务器正在运行并暴露在 https://127.0.0.1:9200 上。有关连接到安全服务器和 Elastic Cloud 部署的示例,请参阅连接

这些示例操作表示推文的数据。推文在客户端应用程序中使用名为 *Tweet* 的 C# 类建模,该类包含多个映射到存储在 Elasticsearch 中的文档结构的属性。

public class Tweet
{
    public int Id { get; set; } 
    public string User { get; set; }
    public DateTime PostDate { get; set; }
    public string Message { get; set; }
}

默认情况下,.NET 客户端将尝试在类上查找名为 Id 的属性。当存在这样的属性时,它将使用此属性的值指定的 ID 将文档索引到 Elasticsearch 中。

索引文档编辑

可以通过创建表示推文的实例并通过客户端对其进行索引来索引文档。在这些示例中,我们将使用名为 *my-tweet-index* 的索引。

var tweet = new Tweet 
{
    Id = 1,
    User = "stevejgordon",
    PostDate = new DateTime(2009, 11, 15),
    Message = "Trying out the client, so far so good?"
};

var response = await client.IndexAsync(tweet, "my-tweet-index"); 

if (response.IsValidResponse) 
{
    Console.WriteLine($"Index document with ID {response.Id} succeeded."); 
}

创建 Tweet 类的实例,并设置相关属性。

首选异步 API,这需要等待响应。

检查响应上的 IsValid 属性,以确认请求和操作已成功。

如有必要,访问 IndexResponse 属性,例如 ID。

获取文档编辑

var response = await client.GetAsync<Tweet>(1, idx => idx.Index("my-tweet-index")); 

if (response.IsValidResponse)
{
    var tweet = response.Source; 
}

GetResponse 与 Elasticsearch JSON 响应一一对应。

原始文档被反序列化为 Tweet 类的实例,可通过 Source 属性在响应上访问。

搜索文档编辑

客户端公开了一个流畅的接口和一个强大的查询 DSL 用于搜索。

var response = await client.SearchAsync<Tweet>(s => s 
    .Index("my-tweet-index") 
    .From(0)
    .Size(10)
    .Query(q => q
        .Term(t => t.User, "stevejgordon") 
    )
);

if (response.IsValidResponse)
{
    var tweet = response.Documents.FirstOrDefault(); 
}

泛型类型参数指定了 Tweet 类,该类在从响应中反序列化命中时使用。

如果在 ElasticsearchClientSettings 上配置了 DefaultIndex,或者在映射此类型时配置了特定索引,则可以省略索引。

user 字段执行术语查询,搜索由用户 *stevejgordon* 创建的推文。

可以通过 SearchResponse 上的 Documents 集合属性访问与查询匹配的文档。

如果不喜欢 lambda 表达式,您可能更喜欢对请求使用对象初始化器语法。

var request = new SearchRequest("my-tweet-index") 
{
    From = 0,
    Size = 10,
    Query = new TermQuery("user") { Value = "stevejgordon" }
};

var response = await client.SearchAsync<Tweet>(request); 

if (response.IsValidResponse)
{
    var tweet = response.Documents.FirstOrDefault();
}

创建 SearchRequest 的实例,设置属性以控制搜索操作。

将请求传递给客户端上的 SearchAsync 方法。

更新文档编辑

可以通过多种方式更新文档,包括为现有文档 ID 提供完整的替换。

tweet.Message = "This is a new message"; 

var response = await client.UpdateAsync<Tweet, Tweet>("my-tweet-index", 1, u => u
    .Doc(tweet)); 

if (response.IsValidResponse)
{
    Console.WriteLine("Update document succeeded.");
}

更新现有推文实例上的属性。

在更新请求中发送更新的推文对象。

删除文档编辑

可以通过提供要删除的文档的 ID 来删除文档。

var response = await client.DeleteAsync("my-tweet-index", 1);

if (response.IsValidResponse)
{
    Console.WriteLine("Delete document succeeded.");
}