ElasticSearch入门案例
1. 导入maven依赖
<!--导入elasticsearch坐标--> <dependencies> <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> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>RELEASE</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>RELEASE</version> </dependency> <!--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> </dependencies>
2. JavaAPI操作
package com.pomelo.index; import com.fasterxml.jackson.databind.ObjectMapper; import com.itheima.domain.Article; import org.elasticsearch.action.admin.indices.create.CreateIndexResponse; import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequestBuilder; import org.elasticsearch.action.admin.indices.mapping.put.PutMappingResponse; import org.elasticsearch.action.delete.DeleteRequestBuilder; import org.elasticsearch.action.delete.DeleteResponse; import org.elasticsearch.action.index.IndexRequestBuilder; import org.elasticsearch.action.index.IndexResponse; import org.elasticsearch.action.update.UpdateRequestBuilder; import org.elasticsearch.action.update.UpdateResponse; 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.Test; import java.net.InetAddress; public class IndexManager { //创建连接对象 public TransportClient getClient() throws Exception { /** * 1:配置es信息 * 等价与:Settings settings1 = Settings.builder().put("cluster.name","elasticsearch").build(); * 如果做集群,那么就必须使用这么上面这种定义,并且把集群名更改成自己自己设置的集群名。 */ Settings settings = Settings.EMPTY; //2: 创建客户端对象 TransportClient transportClient = new PreBuiltTransportClient(settings); //3: 指定服务器的地址和ip transportClient.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"),9300)); //返回 return transportClient; } @Test //创建索引库 public void createIndex() throws Exception { //1. 获取连接 TransportClient transportClient = this.getClient(); //2. 创建索引库 http://localhost:9200/blog---put请求 CreateIndexResponse indexResponse = transportClient.admin().indices().prepareCreate("blog").get(); System.out.println(indexResponse.isShardsAcked()); //3. 释放资源 transportClient.close(); } @Test //创建文档 public void createIndexDocument() throws Exception { //1. 获取连接 TransportClient transportClient = this.getClient(); //2. 保存数据 XContentBuilder contentBuilder = XContentFactory.jsonBuilder() .startObject() .field("id",1) .field("title","elasticsearch是一个基于lucene的搜索服务") .field("content","ElasticSearch是一个基于Lucene的搜索服务器。" + "它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。" + "Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布," + "是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定," + "可靠,快速,安装使用方便。") .endObject(); /** * 把json数据储存到es索引库中 * 参数1:索引库 * 参数2:类型/分类 * 参数3:id * 如果没有指定id,就会用uuid生成的主键id */ IndexRequestBuilder requestBuilder = transportClient.prepareIndex("blog", "content"); IndexResponse indexResponse = requestBuilder.setSource(contentBuilder).get(); System.out.println(indexResponse.status()); //3. 释放资源 transportClient.close(); } @Test //基于实体类的方式创建文档数据 public void createIndexDocumentByDomain() throws Exception { //1. 获取连接 TransportClient client = this.getClient(); //2. 保存数据 Article article = new Article(); article.setId(2); article.setTitle("solr是一个基于lucene的搜索服务"); article.setContent("solr是一个基于Lucene的搜索服务器" + " 它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。" + " solr是用Java开发的,并作为Apache许可条款下的开放源码发布," + " 是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定," + " 可靠,快速,安装使用方便。"); //转成json ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(article); IndexRequestBuilder requestBuilder = client.prepareIndex("blog", "content","1"); IndexResponse indexResponse = requestBuilder.setSource(json, XContentType.JSON).get(); System.out.println(indexResponse.status()); //3. 释放资源 client.close(); } @Test //修改文档 public void updateIndexDocument() throws Exception { //1. 获取连接 TransportClient client = this.getClient(); //2. 修改文档 Article article = new Article(); article.setId(3); article.setTitle("elasticsearch是一个基于lucene的搜索服务"); article.setContent("elasticsearch是一个基于Lucene的搜索服务器" + " 它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。" + " elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布," + " 是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定," + " 可靠,快速,安装使用方便。"); //转成json ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(article); UpdateRequestBuilder prepareUpdate = client.prepareUpdate("blog", "content", "1"); UpdateResponse updateResponse = prepareUpdate.setDoc(json, XContentType.JSON).get(); System.out.println(updateResponse.status()); //3. 释放资源 client.close(); } @Test //删除文档 public void deleteIndexDocument() throws Exception { //1. 获取连接 TransportClient client = this.getClient(); //2. 删除 DeleteRequestBuilder deleteRequestBuilder = client.prepareDelete("blog", "content", "1"); DeleteResponse deleteResponse = deleteRequestBuilder.get(); System.out.println(deleteResponse.status()); //3. 释放资源 client.close(); } /* //创建mapping规则 "mappings": { "content": { "properties": { "id": { "store": true, "type": "long" }, "title": { "analyzer": "ik_smart", "store": true, "type": "text" }, "content": { "analyzer": "ik_smart", "store": true, "type": "text" } } } }, */ @Test public void createMapping() throws Exception { //1. 获取连接 TransportClient client = this.getClient(); //2. 创建索引库 CreateIndexResponse indexResponse = client.admin().indices().prepareCreate("blog2").get(); //3. 如果索引库存在,就创建mapping规则 if(indexResponse.isAcknowledged()){ XContentBuilder xContentBuilder = XContentFactory.jsonBuilder().startObject() .startObject("content") .startObject("properties") .startObject("id").field("type","long").field("store",true).endObject() //ik_max_word 最细切法(如果还能切继续切,切到没有为止) 和 ik_smart 最小切法 .startObject("title").field("type", "text").field("store", true).field("analyzer", "ik_smart").endObject() .startObject("content").field("type", "text").field("store", true).field("analyzer", "ik_smart").endObject() .endObject() .endObject() .endObject(); PutMappingRequestBuilder mappingRequestBuilder = client.admin().indices().preparePutMapping("blog2").setType("content"); PutMappingResponse mappingResponse = mappingRequestBuilder.setSource(xContentBuilder).get(); System.out.println(mappingResponse.isAcknowledged()); } //4. 关闭资源 client.close(); } }
package com.pomelo.search; import org.elasticsearch.action.index.IndexRequestBuilder; import org.elasticsearch.action.index.IndexResponse; 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.InetSocketTransportAddress; 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.sort.SortOrder; import org.elasticsearch.transport.client.PreBuiltTransportClient; import org.junit.Test; import java.net.InetAddress; import java.util.HashMap; import java.util.Map; public class SearchManager { //创建连接 public TransportClient getClient() throws Exception { Settings settings = Settings.EMPTY; TransportClient client = new PreBuiltTransportClient(settings); client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300)); return client; } @Test //创建索引库 public void createIndexDocument() throws Exception { //1. 获取连接 TransportClient client = this.getClient(); //2. 创建文档 Map<String, Object> map = new HashMap<>(); for (int i = 1; i <= 30; i++) { map.put("id", i); map.put("title", i + " ,elasticsearch和solr都还行"); map.put("content", i + " ,学习elasticsearch很快乐好难记"); map.put("price", i + 100); IndexRequestBuilder requestBuilder = client.prepareIndex("blog3", "article", i + ""); IndexResponse indexResponse = requestBuilder.setSource(map).get(); System.out.println(indexResponse.status()); } //3. 关闭资源 client.close(); } @Test //查询 public void searchMain() throws Exception { //1. 获取连接对象 TransportClient client = this.getClient(); /** * 2. 查询条件: 1:查询全部 QueryBuilders.matchAllQuery() 2、字符串搜索 QueryBuilders.queryStringQuery(“elasticsearch”) 3、词条搜索 QueryBuilders.termQuery(“content”,“elasticsearch”) 4、根据ID搜索 QueryBuilders.idsQuery().addIds("1","2"); * */ //QueryBuilder queryBuilder = QueryBuilders.matchAllQuery(); //QueryBuilder queryBuilder = QueryBuilders.queryStringQuery("elasticsearch好多API,字符串搜索会分词"); //QueryBuilder queryBuilder = QueryBuilders.termQuery("content", "elasticsearch词条搜索不会分词"); //QueryBuilder queryBuilder = QueryBuilders.idsQuery().addIds("1", "2", "3"); QueryBuilder queryBuilder = QueryBuilders.termQuery("title", "solr"); int pageNum = 1; //当前页 int pageSize = 10; //每页大小 //高亮对象 HighlightBuilder highlightBuilder = new HighlightBuilder(); highlightBuilder.preTags("<span style='color:red'>"); //开始标签 highlightBuilder.field("title"); //高亮字段 highlightBuilder.postTags("</span>"); //结束标签 //3. 执行查询 SearchResponse searchResponse = client.prepareSearch("blog3") //指定搜索库 多个用逗号分开 // 指定搜索的类型,多个用逗号分开 .setTypes("article") // 排序 .addSort("price", SortOrder.ASC) // 分页 .setFrom((pageNum - 1) * pageSize) .setSize(pageSize) //设置高亮 .highlighter(highlightBuilder) //设置搜索条件 .setQuery(queryBuilder) // 返回 .get(); //4. 获取搜索结果 SearchHits hits = searchResponse.getHits(); System.out.println("搜索结果有:" + hits.getTotalHits() + "条数据"); for (SearchHit hit : hits) { //索引库中的文档数据 Map<String, Object> sourceAsMap = hit.getSourceAsMap(); System.out.println("id: " + sourceAsMap.get("id")); System.out.println("content: " + sourceAsMap.get("content")); System.out.println("price: " + sourceAsMap.get("price")); //获取高亮内容 if(hit.getHighlightFields() != null && hit.getHighlightFields().get("title") != null){ Text[] titles = hit.getHighlightFields().get("title").getFragments(); if(titles != null && titles.length > 0){ System.out.println("高亮内容是:" + titles[0].string()); }else { System.out.println("title: " + sourceAsMap.get("title")); } }else { System.out.println("title: " + sourceAsMap.get("title")); } System.out.println("========================================================="); } //5. 释放连接 client.close(); } }