最近在研究Solr的替代解决方案,就研究了solr的同门师弟elasticsearch,同门是因为他俩都基于Lucene。
ElasticSearch具有实时热更新,分布式,大数据量级的优势,相比于solr,肯定前景更开阔一些。
先说部署,ElasticSearch官网直接下载最新版,我用的是7.10.1版本,直接进入bin目录下的ElasticSearch.bat双击运行即可,完事访问本地9200端口测试是否成功。
head插件和Kibana插件还有ik分词器根据自己需求下载,head用于ElasticSearch索引及文档数据的可视化,kibana用于Rest命令测试,ik分词器帮助进行中文分词检索匹配
话不多说,直接上代码
先上maven依赖:
我为了方便,引入了fastjson和mybatis generator,你根据自己需要
<properties> <java.version>1.8</java.version> <!-- 指定ElasticSearch和自己部署的版本一致--> <elasticsearch.version>7.10.1</elasticsearch.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.4</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.70</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>com.microsoft.sqlserver</groupId> <artifactId>mssql-jdbc</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.3.2</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
然后是获取 RestHighLevelClient
RestHighLevelClient client = new RestHighLevelClient( RestClient.builder(new HttpHost("127.0.0.1",9200,"http")));
创建索引:
/** * 创建索引(库) */ @Test void CreateIndex() throws IOException { //创建请求 CreateIndexRequest request = new CreateIndexRequest("testdemo"); //下面是给这个索引添加映射规则(可选) // XContentBuilder mapping = JsonXContent.contentBuilder() // .startObject() // .startObject("properties") // //code字段 // .startObject("code") // .field("type","keyword") // .endObject() // //name字段 // .startObject("name") // .field("type","text") // .endObject() // .endObject() // .endObject(); // request.mapping(mapping); CreateIndexResponse createIndexResponse = client.indices().create(request, RequestOptions.DEFAULT); System.out.println(createIndexResponse); }
删除索引:
/** * 删除索引 */ @Test void testdeleteindex() throws IOException { DeleteIndexRequest request = new DeleteIndexRequest("u_file1_029"); AcknowledgedResponse delete = client.indices().delete(request, RequestOptions.DEFAULT); System.out.println(delete.isAcknowledged()); }
判断索引是否存在:
/** * 获取索引 */ @Test void testgetindex() throws IOException { GetIndexRequest request = new GetIndexRequest("testdemo"); boolean exists = client.indices().exists(request, RequestOptions.DEFAULT); System.out.println(exists); }
插入文档:
/** * 添加document数据 */ @Test void inputalltable() throws IOException { IndexRequest indexRequest = new IndexRequest("testdemo"); //设置你想要的id,不设置会自动生成随机uuid indexRequest.id(""); //测试数据 Map map= new HashMap(); map.put("code","xxxxxxx“); map.put("name","xxxxxx"); indexRequest.source(JSON.toJSONString(map), XContentType.JSON); IndexResponse response = client.index(indexRequest, RequestOptions.DEFAULT); }
批量添加文档:
/** * bulkcreateDOC * 批量导入文档 */ @Test void CreateBulk() throws IOException { List<Map<String, String>> gettabledata = generolService.gettabledata(“testdemo”); if(gettabledata.size()!=0){//判断是否为空集合 BulkRequest bulkRequest = new BulkRequest(); for(int i=(tem-1)*50000;i<gettabledata.size();i++){ bulkRequest.add( new IndexRequest("testdemo") .id(gettabledata.get(i).get("id")) .source(JSON.toJSONString(gettabledata.get(i)),XContentType.JSON) ); } client.bulk(bulkRequest,RequestOptions.DEFAULT); } }
删除文档:
/** * 删除文档 */ @Test void deleteDOCtest() throws IOException { //第一个参数为index名称,第二个参数是文档DOC的id值 DeleteRequest request = new DeleteRequest("testdemo","xxxxxxxx"); DeleteResponse delete = client.delete(request, RequestOptions.DEFAULT); System.out.println(delete.toString()); }
修改更新文档:
/** * 更新文档 */ @Test void updateDOctest() throws IOException { UpdateRequest request = new UpdateRequest("testdemo","xxxxxxxxx");
Map map= new HashMap();
map.put("code","xxxxxxx“);
map.put("name","xxxxxx");
request.doc(JSON.toJSONString(map),XContentType.JSON); UpdateResponse update = client.update(request, RequestOptions.DEFAULT); System.out.println(update.status()); }
简单的检索(更复杂的检索请自行官网查询文档,包括match、trem、profix等和bool,must,should嵌套查询,from、size等分页)
/** * 查询 */ @Test void select() throws IOException { SearchRequest searchRequest = new SearchRequest("testdemo"); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); // MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery(); QueryStringQueryBuilder queryBuilder = QueryBuilders.queryStringQuery("xx"); searchSourceBuilder.query(queryBuilder); searchRequest.source(searchSourceBuilder); SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT); System.out.println(search.getHits().getTotalHits()); }