赞
踩
刚学习了使用Java客户端来操作本地elasticsearch,这里记录一下使用方法!
开发工具:IntelliJ IDEA 2019.3
在使用Java客户端操作之前,要在本地先配置集群哦!下面是配置方法
window10下elasticsearch创建集群方法(本地)
先在idea上创建一个基于maven的空项目,使用maven来引入相关jar包
在pom.xml文件里面导入相关jar包,如果想要导入其他版本的,到mvnrepository里面找就可以了
<dependencies> <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>7.6.2</version> </dependency> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>transport</artifactId> <version>7.6.2</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-to-slf4j</artifactId> <version>2.13.1</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.30</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.7.21</version> <scope>test</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>compile</scope> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.9.8</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.8</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.9.8</version> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-elasticsearch</artifactId> <version>3.2.6.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>5.1.5.RELEASE</version> <scope>test</scope> </dependency> <dependency> <groupId>org.elasticsearch.plugin</groupId> <artifactId>transport-netty4-client</artifactId> <version>7.1.1</version> </dependency> </dependencies>
导入包后,如果运行时出现错误提示是jar包有冲突的,可以去插件plugins里面下载maven helper 插件,在pom.xml里面查看哪些冲突了,具体方法看这位大佬的解决方法:idea中解决jar包冲突方法
在src/main/java下新建package,命名随意,这里为 com.es,然后建Java文件
这里要先封装一个article,下面会用到
package com.es.entity; public class Article { //文章ID private long id; //文章标题 private String title; //文章内容 private String content; //getter和setter方法 public long getId() { return id; } public void setId(long id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } }
import com.es.entity.Article; import com.fasterxml.jackson.databind.ObjectMapper; import org.elasticsearch.client.transport.TransportClient; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.TransportAddress; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.common.xcontent.XContentType; import org.elasticsearch.transport.client.PreBuiltTransportClient; import org.junit.Before; import org.junit.Test; import java.net.InetAddress; public class ESClientTest { private TransportClient client; @Before public void init() throws Exception{ //创建settings对象,配置集群名称 //注意这里集群名称要跟自己本地配置的名称一致 Settings settings = Settings.builder().put("cluster.name","my-es").build(); //创建客户端对象,端口号也是上面配置本地集群的端口号 client = new PreBuiltTransportClient(settings); client.addTransportAddress(new TransportAddress(InetAddress.getByName("127.0.0.1"),9301)); client.addTransportAddress(new TransportAddress(InetAddress.getByName("127.0.0.1"),9302)); client.addTransportAddress(new TransportAddress(InetAddress.getByName("127.0.0.1"),9303)); } /** * 创建索引方法 * @throws Exception */ @Test public void createIndex() throws Exception{ //使用client创建一个索引库,并执行操作 client.admin().indices().prepareCreate("index").get(); //关闭client client.close(); } /** * 创建文档方法1 * @throws Exception */ @Test public void addDocument1() throws Exception{ //创建一个文档对象,这里是 XContentBuilder builder = XContentFactory.jsonBuilder() .startObject() .field("id",1) .field("title","this is a title") .field("content","this is content!") .endObject(); //把文档对象添加到索引库 client.prepareIndex() .setIndex("index") //设置索引名称 .setType("article") //设置type .setId("1") //设置文档id,如果不设置自动生成 .setSource(builder) //设置文档信息 .get(); //执行操作 //关闭client客户端 client.close(); } /** * 创建文档方法2 * 由于方法1过于麻烦,所以一般用方法2这种形式 * @throws Exception */ @Test public void addDocument2() throws Exception{ //创建article对象 Article article = new Article(); //设置对象属性 article.setId(2); article.setTitle("this is a title"); article.setContent("there are some things"); //把article对象装换成json格式对象 ObjectMapper objectMapper = new ObjectMapper(); String jsonDocument = objectMapper.writeValueAsString(article); System.out.println(jsonDocument); //使用client对象把文档写入索引库 client.prepareIndex("index","article","2") .setSource(jsonDocument, XContentType.JSON) .get(); //关闭client client.close(); } /** * 创建多个文档,为搜索提供数据 * @throws Exception */ @Test public void addDocument3() throws Exception{ for (int i = 3; i<20 ;i++) { //创建article对象 Article article = new Article(); //设置对象属性 article.setId(i); article.setTitle("this is a title"+i); article.setContent("you worth it"+i); //把article对象装换成接送格式对象 ObjectMapper objectMapper = new ObjectMapper(); String jsonDocument = objectMapper.writeValueAsString(article); System.out.println(jsonDocument); //使用client对象把文档写入索引库 client.prepareIndex("index", "article", i+"") .setSource(jsonDocument, XContentType.JSON) .get(); } //关闭client client.close(); } }
由于创建client客户端是每个方法都必须完成的工作,为了减少代码冗余,就把他提取到@Before里面,@Before注解的功能就是无论执行哪个Test,都会先运行@Before下面的方法再运行Test注解下的方法,所以很好的解决了代码冗余
import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.client.transport.TransportClient; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.text.Text; import org.elasticsearch.common.transport.TransportAddress; import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.SearchHits; import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder; import org.elasticsearch.search.fetch.subphase.highlight.HighlightField; import org.elasticsearch.transport.client.PreBuiltTransportClient; import org.junit.Before; import org.junit.Test; import java.net.InetAddress; import java.util.Iterator; import java.util.Map; public class searchIndexTest { private TransportClient client; @Before public void init() throws Exception{ //创建settings对象,配置集群名称 Settings settings = Settings.builder().put("cluster.name","my-es").build(); //创建客户端对象 client = new PreBuiltTransportClient(settings); client.addTransportAddress(new TransportAddress(InetAddress.getByName("127.0.0.1"),9301)); client.addTransportAddress(new TransportAddress(InetAddress.getByName("127.0.0.1"),9302)); client.addTransportAddress(new TransportAddress(InetAddress.getByName("127.0.0.1"),9303)); } private void search(QueryBuilder queryBuilder) throws Exception{ //执行查询 SearchResponse searchResponse = client.prepareSearch("index") .setTypes("article") .setQuery(queryBuilder) .get(); //取查询结果 SearchHits searchHits = searchResponse.getHits(); //取查询结果总记录数 System.out.println("查询结果总记录数"+searchHits.getTotalHits()); //查询结果列表 Iterator<SearchHit> iterator = searchHits.iterator(); while (iterator.hasNext()){ SearchHit searchHit = iterator.next(); //以json格式输出 System.out.println(searchHit.getSourceAsString()); } //关闭client client.close(); } /** * ID查询步骤: * 1.创建一个client对象 * 2.创建查询对象 * 3.使用client执行查询 * 4.得到查询结果 * 5.取查询结果总记录数 * 6.取查询结果列表 * 7.关闭client */ @Test public void searchById() throws Exception{ //创建一个client对象 //创建查询对象 QueryBuilder queryBuilder = QueryBuilders.idsQuery().addIds("1","2"); search(queryBuilder); } /** * 字段查询 * @throws Exception */ @Test public void searchByTerm() throws Exception{ QueryBuilder queryBuilder = QueryBuilders.termQuery("title","is"); search(queryBuilder); } /** * string查询 * @throws Exception */ @Test public void queryString() throws Exception{ QueryBuilder queryBuilder = QueryBuilders.queryStringQuery("is") .defaultField("content"); search(queryBuilder); } /** * 分页查询 * @throws Exception */ @Test public void pageQuery() throws Exception{ QueryBuilder queryBuilder = QueryBuilders.queryStringQuery("this") .defaultField("title"); //执行查询 SearchResponse searchResponse = client.prepareSearch("index") .setTypes("article") .setQuery(queryBuilder) //设置分页信息 .setFrom(0) //起始位置 .setSize(5) //每页显示数量 .get(); //取查询结果 SearchHits searchHits = searchResponse.getHits(); //取查询结果总记录数 System.out.println("查询结果总记录数"+searchHits.getTotalHits()); //查询结果列表 Iterator<SearchHit> iterator = searchHits.iterator(); while (iterator.hasNext()){ SearchHit searchHit = iterator.next(); //以json格式输出 System.out.println(searchHit.getSourceAsString()); } //关闭client client.close(); } /** * 查询字段高亮显示 * @throws Exception */ @Test public void highView() throws Exception{ String highlightField = "title"; HighlightBuilder highlightBuilder = new HighlightBuilder(); highlightBuilder.field(highlightField); highlightBuilder.preTags("<em>"); //这里相当于前端添加标签<em> highlightBuilder.postTags("</em>"); QueryBuilder queryBuilder = QueryBuilders.queryStringQuery("this") .defaultField("title"); //执行查询 SearchResponse searchResponse = client.prepareSearch("index_hello") .setTypes("article") .setQuery(queryBuilder) //设置分页信息 .setFrom(0) //起始位置 .setSize(5) //每页显示行数 //设置高亮显示 .highlighter(highlightBuilder) .get(); //取查询结果 SearchHits searchHits = searchResponse.getHits(); //取查询结果总记录数 System.out.println("查询结果总记录数"+searchHits.getTotalHits()); //查询结果列表 Iterator<SearchHit> iterator = searchHits.iterator(); while (iterator.hasNext()){ SearchHit searchHit = iterator.next(); //以json格式输出 System.out.println(searchHit.getSourceAsString()); //高亮输出 System.out.println("--------高亮输出--------"); Map<String, HighlightField> highlight = searchHit.getHighlightFields(); System.out.println(highlight); //取高亮显示的结果 System.out.println("--------高亮显示结果输出--------"); HighlightField field = highlight.get(highlightField); Text[] fragments = field.getFragments(); if (fragments != null){ String title = fragments[0].toString(); System.out.println(title); } } //关闭client client.close(); } }
由于执行查询的代码都是一样的,所以避免冗余,提取相同的代码放入search方法中
我是在B站学的,有什么不懂的可以去B站看看视频,比较容易理解(下面贴上地址)
【狂神说Java】ElasticSearch7.6.x最新完整教程通俗易懂
Tip:代码来源是第一个视频,个人觉得可以直接看第二个
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。