Idea操作ElasticSearch
Posted zzzzn
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Idea操作ElasticSearch相关的知识,希望对你有一定的参考价值。
前提:
1、ES服务成功启动
2、node.js成功启动
一、创建索引库
1、目录展示
2、导入依赖
<dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>5.6.8</version> </dependency> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>transport</artifactId> <version>5.6.8</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-to-slf4j</artifactId> <version>2.9.1</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.24</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.7.21</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.12</version> </dependency>
3、MyESTest代码
package com.zn; import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest; import org.elasticsearch.client.Requests; import org.elasticsearch.client.transport.TransportClient; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.InetSocketTransportAddress; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.transport.client.PreBuiltTransportClient; import org.junit.jupiter.api.Test; import java.io.IOException; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.concurrent.ExecutionException; public class MyESTest { /** * 创建索引 * @throws UnknownHostException */ @Test public void creatIndex() throws UnknownHostException { //创建Client连接对象 Settings settings = Settings.builder().put("cluster.name", "my-application").build(); //设置IP地址和端口号 TransportClient client = new PreBuiltTransportClient(settings).addTransportAddress( new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300)); //创建名称为es_test1的索引 client.admin().indices().prepareCreate("es_test1").get(); //释放资源 client.close(); } }
4、修改elasticsearch.yml配置文件
cluster.name与代码块中cluster.name必须一致!!
5、重启elasticsearch
6、控制台效果
7、访问localhost:9100查看
二、创建映射mapping
1、MyESTest代码
package com.zn; import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest; import org.elasticsearch.client.Requests; import org.elasticsearch.client.transport.TransportClient; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.InetSocketTransportAddress; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.transport.client.PreBuiltTransportClient; import org.junit.jupiter.api.Test; import java.io.IOException; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.concurrent.ExecutionException; public class MyESTest { /** * 创建映射mapping */ @Test public void creatMapping() throws IOException, ExecutionException, InterruptedException { //创建Client连接对象 Settings settings = Settings.builder().put("cluster.name", "my-application").build(); //设置IP地址和端口号 TransportClient client = new PreBuiltTransportClient(settings).addTransportAddress( new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300)); //添加映射 XContentBuilder builder= XContentFactory.jsonBuilder() .startObject() .startObject("article") .startObject("properties") .startObject("id") .field("type","integer").field("store","yes") .endObject() .startObject("title") .field("type","string").field("store","yes").field("analyzer","ik_smart") .endObject() .startObject("content") .field("type","string").field("store","yes").field("analyzer","ik_smart") .endObject() .endObject() .endObject() .endObject(); //创建映射 PutMappingRequest mappingRequest= Requests.putMappingRequest("es_test1").type("article").source(builder); client.admin().indices().putMapping(mappingRequest).get(); //释放资源 client.close(); } }
2、访问localhost:9100查看
3、查看mappings
三、通过XContentBuilder建立文档document
1、MyESTest代码
package com.zn; import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest; import org.elasticsearch.client.Requests; import org.elasticsearch.client.transport.TransportClient; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.InetSocketTransportAddress; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.transport.client.PreBuiltTransportClient; import org.junit.jupiter.api.Test; import java.io.IOException; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.concurrent.ExecutionException; public class MyESTest { /** * 通过XContentBuilder创建文档document */ @Test public void createXContentBuilderDocument() throws IOException { //创建Client连接对象 Settings settings = Settings.builder().put("cluster.name", "my-application").build(); //设置IP地址和端口号 TransportClient client = new PreBuiltTransportClient(settings).addTransportAddress( new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300)); //创建文档信息 XContentBuilder builder = XContentFactory.jsonBuilder() .startObject() .field("id", 1) .field("title", "ElasticSearch是一个基于Lucene的搜索服务器") .field("content", "它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。" + "Elasticsearch是用 Java开发的,并作为Apache许可条款下的开放源码发布," + "是当前流行的企业级搜索引擎。设计用于云计算中,能够达到 实时搜索,稳定,可靠,快速,安装使用方便。") .endObject(); //创建文档对象 //参数一:索引对象;参数二:类型;参数三:建立id client.prepareIndex("es_test1", "article", "1").setSource(builder).get(); //释放资源 client.close(); } }
2、访问localhost:9100查看
四、使用Jackson转换实体建立文档document
1、目录展示
2、创建Article实体
package com.zn.entity; public class Article { private Integer id; private String title; private String content; public Integer getId() { return id; } public void setId(Integer 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; } }
3、添加jackson坐标 (导入依赖)
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.8.1</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.8.1</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.8.1</version> </dependency>
4、MyESTest代码
package com.zn.myTest; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.zn.entity.Article; import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest; import org.elasticsearch.client.Requests; import org.elasticsearch.client.transport.TransportClient; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.InetSocketTransportAddress; 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.jupiter.api.Test; import java.io.IOException; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.concurrent.ExecutionException; public class MyESTest { /** * 使用Jackson转换实体建立文档document */ @Test public void creatJacksonDocument() throws UnknownHostException, JsonProcessingException { //创建Client连接对象 Settings settings = Settings.builder().put("cluster.name", "my-application").build(); //设置IP地址和端口号 TransportClient client = new PreBuiltTransportClient(settings).addTransportAddress( new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300)); //描述json 数据 Article article = new Article(); article.setId(2); article.setTitle("搜索工作其实很快乐"); article.setContent("我们希望我们的搜索解决方案要快,我们希望有一个零配置和一个完全免费的搜索模式"); ObjectMapper objectMapper=new ObjectMapper(); //创建文档 client.prepareIndex("es_test1","article",article.getId().toString()) .setSource(objectMapper.writeValueAsString(article).getBytes(), XContentType.JSON).get(); //释放资源 client.close(); } }
5、访问localhost:9100查看
五、关键词查询文档document
1、MyESTest代码
package com.zn.myTest; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.zn.entity.Article; import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest; import org.elasticsearch.action.search.SearchRequestBuilder; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.client.Requests; import org.elasticsearch.client.transport.TransportClient; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.InetSocketTransportAddress; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.common.xcontent.XContentType; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.SearchHits; import org.elasticsearch.transport.client.PreBuiltTransportClient; import org.junit.jupiter.api.Test; import java.io.IOException; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.Iterator; import java.util.concurrent.ExecutionException; public class MyESTest { /** * 关键词查询文档document */ @Test public void selectWordDocument() throws UnknownHostException { //创建Client连接对象 Settings settings = Settings.builder().put("cluster.name", "my-application").build(); //设置IP地址和端口号 TransportClient client = new PreBuiltTransportClient(settings).addTransportAddress( new InetSocketTransportAddress(InetAddress. getByName("127.0.0.1"), 9300)); //设置搜索条件 SearchResponse searchResponse = client.prepareSearch("es_test1") .setTypes("article") .setQuery(QueryBuilders.termQuery("content","搜索")).get(); //获取命中次数,查询结果有多少对象 SearchHits hits = searchResponse.getHits(); System.out.println("查询结果有:"+hits.getTotalHits()+"条"); //遍历搜索结果数据 Iterator<SearchHit> iterator = hits.iterator(); while (iterator.hasNext()){ //每个查询对象 SearchHit searchHit = iterator.next(); //获取字符串格式打印 System.out.println(searchHit.getSourceAsString()); System.out.println("title:"+searchHit.getSource().get("title")); } //释放资源 client.close(); } }
2、控制台
六、字符串查询文档document
1、MyESTest代码
package com.zn.myTest; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.zn.entity.Article; import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.client.Requests; import org.elasticsearch.client.transport.TransportClient; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.InetSocketTransportAddress; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.common.xcontent.XContentType; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.SearchHits; import org.elasticsearch.transport.client.PreBuiltTransportClient; import org.junit.jupiter.api.Test; import java.io.IOException; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.Iterator; import java.util.concurrent.ExecutionException; public class MyESTest { /** * 字符串查询文档document */ @Test public void selectStringDocument() throws UnknownHostException { //创建Client连接对象 Settings settings = Settings.builder().put("cluster.name", "my-application").build(); //设置IP地址和端口号 TransportClient client = new PreBuiltTransportClient(settings).addTransportAddress( new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300)); //设置搜索条件 SearchResponse searchResponse = client.prepareSearch("es_test1") .setTypes("article") .setQuery(QueryBuilders.queryStringQuery("搜索")).get(); //获取命中次数,查询结果有多少对象 SearchHits hits = searchResponse.getHits(); System.out.println("查询结果有:"+hits.getTotalHits()+"条"); //遍历搜索结果数据 Iterator<SearchHit> iterator = hits.iterator(); while (iterator.hasNext()){ //每个查询对象 SearchHit searchHit = iterator.next(); //获取字符串格式打印 System.out.println(searchHit.getSourceAsString()); System.out.println("title:"+searchHit.getSource().get("title")); } //释放资源 client.close(); } }
2、控制台
七、使用文档id查询文档
1、MyESTest代码
package com.zn.myTest; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.zn.entity.Article; import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.client.Requests; import org.elasticsearch.client.transport.TransportClient; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.InetSocketTransportAddress; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.common.xcontent.XContentType; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.SearchHits; import org.elasticsearch.transport.client.PreBuiltTransportClient; import org.junit.jupiter.api.Test; import java.io.IOException; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.Iterator; import java.util.concurrent.ExecutionException; public class MyESTest { /** * 使用文档id查询文档 */ @Test public void selectIdDocument() throws UnknownHostException { //创建Client连接对象 Settings settings = Settings.builder().put("cluster.name", "my-application").build(); //设置IP地址和端口号 TransportClient client = new PreBuiltTransportClient(settings).addTransportAddress( new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300)); //设置搜索条件 SearchResponse searchResponse = client.prepareSearch("es_test1") .setTypes("article") .setQuery(QueryBuilders.idsQuery().addIds("2")).get(); //获取命中次数,查询结果有多少对象 SearchHits hits = searchResponse.getHits(); System.out.println("查询结果有:"+hits.getTotalHits()+"条"); //遍历搜索结果数据 Iterator<SearchHit> iterator = hits.iterator(); while (iterator.hasNext()){ //每个查询对象 SearchHit searchHit = iterator.next(); //获取字符串格式打印 System.out.println(searchHit.getSourceAsString()); System.out.println("title:"+searchHit.getSource().get("title")); } //释放资源 client.close(); } }
2、控制台
八、查询文档分页操作
1、批量插入数据
package com.zn.myTest; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.zn.entity.Article; import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.client.Requests; import org.elasticsearch.client.transport.TransportClient; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.InetSocketTransportAddress; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.common.xcontent.XContentType; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.SearchHits; import org.elasticsearch.transport.client.PreBuiltTransportClient; import org.junit.jupiter.api.Test; import java.io.IOException; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.Iterator; import java.util.concurrent.ExecutionException; public class MyESTest { /** * 查询文档分页操作---批量插入数据 */ @Test public void AddManyDocument() throws UnknownHostException, JsonProcessingException { //创建Client连接对象 Settings settings = Settings.builder().put("cluster.name", "my-application").build(); //设置IP地址和端口号 TransportClient client = new PreBuiltTransportClient(settings).addTransportAddress( new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300)); ObjectMapper objectMapper=new ObjectMapper(); for (int i=1;i<=50;i++) { Article article = new Article(); //描述json 数据 article.setId(i); article.setTitle(i + "搜索工作其实很快乐"); article.setContent(i + "我们希望我们的搜索解决方案要快,我们希望有一个零配置和一个完全免费的搜索模式"); //创建文档 client.prepareIndex("es_test1", "article", article.getId().toString()) .setSource(objectMapper.writeValueAsString(article).getBytes(), XContentType.JSON).get(); } //释放资源 client.close(); } }
2、访问localhost:9100查看
3、分页查询
package com.zn.myTest; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.zn.entity.Article; import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest; import org.elasticsearch.action.search.SearchRequestBuilder; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.client.Requests; import org.elasticsearch.client.transport.TransportClient; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.InetSocketTransportAddress; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.common.xcontent.XContentType; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.SearchHits; import org.elasticsearch.transport.client.PreBuiltTransportClient; import org.junit.jupiter.api.Test; import java.io.IOException; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.Iterator; import java.util.concurrent.ExecutionException; public class MyESTest { /** * 分页查询 */ @Test public void selectDocument() throws UnknownHostException { //创建Client连接对象 Settings settings = Settings.builder().put("cluster.name", "my-application").build(); //设置IP地址和端口号 TransportClient client = new PreBuiltTransportClient(settings).addTransportAddress( new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300)); //搜索数据 默认每页10条记录 SearchRequestBuilder searchRequestBuilder = client.prepareSearch("es_test1") .setTypes("article") .setQuery(QueryBuilders.matchAllQuery()); //从0条开始,每页5条数据 //setFrom():从第几条开始检索,默认是0。 //setSize():每页最多显示的记录数。 searchRequestBuilder.setFrom(0).setSize(5); SearchResponse searchResponse=searchRequestBuilder.get(); //获取命中次数,查询结果有多少对象 SearchHits hits = searchResponse.getHits(); System.out.println("查询结果有:"+hits.getTotalHits()+"条"); //遍历搜索结果数据 Iterator<SearchHit> iterator = hits.iterator(); while (iterator.hasNext()){ //每个查询对象 SearchHit searchHit = iterator.next(); //获取字符串格式打印 System.out.println(searchHit.getSourceAsString()); System.out.println("id:"+searchHit.getSource().get("id")); System.out.println("title:"+searchHit.getSource().get("title")); System.out.println("content:"+searchHit.getSource().get("content")); System.out.println("**************************************************"); } //释放资源 client.close(); } }
4、控制台
九、查询结果高亮操作
在进行关键字搜索时,搜索出的内容中的关键字会显示不同的颜色,称之为高亮
ElasticSearch可以对查询出的内容中关键字部分进行标签和样式的设置,但是你需要告诉ElasticSearch使用什么标签对高亮关键字进行包裹
1、高亮代码
package com.zn.myTest; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.zn.entity.Article; import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest; import org.elasticsearch.action.search.SearchRequestBuilder; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.client.Requests; import org.elasticsearch.client.transport.TransportClient; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.text.Text; import org.elasticsearch.common.transport.InetSocketTransportAddress; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.common.xcontent.XContentType; 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.transport.client.PreBuiltTransportClient; import org.junit.jupiter.api.Test; import java.io.IOException; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.Iterator; import java.util.concurrent.ExecutionException; public class MyESTest { /** * 查询结果高亮操作 */ @Test public void selectDocumentRed() throws UnknownHostException { //创建Client连接对象 Settings settings = Settings.builder().put("cluster.name", "my-application").build(); //设置IP地址和端口号 TransportClient client = new PreBuiltTransportClient(settings).addTransportAddress( new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300)); //设置搜索条件 SearchRequestBuilder searchRequestBuilder = client.prepareSearch("es_test1") .setTypes("article") .setQuery(QueryBuilders.termQuery("title","搜索")); //设置高亮数据 HighlightBuilder highlightBuilder=new HighlightBuilder(); highlightBuilder.preTags("<font style=‘color:red‘>"); highlightBuilder.postTags("</font>"); highlightBuilder.field("title"); searchRequestBuilder.highlighter(highlightBuilder); //获取查询结果数据 SearchResponse searchResponse = searchRequestBuilder.get(); //获取查询结果集 SearchHits hits = searchResponse.getHits(); System.out.println("共搜到:"+hits.getTotalHits()+"条数据"); //遍历结果 for (SearchHit hit:hits){ System.out.println("String方式打印文档搜索内容:"); System.out.println(hit.getSourceAsString()); System.out.println("Map方式打印高亮内容"); System.out.println(hit.getHighlightFields()); System.out.println("遍历高亮集合,打印高亮片段:"); Text[] text = hit.getHighlightFields().get("title").getFragments(); for (Text str:text){ System.out.println(str); } System.out.println("**********************************************************8"); //释放资源 client.close(); } } }
2、控制台
以上是关于Idea操作ElasticSearch的主要内容,如果未能解决你的问题,请参考以下文章
在Windows环境IDEA下编译运行Elasticsearch 7.14.1
ElasticSearch学习问题记录——Invalid shift value in prefixCoded bytes (is encoded value really an INT?)(代码片段
[ ElasticSearch ] SpringBoot整合ElasticSearch