CRUD 使用示例

编辑

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

这些示例假设您有一个 ElasticsearchClient 实例,可以通过名为 client 的局部变量访问,并且您的 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,这些 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.");
}