Elasticsearch.Nest 教程系列 5-2 索引:Ingest Node | 使用 Ingest 节点

  • 本系列博文是“伪”官方文档翻译(更加本土化),并非完全将官方文档进行翻译,而是在查阅、测试原始文档并转换为自己真知灼见后的“准”翻译。有不同见解 / 说明不周的地方,还请海涵、不吝拍砖 :)

  • 官方文档见此:https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/introduction.html

  • 本系列对应的版本环境:ElasticSearch@7.3.1,NEST@7.3.1,IDE 和开发平台默认为 VS2019,.NET CORE 2.1


Ingest Node 的作用

在文档索引发生之前,会使用 Ingest 节点进行预处理文档。Ingest 节点会拦截批量和索引请求,之后应用转换(mapping),然后将文档传递回索引或 Bulk API。

  • 即:在数据被索引之前,通过预定义好的处理管道对数据进行预处理。

默认情况下,所有节点都启用 Ingest,也就是说任何节点都可以处理 Ingest 任务。

  • 当然,你也可以创建某些业务专用的 Ingest 节点。

Elasticsearch 会将自动将索引请求重新路由到 Ingest 节点,而您可以优化此路径。

自定义索引客户端

在声明 ES 客户端的时候,你不需要制定或配置任何信息,ES 会自动将接收到的请求重新路由到 Ingest 节点。

如果您要进行大量 Ingest 相关的操作并拥有专用的 Ingest 节点,你可以直接将索引请求发送到这些节点,以避免集群中的任何额外跃点。

最简单的方法是为索引请求创建一个专用的 ES 客户端:

1
2
3
4
5
6
7
8
var pool = new StaticConnectionPool(new [] //Ingest 节点集合
{
new Uri("http://ingestnode1:9200"),
new Uri("http://ingestnode2:9200"),
new Uri("http://ingestnode3:9200")
});
var settings = new ConnectionSettings(pool);
var indexingClient = new ElasticClient(settings);

Ingest 能干什么

在复杂的集群配置中,使用 SniffingConnectionPool 以及节点谓词来筛选具有 Ingest 功能的节点会更容易。它允许你可以自定义群集,而不必重新配置客户端。

1
2
3
4
5
6
7
8
var pool = new SniffingConnectionPool(new []  // 集群节点集合
{
new Uri("http://node1:9200"),
new Uri("http://node2:9200"),
new Uri("http://node3:9200")
});
var settings = new ConnectionSettings(pool).NodePredicate(n => n.IngestEnabled);
var indexingClient = new ElasticClient(settings);
  • 在使用 ES 客户端的时候,会只选择具有 Ingest 功能的节点。