序言
到目前为止,我们一贯都是利用RESTful风格的 API操作elasticsearch做事,但是通过我们之前的学习知道,elasticsearch供应了很多措辞的客户端用于操作elasticsearch做事,例如:java、python、.net、JavaScript、PHP等。而我们这次就学习如何利用java措辞来操作elasticsearch做事。在elasticsearch的官网上供应了两种java措辞的API,一种是Java Transport Client,一种是Java REST Client。
而Java REST Client又分为Java Low Level REST Client和Java High Level REST Client,Java High Level REST Client是在Java Low Level REST Client的根本上做了封装,使其以更加面向工具和操作更加便利的办法调用elasticsearch做事。
官方推举利用Java High Level REST Client,由于在实际利用中,Java Transport Client在大并发的情形下会涌现连接不稳定的情形。
那接下来我们就来看看elasticsearch供应的Java High Level REST Client(以下简称高等REST客户端)的一些根本的操作,跟多的操作大家自行阅读elasticsearch的官方文档:https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high.html在官网上已经对高等REST客户真个各种API做了很详细的利用解释,我们这篇文章紧张还是翻译官网上的内容,先让大家以更友好的中文文档办法入门,等大家熟习了这些API之后在查阅官网。
测试项目
在这里我也做了一个高等REST客户真个利用测试,该测试项目利用springboot开拓,并且利用反射和泛型做了大略单纯的封装,加强通用性。该项目的GitHub地址在以下链接:
https://github.com/luohaipeng/es-java-api
高等REST客户端利用
导入依赖
我们这里以maven为例,利用高等REST客户端须要两个依赖,分别是:
<dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>6.2.4</version> </dependency> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>6.2.4</version> </dependency>
这两个依赖的版本是跟elasticsearch做事版本同步更新的,以是选择的依赖版本无需按照我这里的版本,而因此自己的elasticsearch做事的版本为主。
初始化
首先,我们想要操作elasticsearch,那必须先创建出连接的客户端工具,创建客户端工具的API如下:
String[] ips = {\"大众192.168.85.133:9200\"大众,\"大众192.168.85.133:9400\"大众} HttpHost[] httpHosts = new HttpHost[ips.length]; for(int i=0;i<ips.length;i++){ httpHosts[i] = HttpHost.create(ips[i]); } RestClientBuilder builder = RestClient.builder(httpHosts); RestHighLevelClient client = new RestHighLevelClient(builder);
得到的RestHighLevelClient工具便是我们接下来操作elasticsearch所须要的了。
插入和更新文档操作
插入和更新文档须要我们构建一个IndexRequest工具。
布局方法:IndexRequest(String index, String type, String id)第一个参数是该文档插入到哪个索引中,第二个参数是该文档插入到哪个文档类型中,第三个参数是指定文档的id。设置文档内容方法:source()该方法有多个重载方法,我们可以把文档内容以json字符串的办法通报,也可以以xml办法通报,还可以用Map办法通报。更新文档操作:调用高等REST客户真个index方法,并传入IndexRequest工具。详细代码如下:public void insertOrUpdate(Object o) throws Exception { Map map = BeanUtil.bean2Map(o); IndexRequest request = new IndexRequest(baseIndex, baseType, map.get(\"大众id\公众)+\"大众\公众); request.source(map); client.index(request); }
通过文档id删除文档
删除文档操作须要创建DeleteRequest工具。
布局方法:常用的布局方法:DeleteRequest(String index, String type, String id)第一个参数代表将要删除的该文档所在的索引,第二个参数代表将要删除的索引所在的文档类型,第三个参数代表要删除的文档对应的id删除文档:调用高等REST客户真个delete方法,并传入DeleteRequest工具。详细代码如下:public void delete(Long id) throws Exception { DeleteRequest request = new DeleteRequest(baseIndex, baseType, id + \公众\"大众); client.delete(request); }
通过文档id获取文档
通过文档id获取文档须要创建GetRequest工具。
布局方法:常用布局方法:GetRequest(String index, String type, String id)第一个参数代表要获取的文档所在的索引,第二个参数代表要获取的索引所在的文档类型,第三个参数代表要获取的文档对应的id获取文档:调用高等REST客户真个get方法,并传入GetRequest工具。返回结果:返回GetResponse工具,可以利用该工具的getSource()方法,得到文档数据,该数据封装成Map工具。详细代码如下:public T get(Long id) throws Exception { GetRequest request = new GetRequest(baseIndex, baseType, id+\公众\公众); GetResponse response = client.get(request); Map<String, Object> source = response.getSource(); T t = BeanUtil.map2Bean(source, clazz); return t; }
搜索文档
搜索文档须要创建SearchRequest工具。
设置搜索的索引:indices(String... indices),elasticsearch许可对多个索引一起搜索,以是SearchRequest工具中的indices方法可以设置多个索引。设置搜索的文档类型:types(String... types),elasticsearch许可对多个文档类型一起搜索,以是SearchRequest工具中的types方法可以设置多个文档类型。设置搜索条件:搜索条件须要封装在SearchSourceBuilder工具中,我们只须要new SearchSourceBuilder()出该工具出来,然后为该工具设置搜索条件和数据范围干系参数即可。数据范围由from(int from)方法和 size(int size)方法指定。搜索条件由query(QueryBuilder query)方法设置。QueryBuilder工具便是终极封装搜索条件的工具,一个搜索条件就须要创建出一个该工具,该工具不须要我们手动创建,可以从QueryBuilders获取,QueryBuilders定义了各种搜索匹配的办法,我们只须要传入搜索的文档字段即可。设置搜索关键字高亮:当我们输入关键字搜索,如果能搜索出相应的文档,那一样平常我们都会在该文档上,把匹配到的关键字高亮显示,设置高亮显示的工具为HighlightBuilder,该工具有两个方法,preTags()高亮前缀,postTags()高亮后缀,通过这两个前缀和后缀,把搜索匹配到的文档中,涌现的搜索关键字的地方包裹起来,实现高亮的效果。创建出来的HighlightBuilder设置到SearchSourceBuilder中。然后SearchSourceBuilder又设置到SearchRequest工具中。搜索:调用高等REST客户真个search方法,并传入SearchRequest工具。返回结果:返回SearchResponse工具,调用该工具的getHits()方法,获取返回结果,并终极转为我们自己的业务Page工具。详细代码如下:public PageResult search(QueryObject qo) throws Exception { SearchRequest request = new SearchRequest(); request.indices(baseIndex); request.types(baseType); SearchSourceBuilder sourceBuilder = qo.createSearchSourceBuilder(); HighlightBuilder highlightBuilder = qo.createHighlightBuilder(); sourceBuilder.highlighter(highlightBuilder); request.source(sourceBuilder); SearchResponse response = client.search(request); SearchHits searchHits = response.getHits(); long total = searchHits.getTotalHits(); SearchHit[] searchHitArray = searchHits.getHits(); List<T> data = new ArrayList<>(); for(SearchHit hit : searchHitArray){ Map<String, Object> source = hit.getSourceAsMap(); T t = BeanUtil.map2Bean(source, clazz); qo.setHighlightFields(t,hit); data.add(t); } return new PageResult(data,Integer.parseInt(total+\公众\"大众),qo.getCurrentPage(),qo.getPageSize()); }