ES Client

穿精又带淫゛_ 提交于 2021-02-11 10:45:05

关于 ElasticSearch的学习参见:ELK | wjcx_sqh 本文分别学习 .Net | Java 下操作 ES:

.Net

目前主流的 .Net 客户端有 2 种:

  • PlainElastic.Net
  • Elasticsearch.Net.dll 和 Nest.dll

PlainElastic.Net 简单了解即可,具体参见:https://www.cnblogs.com/eggTwo/p/4039779.html

##Elasticsearch.Net + Nest 直接在 Nuget | 官网 下载对应的 .nuget包,在项目中引入即可。

注意不同版本 .dll 对 .Net Framework 框架的依赖。

###索引 创建连接和索引

var nodes = new Uri[] { new Uri(""), new Uri("") };
var pool = new StaticConnectionPool(nodes);
var settings = new ConnectionSettings(pool);
var ESClient = new ElasticClient(settings);

if (!client.TypeExists(_indexName, _typeName).Exists) {
	client.CreateIndex(_indexName, p => p.InitializeUsing(indexState)
	      .Mappings(m => m.Map<DefClassName>(mp => mp.AutoMap()))); }
		  
protected static IIndexState indexState = new IndexState() {
	Settings = new IndexSettings() {
		NumberOfReplicas = 1, NumberOfShards = 5
	}};

ES的mapping一旦创建不能再次修改,需删除再重新创建

client.Indices.Create(index_name, 
	c => c.Map<MyClassObj>(h => h.AutoMap().Properties(
	ps => ps.Text(s => s.Name(n => n.OneFieldInMyClassObj)
	.Analyzer("ik_max_word").SearchAnalyzer("ik_smart"))
)));

###查询

  • 对象方式查询
  • Fluent API

TermQuery 是整词搜索;MatchQuery 是按分词器分词搜索,可以搭配from和size从指定位置返回指定条数。 注意 match 与 match_phrase 的不同。

<font color="#AA55D3" size="2px">Search After</font> 通过上一页的结果检索下一页,使用search_after参数时,from的值必须设为0或-1:search_after

  • from和size:深度分页或size特别大时,会出deep pagination,es自保机制max_result_window预设值10000,建议from + size <= 1万
  • scroll:代表某时刻的snapshot,不适合实时查询,scroll后接超时时间,频繁发起scroll请求,也会出现一系列问题

search_after解决scroll的非实时取值问题,提供live cursor规避消耗存储和时间的性能问题:search_after性能 <font color="#AA55D3" size="2px">Source Filter</font> 推荐在查询请求SearchRequest中使用,按需返回字段

sr.Source = new SourceFilter() {
   Includes = new string[] { "xx", "zz" }, Excludes = new string[] { "vv" }
};

###问题解决 问题1:Kibana显示的时间比实际插入ES的时间多8个小时 原因:NEST的序列化器默认DateTime类型是UTC时区,序列化时丢弃了时区信息,而Kibana设置是东八区 解决:创建client时传入设置参数

var settings = new ConnectionSettings(pool, 
	sourceSerializer: (builtin, setting) => new JsonNetSerializer(builtin, setting, 
		() => new Newtonsoft.Json.JsonSerializerSettings { 
			DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Local 
}));

问题2:实现超时自动重试 解决:通过添加max_retries和retry_on_timeout两个参数

es = Elasticsearch( hosts=[{'host': 'localhost', 'port': 9200}], timeout=60, max_retries=3, retry_on_timeout=True);

###序列化 ElasticSearch 是 Restful 相关,自然经常用到 json 推荐学习:Custom Serialization 说到json,自然需要解析,提供2种方式:JsonPathLinq to JSON

##log4net.ElasticSearch 除了调用ES对外的接口,还可以直接向ES写日志:log4net.ElasticSearch

<appender name="ElasticSearchAppender" type="log4net.ElasticSearch.ElasticSearchAppender, log4net.ElasticSearch">
  <layout type="log4net.Layout.PatternLayout,log4net">
	<param name="ConversionPattern" value="%d{ABSOLUTE} %-5p %c{1}:%L - %m%n" />
  </layout>
  <connectionString value="Server=xxx.xxx.xxx.xxx;Index=logsqh;Port=9200;rolling=false"/>
  <lossy value="false" />
  <evaluator type="log4net.Core.LevelEvaluator">
	<threshold value="ALL" />
  </evaluator>
  <bufferSize value="1" />
</appender>

其中,rolling属性控制是否每天生成一个索引,具体参见:log4net.ElasticSearch+ Kibana日志记录和显示

#Java ##原生APi

  • transport:TCP,只支持java
  • rest:http,无语言限制

建议rest,transport将在v7.0、v8.0中逐步废弃。 ##SpringBoot + Elasticsearch SpringBoot集成Elasticsearch,支持4种方式

  • REST Client:http,Java Low Level Rest Client和推荐:Java High Level Rest Client
  • Jest:http,java社区版
  • Spring Data:spring集成elasticsearch开发包
  • Spring Data Repositories

###Spring Data Elasticsearch Spring Data 子模块套件,支持快速初始化maven项,官网移步参考示例

  • SpringBoot:v2.2.2
  • Elasticsearch:v6.8.0

务必保证SpringBoot和Elasticsearch的版本匹配,对应关系

###High Level Rest Client 版本配置:sb-2.2.2 + es-6.6.2

<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>6.6.2</version>

初始引用v6.1.4会报错:org.elasticsearch.client.Request.<init>(Ljava/lang/String;Ljava/lang/String;)V 参考学习:示例1示例2 BulkMulti-GetReindexUpdate by queryDelete by queryRethrottle 多记录操作-RestClient

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!