elasticsearch client接口详解
Elasticsearch.netclientNEST使用说明2.x

clientNEST使⽤说明2.xElasticsearch .net client NEST使⽤说明 2.x与NEST是Elasticsearch为C#提供的⼀套客户端驱动,⽅便C#调⽤Elasticsearch服务接⼝。
是较基层的对Elasticsearch服务接⼝请求响应的实现,NEST是在前者基础之上进⾏的封装。
本⽂是针对NEST的使⽤的总结。
引⽤Install-Package NEST包含以下dllNEST.dll.dllNewtonsoft.Json.dll概念存储结构:在Elasticsearch中,⽂档(Document)归属于⼀种类型(type),⽽这些类型存在于索引(index)中.类⽐传统关系型数据库:Relational DB -> Databases -> Tables -> Rows -> ColumnsElasticsearch -> Indices -> Types -> Documents -> Fields距离单位:mm (毫⽶)cm (厘⽶)m (⽶)km (千⽶)in (英⼨)ft (英尺)yd (码)mi (英⾥)nmi or NM (海⾥)⽇期单位:y (year)M (month)w (week)d (day)h (hour)m (minute)s (second)ms (milliseconds)客户端语法链式lambda 表达式()s => s.Query(q => q.Term(p => , "elasticsearch"))对象初始化语法var searchRequest = new SearchRequest<VendorPriceInfo>{Query = new TermQuery{Field = "name",Value = "elasticsearch"}};Connection链接//单nodeVar node = new Uri(“……”);var settings = new ConnectionSettings(node);//多uriVar uris = new Uri [] {new Uri(“……”),new Uri(“……”)};//多nodeVar nodes = new Node [] {new Node (new Uri(“……”)),new Node (new Uri(“……”))};var pool = new StaticConnectionPool(nodes);var pool = new StaticConnectionPool(uris);var settings = new ConnectionSettings(pool);var client = new ElasticClient(settings);连接池类型://对单节点请求IConnectionPool pool = new SingleNodeConnectionPool(urls.FirstOrDefault());//请求时随机请求各个正常节点,不请求异常节点,异常节点恢复后会重新被请求IConnectionPool pool = new StaticConnectionPool(urls);IConnectionPool pool = new SniffingConnectionPool(urls);//false.创建客户端时,随机选择⼀个节点作为客户端的请求对象,该节点异常后不会切换其它节点//true,请求时随机请求各个正常节点,不请求异常节点,但异常节点恢复后不会重新被请求pool.SniffedOnStartup = true;//创建客户端时,选择第⼀个节点作为请求主节点,该节点异常后会切换其它节点,待主节点恢复后会⾃动切换回来IConnectionPool pool = new StickyConnectionPool(urls);索引选择⽅式1:var settings = new ConnectionSettings().DefaultIndex("defaultindex");⽅式2:var settings = new ConnectionSettings().MapDefaultTypeIndices(m => m.Add(typeof(Project), "projects") );⽅式3:client.Search<VendorPriceInfo>(s => s.Index("test-index"));client.Index(data,o=>o.Index("test-index"));优先级:⽅式3 > ⽅式2 > ⽅式1索引索引唯⼀Id:1) 默认以“Id”字段值作为索引唯⼀Id值,⽆“Id”属性,Es⾃动⽣成唯⼀Id值,添加数据时统⼀类型数据唯⼀ID已存在相等值,将只做更新处理。
elasticsearch 使用手册

elasticsearch 使用手册Elasticsearch是一个开源的搜索和分析引擎,可用于处理大量数据并提供实时和可伸缩的搜索和分析功能。
本文将介绍Elasticsearch 的基本概念、安装配置、核心功能以及常用的API和查询语法。
一、安装配置1.下载安装ElasticsearchElasticsearch的官方网站上提供了各个平台的安装包,可以根据自己的操作系统下载对应的安装包进行安装。
2.配置Elasticsearch安装完成后,需要修改Elasticsearch的配置文件elasticsearch.yml。
其中一些重要的配置包括集群名称、节点名称、监听地址和端口号等。
同一个集群中的节点应该具有相同的集群名称。
二、核心功能1.数据存储和索引Elasticsearch使用分布式的倒排索引来存储和索引数据。
在Elasticsearch中,数据被组织成索引,而索引由多个分片组成。
每个分片可以在集群中的不同节点上进行复制,以提高可用性和性能。
2.文档和字段Elasticsearch使用JSON格式来存储数据。
每条数据被称为一个文档,每个文档可以包含多个字段。
字段可以是不同的数据类型,如字符串、数值、布尔值等。
3.搜索和查询Elasticsearch提供了丰富的查询功能,可以通过各种条件对文档进行搜索。
查询可以使用Query DSL或简单的字符串进行构建。
可以进行全文搜索、精确匹配、模糊搜索、范围搜索等。
4.聚合和分析Elasticsearch提供了聚合功能,可以对搜索结果进行统计和分析。
聚合包括词条聚合、范围聚合、日期聚合等,可以对文档的某个字段进行分组、计数、求和等操作。
三、常用API和查询语法1.索引操作API使用索引操作API可以创建、更新和删除索引。
主要的API包括创建索引、删除索引、更新索引设置、关闭索引和打开索引等。
2.文档操作API文档操作API主要用于对单个文档进行操作,主要包括索引文档、获取文档、更新文档和删除文档等。
EsClientAPI

