关于 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种方式:JsonPath,Linq 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 Bulk
、Multi-Get
、Reindex
、Update by query
、Delete by query
、Rethrottle
多记录操作-RestClient
来源:oschina
链接:https://my.oschina.net/u/4359259/blog/3441479