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


Ingest Node 的作用

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

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

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

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

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

自定义索引客户端

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

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

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

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 功能的节点会更容易。它允许你可以自定义群集,而不必重新配置客户端。

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 功能的节点。