一个elasticsearch客户端调用解决方案,主要提供文档数据的CURD操作,以及说明了数据同步的方案。
目前为了照顾低版本jdk系统,开发基线JDK版本为1.6,后续会陆续推出spring集成版本。
∙0.0.6-SNAPSHOT优化API方式检索条件逻辑,重做了API模式构造器的实现逻辑,支持and (or) and (or)模式,每次调用must、should、mustnot方法都会作为一个独立子查询语句,相互为and 的关系不会再合并相同模式的查询条件,API调用增加MATCHPHRASE模式。
2017-09-27∙0.0.5-SNAPSHOT修复了高并发情况下,Http连接报错的问题,https请求添加同步锁。
查询添加了异步调用方式。
新增、更新数据默认为异步模式调用2017-09-19∙0.0.4-SNAPSHOT排序增加了注解的方式,新增、更新、删除文档数据支持批量模式2017-09-19∙0.0.3-SNAPSHOTAPI方式增加大于小于方式、IN的方式,工厂入参调整为枚举,修复了高亮替换的BUG,修复了http客户端初始化慢的问题2017-09-13∙0.0.2-SNAPSHOT搜索加入注解支持简化API,高亮字段设置优化,全文检索分割优化,重构代理层实现方式2017-09-12∙0.0.1-SNAPSHOT初版2017-09-08最新版本下载地址:需要有一定的elasticsearch知识工具包依赖详见如下POM,注意,不可更改es工具包版本,并引入esClinet.jar<properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><commons-io.version>2.4</commons-io.version><commons-net.version>3.3</commons-net.version><commons-beanutils.version>1.8.0</commons-beanutils.version><commons-lang.version>2.6</commons-lang.version><commons-lang3.version>3.4</commons-lang3.version><commons-collections4.version>4.1</commons-collections4.version><commons-logging.version>1.2</commons-logging.version><fastjson.version>1.2.16</fastjson.version></properties><dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>0.19.11</version></dependency><dependency><groupId>io.searchbox</groupId><artifactId>jest</artifactId><version>0.0.3</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>${commons-io.version}</version></dependency><dependency><groupId>commons-net</groupId><artifactId>commons-net</artifactId><version>${commons-net.version}</version></dependency><dependency><groupId>commons-beanutils</groupId><artifactId>commons-beanutils</artifactId><version>${commons-beanutils.version}</version></dependency><dependency><groupId>commons-lang</groupId><artifactId>commons-lang</artifactId><version>${commons-lang.version}</version></dependency><dependency><groupId>mons</groupId><artifactId>commons-lang3</artifactId><version>${commons-lang3.version}</version></dependency><dependency><groupId>mons</groupId><artifactId>commons-collections4</artifactId><version>${commons-collections4.version}</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>${fastjson.version}</version></dependency>方式底层支持分页支持高亮支持排序备注JSON http 是半是SQL http 是否是需要安装es-sql插件全文http 是半是API api 是是是需要引入相关工具jar 1.1 JSON方式此方式是通过传送JSON报文并调用ES服务端接口来实现检索的方式,JSON报文为ES2.2版本的官网RESTAPIAPI参考地址:通过EsClient工厂获取查询服务,getESSearch方法的第一个参数需传_ESSEARCHTYPE.JSON(JSON方式)String uri = "http://localhost:9200";ESClientFactory<InsuredDto>eSSearchFactory = new ESClientFactory<InsuredDto>(); ESSearch<InsuredDto>esSearch = eSSearchFactory.getESSearch(_ESSEARCHTYPE.JSON, uri);定义查询API(ES2.2版本官方API)String condition ="{\"from\":0,\"size\":10,\"query\":{\"bool\":{\"must\":{\"match\":{\"_all\":\"zzxxp p11223344556677889900\"}}}}}";设置查询信息,半支持高亮(需要同时在JSON中定义高亮条件,并在查询配置中设置对应高亮字段),分页、排序等需要在JSON中定义ESSearchConfig esconfig = new ESSearchConfig();/**设置索引类型*/esconfig.set_typename("insured");/**设置索引名称*/esconfig.set_indexname("index");/**设置查询条件*/esconfig.setCondition(condition);/**设置是否打印报文*/esconfig.set_showLog(true);/**设置是否打印报文*/esconfig.set_highlightFields("address,riskname");esSearch.setEsconfig(esconfig);调用检索方法ESSearchResponse<InsuredDto> insuredList = esSearch.search(InsuredDto.class); 1.2 SQL方式此方式是通过MYSQL语句来执行数据检索(需要自行安装es-sql插件,和系统使用数据库无关)通过EsClient工厂获取查询服务,getESSearch方法的第一个参数需传_ESSEARCHTYPE.SQL(SQL方式)String uri = "http://localhost:9200";ESClientFactory<InsuredDto>eSSearchFactory = new ESClientFactory<InsuredDto>(); ESSearch<InsuredDto>esSearch = eSSearchFactory.getESSearch(_ESSEARCHTYPE.SQL, uri);定义查询SQL,请注意,分页、排序需要按照MYSQL语法写,分页也支持通过配置设置String condition = "SELECT * FROM insured where _all ='zzxxpp11223344556677889900'limit0,10";设置查询信息,不支持高亮ESSearchConfig esconfig = new ESSearchConfig();/**设置索引类型*/esconfig.set_typename("insured");/**设置索引名称*/esconfig.set_indexname("index");/**设置查询条件*/esconfig.setCondition(condition);/**设置是否打印报文*/esconfig.set_showLog(true);esSearch.setEsconfig(esconfig);调用检索方法ESSearchResponse<InsuredDto> insuredList = esSearch.search(InsuredDto.class); 1.3 全文检索方式此方式是通过传入一个或多个关键字(多个关键字以半角空格分割)进行的相关性检索,此模式必须设置分页信息检索策略为:没查到没查到没查到term拆分查询match拆分查询match整体查询通配符查询通过EsClient工厂获取查询服务,getESSearch方法的第一个参数需传_ESSEARCHTYPE.FULLTEXT(全文检索方式)String uri = "http://localhost:9200";ESClientFactory<InsuredDto>eSSearchFactory = new ESClientFactory<InsuredDto>(); ESSearch<InsuredDto>esSearch = eSSearchFactory.getESSearch(_ESSEARCHTYPE.FULLTEXT, uri);定义全文查询内容,即EsClient会根据设置的查询内容根据设定的索引范围进行查询(检索策略见上文),也可以录入多项关键字进行查询,以半角空格分割String condition = "zzxxpp11223344556677889900";设置查询信息ESSearchConfig esconfig = new ESSearchConfig();/**设置索引类型*/esconfig.set_typename("insured");/**设置索引名称*/esconfig.set_indexname("index");/**设置查询条件*/esconfig.setCondition(condition);/**设置是否打印报文*/esconfig.set_showLog(true);/**设置高亮字段,以,分割*/esconfig.set_highlightFields("address,riskname");/**设置当前页数从1开始*/esconfig.setCurrentPage(1);/**设置每页数量*/esconfig.set_itemsPerPage(10);/**设置升序字段以,分割*/esconfig.set_asc("address");/**设置降序字段以,分割*/esconfig.set_desc("address");esSearch.setEsconfig(esconfig);调用检索方法ESSearchResponse<InsuredDto> insuredList = esSearch.search(InsuredDto.class); 1.4 API方式此方式是调用封装后的JEST(ES的java客户端工具,但仍然基于http方式)API进行调用检索目前支持的关系方式有1.must(与)constructor.must(new ESSearchBuliders().term("id", "zzxxpp11223344556677889900"))2.should(或)constructor.should(new ESSearchBuliders().term("id", "zzxxpp11223344556677889900"))封装了in的实现,调用下面should方法可实现in的操作String[] modelcodeTree = {"BJFAAI0001","ZZZZZI0154","HSHZZD0011"};constructor.should("modelcode",modelcodeTree,_ESDSL.Operator.TERM);3.mustNot(非)constructor.mustNot(new ESSearchBuliders().term("id", "zzxxpp11223344556677889900"))目前支持的比较方式有1.term(term匹配)constructor.must(new ESSearchBuliders().term("id", "zzxxpp11223344556677889900"))2.terms(多个term匹配,类似于SQL中的in)Collection<Object>c = new ArrayList<Object>();c.add("A");c.add("B");constructor.should(new ESSearchBuliders().terms("id", c))3.match(match匹配)constructor.must(new ESSearchBuliders().match("address", "陕西西安"))4.wildcard(通配符匹配,?单字通配、*多字通配)constructor.must(new ESSearchBuliders().wildcard("wildcard", "*ABC"))5.fuzzy(相似度查询)constructor.must(new ESSearchBuliders().fuzzy("fuzzy", "sting"))6.range(范围查询)constructor.must(new ESSearchBuliders().range("purchaseprice", 2100, 2200, true, false))7.rangelt(小于)constructor.must(new ESSearchBuliders().rangelt("purchaseprice", 2100))8.rangele(小于等于)constructor.must(new ESSearchBuliders().rangelte("purchaseprice", 2100))9.rangegt(大于)constructor.must(new ESSearchBuliders().rangegt("purchaseprice", 2100))10.rangege(大于等于)constructor.must(new ESSearchBuliders().rangegte("purchaseprice", 2100))11.MATCHPHRASE(全字匹配)constructor.must(new ESSearchBuliders().matchPhrase("modelname", "123"))通过EsClient工厂获取查询服务,getESSearch方法的第一个参数需传_ESSEARCHTYPE.API(API方式)String uri = "http://localhost:9200";ESClientFactory<InsuredDto>eSSearchFactory = new ESClientFactory<InsuredDto>();ESSearch<InsuredDto>esSearch = eSSearchFactory.getESSearch(_ESSEARCHTYPE.API, uri);定义查询ESSearchJestBuliderConstructorESSearchJestBuliderConstructor constructor = newESSearchJestBuliderConstructor(); constructor.must(new ESSearchBuliders().term("id", "zzxxpp11223344556677889900"))设置查询信息ESSearchConfig esconfig = new ESSearchConfig();/**设置索引类型*/esconfig.set_typename("insured");/**设置索引名称*/esconfig.set_indexname("index");/**设置查询条件*/esconfig.setCondition(condition);/**设置高亮字段,以,分割*/esconfig.set_highlightFields("address,riskname");/**设置是否打印报文*/esconfig.set_showLog(true);/**设置当前页数从1开始*/esconfig.setCurrentPage(1);/**设置每页数辆*/esconfig.set_itemsPerPage(10);/**设置升序字段以,分割*/esconfig.set_asc("address");/**设置降序字段以,分割*/esconfig.set_desc("address");/**设置constructor*/esconfig.setConstructor(constructor);esSearch.setEsconfig(esconfig);调用检索方法ESSearchResponse<InsuredDto> insuredList = esSearch.search(InsuredDto.class); 1.5 设置排序JSON方式设置排序需要定义在JSON报文中、SQL方式设置排序需要定义在SQL中API、全文检索方式以如下方式设置请勿同时使用/**设置升序字段以,分割*/esconfig.set_asc("address");/**设置降序字段以,分割*/esconfig.set_desc("address");esSearch.setEsconfig(esconfig);1.6 设置分页JSON方式设置分页需要定义在JSON报文中、SQL方式设置分页需要定义在SQL中API、全文检索方式以如下方式设置/**设置当前页数从1开始*/esconfig.setCurrentPage(1);/**设置每页数量*/esconfig.set_itemsPerPage(10);1.7 设置高亮JSON方式设置高亮需要分别在JSON报文和设置对象中定义、SQL方式不支持高亮API、全文检索方式以如下方式设置/**设置高亮字段,以,分割*/esconfig.set_highlightFields("address,riskname");返回对象中,如果设置的字段存在高亮信息(被检索的内容),那么返回对象的对应字段直接以HTML高亮代码返回(默认背景色为黄色)1.8 返回对象ESSearchResponse的描述∙T[] out:检索结果数据∙int count:查询结果总数量∙long longtimes:查询耗时∙String request:请求报文∙String response:返回报文∙当前页数量为out.length1.9 使用注解方式简化API调用esconfig只需要设置查询条件即可,esconfig设置值优先级大于注解配置注解都是需要声明再规则引擎出入参数Dto类中可以被注解替代的配置/**设置索引类型*/esconfig.set_typename("insured");/**设置索引名称*/esconfig.set_indexname("index");/**设置高亮字段,以,分割*/esconfig.set_highlightFields("address,riskname");/**设置是否打印报文*/esconfig.set_showLog(true);/**设置每页数辆*/esconfig.set_itemsPerPage(10);/**设置升序字段以,分割*/esconfig.set_asc("address");/**设置降序字段以,分割*/esconfig.set_desc("address");indexname、typename如何设置?//在传入的Class中定义头部注解@ESIndex(indexName="index",indexType="insured")publicclass InsuredDto {……高亮如何设置?//如果定义在类头部,则所有声明字段全部可以返回高亮@ESHighLightpublicclass InsuredDto {//如果定义在字段上,则所对应字段可以返回高亮,如下例:insuredname、address可返回高亮@ESHighLightprivate String insuredname;private String riskname;private String idNum;@ESHighLightprivate String address;打印交互信息以及报文如何设置?@ESShowLogpublicclass InsuredDto {//输出内容如下=====搜索引擎查询信息===== 【ESPRINT:2017-09-1211:19:32】索引名称(库):index 索引类型(表):insured 【ESPRINT:2017-09-1211:19:33】查询总数量:1【ESPRINT:2017-09-1211:19:33】当前分页数量:1【ESPRINT:2017-09-1211:19:33】查询时间(毫秒):1894【ESPRINT:2017-09-1211:19:33】请求报文:{"from":0,"size":10,"query":{"bool":{"must":{"mat……【ESPRINT:2017-09-1211:19:33】返回报文:{"took":43,"timed_out":false,"_shards":{"total":5……总数量:1当前数量:1查询时间(毫秒):1894==================每条内容===================InsuredDto [id=zzxxpp11223344556677889900, policyno=null, insuredname=你好7, riskname=nul……分页信息如何设置//_itemsPerPage表示每页条数@ESPagination(_itemsPerPage=10)publicclass InsuredDto {排序如何设置@ESSortAscprivate String endDate = "";@ESSortDescprivate String policyNo = "";通过注解的方式配置新增数据的索引信息类头部配置索引名称和类型的注解[@ESIndex]@ESIndex(indexName="index",indexType="insured")publicclass InsuredDto {……在字段中配置索引ID的注解[@ESId]@ESIdprivate String id;通过EsClient工厂获取更新服务String uri = "http://localhost:9200";ESClientFactory<InsuredDto>eSSearchFactory = new ESClientFactory<InsuredDto>(); ESHandle esHandle = eSSearchFactory.getESHandle( uri);对需要新增文档数据的对象进行赋值InsuredDto dto = new InsuredDto();dto.setId("zzxxpp11223344556677889900");dto.setInsuredname("你好7");调用新增文档API,返回值为成功或失败,布尔类型值boolean flag = esHandle.insertDoc(dto);注解配置详见新增数据部分通过EsClient工厂获取更新服务String uri = "http://localhost:9200";ESClientFactory<InsuredDto>eSSearchFactory = new ESClientFactory<InsuredDto>(); ESHandle esHandle = eSSearchFactory.getESHandle( uri);对需要更新文档数据的对象进行赋值InsuredDto dto = new InsuredDto();dto.setId("zzxxpp11223344556677889900");dto.setInsuredname("你好7");调用更新文档API,返回值为成功或失败,布尔类型值boolean flag = esHandle.updateDoc(dto);注解配置详见新增数据部分通过EsClient工厂获取更新服务String uri = "http://localhost:9200";ESClientFactory<InsuredDto>eSSearchFactory = new ESClientFactory<InsuredDto>(); ESHandle esHandle = eSSearchFactory.getESHandle( uri);对需要更新文档数据的删除进行赋值,可以只赋值ESID注解字段的值即可InsuredDto dto = new InsuredDto();dto.setId("zzxxpp11223344556677889900");调用删除文档API,返回值为成功或失败,布尔类型值boolean flag = esHandle.deleteDoc(dto);注解配置详见新增数据部分通过EsClient工厂获取更新服务String uri = "http://localhost:9200";ESClientFactory<InsuredDto>eSSearchFactory = new ESClientFactory<InsuredDto>(); ESHandle esHandle = eSSearchFactory.getESHandle( uri);对需要更新文档数据的删除进行赋值,可以只赋值ESID注解字段的值即可ArrayList<InsuredDto> ar = new ArrayList<InsuredDto>();for (int i = 0; i < 10; i++) {InsuredDto dto = new InsuredDto();dto.setInsuredCode("zzxxpp1122334455667788990a" + (i));dto.setId("zzxxpp1122334455667788990a" + (i));dto.setInsuredname("你好" + (i));ar.add(dto);}定义回调接口实现类BulkCallBack lll = new BulkCallBack() {@Overridepublicvoid beforeBulk(String requestData) {System.out.println("执行之前"+requestData);}@Overridepublicvoid afterBulk(String requestData, String responseData) {System.out.println("执行完成"+responseData);}@Overridepublicvoid afterBulk(String requestData, Throwable failure) {System.out.println("执行异常");}};调用批量操作方法esHandle.bulkProcess(lll, ar, _ESBULKOP.INSERT);批量操作包括:1._ESBULKOP.DELETE 批量删除2._ESBULKOP.UPDATE 批量更新3._ESBULKOP.INSERT 批量插入异步查询调用API详见以下示例代码String uri = "http://localhost:9200";ESSearchConfig esconfig = new ESSearchConfig();String condition ="{\"from\":0,\"size\":10,\"query\":{\"bool\":{\"must\":{\"match\":{\"_all\":\"zzxxp p11223344556677889900\"}}}}}";esconfig.setCondition(condition);ESClientFactory<InsuredDto> eSSearchFactory = new ESClientFactory<InsuredDto>(); ESSearch<InsuredDto> esSearch = null;//获取ES查询组件esSearch = eSSearchFactory.getESSearch(_ESSEARCHTYPE.JSON, uri, esconfig);//通过线程池工具类执行查询//需要传入一个ESSearchThreadCallBack接口的实现类,以便于回调ESSearchThreadPool.excutesAsyn(esSearch, InsuredDto.class, new ESSearchThreadCallBack() {@Overridepublic void callBack(ESSearchResponse esSearchResponse) {printMessage(esSearchResponse);}});异步新增、更新、删除数据默认以异步方式调用新增、更新、删除操作,API无变化如果不想以异步方式执行,则需要在入参对象类注解上添加:@ESSearchWithoutThreadPoolpublicclass InsuredDto {……批量更新数据暂未实现异步处理方式安装插件:elasticsearch-jdbc参考资料:操作过程(window本地操作)1.下载elasticsearch-jdbc并解压2.新建oracle_to_es.bat文件:主要配置参数说明:elasticsearch.cluster 集群名称,必须设置(与es服务配置相同)elasticsearch.port 传输端口,必须设置(注意:需要设置为transport_address的端口)sql 同步sql其他参数详见官方文档@echo offset DIR=%~dp0set LIB=%DIR%..\lib\*set BIN=%DIR%..\binset JAVA_HOME=C:\java\jdk1.8.0_101echo {^"type" : "jdbc",^"jdbc" : {^"url" : "jdbc:oracle:thin:@10.28.1.10:1521:coreoracle",^"user" : "online_old",^"password" : "online_old",^"sql" : "select modelcode as \"_id\",modelcode as \"modelcode\",modelname as \"modelname\",carbrand as \"carbrand\",carseriesname as \"carseriesname\",carkind as \"carkind\",purchaseprice as \"purchaseprice\",factory as \"factory\",platdeptname as \"platdeptname\" from prpdcarmodelnew",^"elasticsearch" : {^"host" : "localhost",^"cluster" : "elasticsearch",^"port" : 9300,^"autodiscover" : false^},^"index" : "car",^"type" : "carModel"^}^}^ | "%JAVA_HOME%\bin\java" -cp "%LIB%"-Dlog4j.configurationFile="%BIN%\log4j2.xml""org.xbib.tools.Runner""org.xbib.tools. JDBCImporter"3.将oracle驱动包拷贝到elasticsearch-jdbc/lib,注意:jdk1.8需要ojdbc7.jar4.启动oracle_to_es.bat(日志详见elasticsearch-jdbc/bin/logs/jdbc.log)5.建议同步前,将index、type、mapping建立好6.建议es服务提前建立为集群模式,其中集群名称需要与jdbc插件配置项elasticsearch.cluster对应,端口设置为es服务传输端口(注意:与CURD接口不同,默认9300)。
Elasticsearch权威指南(中文版)

