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.");
}