Elasticsearch 权威指南(中文版)1、入门Elasticsearch是一个实时分布式搜索和分析引擎。
它让你以前所未有的速度处理大数据成为可能。
它用于全文搜索、结构化搜索、分析以及将这三者混合使用:维基百科使用Elasticsearch提供全文搜索并高亮关键字,以及输入实时搜索(search-as-you-type)和搜索纠错(did-you-mean)等搜索建议功能。
英国卫报使用Elasticsearch结合用户日志和社交网络数据提供给他们的编辑以实时的反馈,以便及时了解公众对新发表的文章的回应。
StackOverflow结合全文搜索与地理位置查询,以及more-like-this功能来找到相关的问题和答案。
Github使用Elasticsearch检索1300亿行的代码。
但是Elasticsearch不仅用于大型企业,它还让像DataDog以及Klout这样的创业公司将最初的想法变成可扩展的解决方案。
Elasticsearch可以在你的笔记本上运行,也可以在数以百计的服务器上处理PB级别的数据。
Elasticsearch所涉及到的每一项技术都不是创新或者革命性的,全文搜索,分析系统以及分布式数据库这些早就已经存在了。
它的革命性在于将这些独立且有用的技术整合成一个一体化的、实时的应用。
它对新用户的门槛很低,当然它也会跟上你技能和需求增长的步伐。
如果你打算看这本书,说明你已经有数据了,但光有数据是不够的,除非你能对这些数据做些什么事情。
很不幸,现在大部分数据库在提取可用知识方面显得异常无能。
的确,它们能够通过时间戳或者精确匹配做过滤,但是它们能够进行全文搜索,处理同义词和根据相关性给文档打分吗?它们能根据同一份数据生成分析和聚合的结果吗?最重要的是,它们在没有大量工作进程(线程)的情况下能做到对数据的实时处理吗?这就是Elasticsearch存在的理由:Elasticsearch鼓励你浏览并利用你的数据,而不是让它烂在数据库里,因为在数据库里实在太难查询了。
elasticsearch大数据量写入调优和原理解析

elasticsearch大数据量写入调优和原理解析
1.写入调优
(1)开启_bulk接口
将数据分批量的形式以_bulk接口导入,这种方式可以减少HTTP请求开销,加快写入速度。
(2)设置bulk大小
在设置_bulk接口请求时,可以根据实际情况更改bulk大小,这可以进一步提高写入速度。
(3)使用缓冲池
建议开启一个缓冲池,将待写入的数据先放入缓冲池,最后一次性提交给elasticsearch,可以极大的降低磁盘IO开销。
(4)避免重复写入
针对相同文档,由于elasticsearch默认情况下,会重复写入,因此检查是否有文档重复写入是很有必要的。
(5)负载均衡
搭建多个服务器,将数据按照哈希规则均衡分发到不同机器上,可以将负载均衡,同时也可以提高数据写入速度。
2.原理解析
Elasticsearch是一个分布式的搜索引擎,它的写入是分布式地完成的。
Elasticsearch分为两个步骤,一个是将数据写入索引,另一个是将数据以分片
的形式写入到指定的节点上。
首先,根据数据分片策略,将数据均衡的写入到不同的节点上,然后将这些数据放入对应的分片中,最后将这些分片提交给它的主节点。
当客户端发起搜索请求时,主节点会去本地分片中搜索数据,节点间也会进行分片的复制,以保证数据的恢复性。
ElasticSearch的基本原理与用法

ElasticSearch的基本原理与⽤法⼀、简介ElasticSearch和Solr都是基于Lucene的搜索引擎,不过ElasticSearch天⽣⽀持分布式,⽽Solr是4.0版本后的SolrCloud才是分布式版本,Solr的分布式⽀持需要ZooKeeper的⽀持。
语法参考:⼆、基本⽤法集群(Cluster): ES是⼀个分布式的搜索引擎,⼀般由多台物理机组成。
这些物理机,通过配置⼀个相同的cluster name,互相发现,把⾃⼰组织成⼀个集群。
节点(Node):同⼀个集群中的⼀个Elasticsearch主机。
Node类型:1)data node: 存储index数据。
Data nodes hold data and perform data related operations such as CRUD, search, and aggregations.2)client node: 不存储index,处理转发客户端请求到Data Node。
3)master node: 不存储index,集群管理,如管理路由信息(routing infomation),判断node是否available,当有node出现或消失时重定位分⽚(shards),当有node failure时协调恢复。
(所有的master node会选举出⼀个master leader node)主分⽚(Primary shard):索引(下⽂介绍)的⼀个物理⼦集。
同⼀个索引在物理上可以切多个分⽚,分布到不同的节点上。
分⽚的实现是Lucene 中的索引。
注意:ES中⼀个索引的分⽚个数是建⽴索引时就要指定的,建⽴后不可再改变。
所以开始建⼀个索引时,就要预计数据规模,将分⽚的个数分配在⼀个合理的范围。
副本分⽚(Replica shard):每个主分⽚可以有⼀个或者多个副本,个数是⽤户⾃⼰配置的。
ES会尽量将同⼀索引的不同分⽚分布到不同的节点上,提⾼容错性。
resthighlevelclient 重建索引

文章内容1. 介绍在 Elasticsearch 中,resthighlevelclient 是一个重要的组件,它提供了方便、灵活和高级的接口,用于与 Elasticsearch 进行交互。
在使用 resthighlevelclient 对索引进行操作时,重建索引是一个常见的需求,它可以用于重置索引的结构、重新组织数据,或者应对索引数据的变化和需求变更。
2. 重建索引的目的和意义重建索引是指在现有的索引基础上创建一个新的索引,并将源索引中的数据重新索引到新的索引中。
这样做的目的和意义主要包括:- 重新设计索引结构:当原有索引结构不满足实际需求时,需要对索引结构进行重新设计和优化。
- 数据迁移和整合:将原有索引中的数据重新组织和整合,以满足新的业务需求或数据分析需求。
- 处理数据变更:当索引中的数据发生变化,或者新的数据源加入时,需要对索引进行重新构建和整理。
3. resthighlevelclient 中的重建索引操作在使用 resthighlevelclient 对索引进行重建时,通常需要经历以下步骤:- 创建新的目标索引:在 Elasticsearch 中使用 API 创建一个新的索引,作为重建的目标索引。
- 设置映射和配置:根据实际需求设置新索引的映射和配置,确保满足需求和性能要求。
- 执行重建操作:使用 resthighlevelclient 将源索引中的数据重新索引到目标索引中,可以指定并发数和重试策略等参数。
- 监控和验证:在重建过程中需要实时监控和验证索引数据的完整性和准确性,以确保重建操作的成功和数据的一致性。
4. 我的观点和理解在实际项目中,我使用 resthighlevelclient 对索引进行重建的经验告诉我,重建索引是一个非常重要和复杂的操作。
在进行重建操作之前,需要对索引、数据和业务需求进行充分的评估和分析,确保重建操作能够顺利完成并达到预期的效果。
对于重建过程中可能出现的问题和异常情况,需要有相应的应对策略和故障处理手段,以保障系统的稳定和可靠。
elasticsearch的java client用法

elasticsearch的java client用法Elasticsearch是一个开源的、高可靠性、实时的分布式搜索和分析引擎。
它被广泛应用于日志分析、数据挖掘、企业搜索和许多其他领域。
而Java是Elasticsearch的官方推荐语言,拥有完善的Java客户端,提供了方便易用的API来操作Elasticsearch。
本文将详细介绍Elasticsearch的Java客户端的用法,以中括号为主题,向读者一步一步回答。
1. 引入Java客户端库使用Elasticsearch的Java客户端前,我们首先需要在项目中引入相应的库。
在Maven项目中,可以在pom.xml文件中添加以下依赖:<dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.15.1</version></dependency>2. 创建客户端连接通过Java客户端连接Elasticsearch需要指定主机和端口号。
可以使用`RestHighLevelClient`类来创建一个Elasticsearch客户端实例。
例如,创建一个连接到本地主机(localhost)的客户端:RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));以上代码创建了一个连接到本地主机的Elasticsearch客户端。
其中`localhost`是要连接的主机名,`9200`是Elasticsearch服务的默认端口号,`http`是协议。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
elasticsearch java api——客户端org.elasticsearch.clientorg.elasticsearch.client.AdminClient接口AdminClient下有两个方法:1)cluster(),产生一个允许从集群中执行action或操作的client;2)indices(),产生一个允许从索引中执行action或操作的client。
AdminClient接口有两个实现类,分别为org.elasticsearch.client.AdminClient.NodeAdminClient和org.elasticsearch.client.transport.support.InternalTransportAdminClient。
1.1org.elasticsearch.client.AdminClient.NodeAdminClient类NodeAdminClient有一个带有@Inject注解的构造器,并实现了接口AdminClient 的两个方法,如下所示:[java]view plaincopy1.@Inject2.public NodeAdminClient(Settings settings,NodeClusterAdminClient clusterAdminClient,NodeIndicesAdminClient indice sAdminClient){3.super(settings);4.this.indicesAdminClient=indicesAdminClient;5.this.clusterAdminClient=clusterAdminClient;6.}7.8.@Override9.public IndicesAdminClient indices(){10.return indicesAdminClient;11.}12.13.@Override14.public ClusterAdminClient cluster(){15.return this.clusterAdminClient;16.}@Inject导致了一个直接的后果:你只能通过被@Inject标注的构造器生成实例。
indices()和cluster()覆盖了AdminClient的同名方法,分别返回NodeIndicesAdminClient和NodeClusterAdminClient对象。
NodeAdminClient会继承父类ponent.AbstractComponent的nodeName()方法用以获取当前节点的名称。
1.2org.elasticsearch.client.transport.support.InternalTransportAdminClient类InternalTransportAdminClient其实与NodeAdminClient类似,只是它的indices()和cluster()分别返回的是InternalTransportIndicesAdminClient和InternalTransportClusterAdminClient。
NodeAdminClient和InternalTransportAdminClient均没有子类,所以只有当我们需要用到NodeIndicesAdminClient、NodeClusterAdminClient、InternalTransportIndicesAdminClient或InternalTransportClusterAdminClient时,才考虑创建这两个类的实体。
2org.elasticsearch.client.Client接口Client为从集群中执行action或operation提供了一站式接口,这里的所有操作都是自然而然地异步执行的,每个action或operation都有两种风格,一种是简单地返回一个org.elasticsearch.action.ActionFuture,另一种是访问一个org.elasticsearch.action.ActionListener。
你可以在org.elasticsearch.node.Node启动时取得一个Client,也可以使用org.elasticsearch.client.transport.TransportClient 远程连接一个或多个节点。
Client有以下方法:1)close(),关闭客户端;2)admin(),返回一个可以执行管理性操作的客户端;3)两个execute,用于执行一般性操作,这里的一般性与上文提到的管理性相对;4)prepareExecute,准备一个RequestBuilder对象,得到RequestBuilder对象后再做执行操作,当然,在这之间,你可以做一些个性化设置;5)index(IndexRequest request),根据给写的index和type索引一个JSON资源,index和type由IndexRequest提供,IndexRequest也可提供id,若不提供时,id 将自动生成;6)index(IndexRequest request,ActionListener<IndexResponse>listener),与index(IndexRequest request)的区别在于它不会直接返回索引创建的结果,而是将结果转给监听器,由listener来通知请求者;7)prepareIndex()、prepareIndex(String index,String type)、prepareIndex(String index,String type,@Nullable String id),准备创建索引,但不创建索引;8)update(UpdateRequest request),基于一个script更新文档,返回更新后的结果;9)update(UpdateRequest request,ActionListener<UpdateResponse>listener),更新,但不返回结果,而是交由监听器;10)prepareUpdate()、prepareUpdate(String index,String type,String id),准备更新,但不执行更新;11)delete(DeleteRequest request)、delete(DeleteRequest request, ActionListener<DeleteResponse>listener),根据DeleteRequest提供的index、type 和id从索引中删除文档;12)prepareDelete()、prepareDelete(String index,String type,String id),准备删除,但不执行删除;13)bulk(BulkRequest request)、bulk(BulkRequest request,ActionListener<BulkResponse>listener),批量操作;14)prepareBulk(),准备执行批量操作,但不执行;15)deleteByQuery(DeleteByQueryRequest request)、deleteByQuery(DeleteByQueryRequest request,ActionListener<DeleteByQueryResponse>listener),基于查询删除索引;16)prepareDeleteByQuery(String...indices),准备删除,但不执行删除;17)get(GetRequest request)、get(GetRequest request,ActionListener<GetResponse>listener)根据GetRequest提供的index、type和id 获取文档;18)prepareGet()、prepareGet(String index,@Nullable String type,String id),准备获取,但不执行获取;19)multiGet(MultiGetRequest request)、multiGet(MultiGetRequest request, ActionListener<MultiGetResponse>listener),批量获取文档;20)prepareMultiGet(),准备批量获取,但不执行获取操作;21)count(CountRequest request)、count(CountRequest request, ActionListener<CountResponse>listener),获取适应特定query的文档数量;22)prepareCount(String...indices),准备获取适应特定query的文档数量,但不获取;23)search(SearchRequest request)、search(SearchRequest request, ActionListener<SearchResponse>listener),根据SearchRequest提供的index、id和type执行搜索;24)prepareSearch(String...indices),准备但不搜索;25)searchScroll(SearchScrollRequest request)、searchScroll(SearchScrollRequest request,ActionListener<SearchResponse> listener)、prepareSearchScroll(String scrollId),通过用于迭代搜索结果;26)multiSearch(MultiSearchRequest request)、multiSearch(MultiSearchRequest request,ActionListener<MultiSearchResponse>listener)、prepareMultiSearch(),执行多个搜索请求;27)moreLikeThis(MoreLikeThisRequest request)、moreLikeThis(MoreLikeThisRequest request,ActionListener<SearchResponse> listener)、prepareMoreLikeThis(String index,String type,String id),类似于数据库中的like操作,先根据index、type、id找到一个document,再找到跟这个文档like 的其他文档;28)percolate(PercolateRequest request)、percolate(PercolateRequest request, ActionListener<PercolateResponse>listener)、preparePercolate(String index, String type),过滤一个请求,返回匹配的结果;29)explain(ExplainRequest request)、explain(ExplainRequest request, ActionListener<ExplainResponse>listener)、prepareExplain(String index,String type,String id),为指定的请求计算一个score。