ElasticSearch学习---- Java操作ElasticSearch
Java操作ElasticSearch
- ①. 创建Java项目导入maven依赖
- ②. 创建索引和类型
- 1. 创建客户端操作对象
- 2. 创建索引
- 3. 删除索引
- 4. 创建索引和类型
- ③. 索引中创建文档
- ④. 更新一条索引
- ⑤. 删除一条索引
- ⑥. 批量操作
- ⑦. 查询操作
- 1. 查询所有并排序
- 2. term查询
- 3. rang查询
- 4. 分页查询
- 5. 查询返回指定字段
- 6. prefix 前缀查询
- 7. wildcardQuery 通配符查询
- 8. ids 多id查询
- 9. fuzzy 模糊查询
- 10. bool 布尔查询
- 11. highlighter 高亮查询
- 12. 过滤查询
- 13. 基于多字段关键词查询
①. 创建Java项目导入maven依赖
<dependency><groupId>org.elasticsearchgroupId><artifactId>elasticsearchartifactId><version>6.8.0version>dependency><dependency><groupId>org.elasticsearch.clientgroupId><artifactId>transportartifactId><version>6.8.0version>dependency><dependency><groupId>org.elasticsearch.plugingroupId><artifactId>transport-netty4-clientartifactId><version>6.8.0version>dependency><dependency><groupId>com.alibabagroupId><artifactId>fastjsonartifactId><version>1.1.37version>dependency>
②. 创建索引和类型
1. 创建客户端操作对象
@Testpublic void test3() throws Exception {preBuiltTransportClient = new PreBuiltTransportClient(Settings.EMPTY);preBuiltTransportClient.addTransportAddress(new TransportAddress(InetAddress.getByName("192.168.153.124"),9300));}
使用Before和After进行快速连接关闭ES客户端
private PreBuiltTransportClient preBuiltTransportClient;//创建ES客户端操作对象@Beforepublic void init() throws Exception {preBuiltTransportClient = new PreBuiltTransportClient(Settings.EMPTY);preBuiltTransportClient.addTransportAddress(new TransportAddress(InetAddress.getByName("192.168.153.124"),9300));}@Afterpublic void after(){preBuiltTransportClient.close();}

2. 创建索引
//创建索引@Testpublic void createIndex() throws Exception {//执行索引创建CreateIndexResponse createIndexResponse = preBuiltTransportClient.admin().indices().prepareCreate("xizi777").get();System.out.println(createIndexResponse.isAcknowledged());}

3. 删除索引
//删除索引@Testpublic void deleteIndex() throws Exception {//执行索引创建AcknowledgedResponse xizi777 = preBuiltTransportClient.admin().indices().prepareDelete("xizi777").get();System.out.println(xizi777.isAcknowledged());}
4. 创建索引和类型
//创建索引类型和映射@Testpublic void createIndexAndMapper() throws Exception {//创建索引CreateIndexRequest xizi777 = new CreateIndexRequest("xizi777");//定义json格式映射String json = "{\"properties\":{\"name\":{\"type\":\"text\",\"analyzer\":\"ik_max_word\"},\"age\":{\"type\":\"integer\"},\"sex\":{\"type\":\"keyword\"},\"content\":{\"type\":\"text\",\"analyzer\":\"ik_max_word\"}}}";//设置类型和mappingxizi777.mapping("emp",json, XContentType.JSON);//执行创建CreateIndexResponse createIndexResponse = preBuiltTransportClient.admin().indices().create(xizi777).get();System.out.println(createIndexResponse.isAcknowledged());}

③. 索引中创建文档
//索引中创建文档 指定id@Testpublic void createIndexOptionId() throws Exception {Emp emp = new Emp("小尹", 21, "男", "这是一个单纯的少年");String empString = JSONObject.toJSONString(emp);IndexResponse indexResponse = preBuiltTransportClient.prepareIndex("xizi777", "emp", "1").setSource(empString, XContentType.JSON).get();System.out.println(indexResponse.status());}

//索引中创建文档 自动生成id@Testpublic void createIndexAndDocument() throws Exception {Emp emp = new Emp("小尹", 18, "男", "这是一个单纯的少年");String empString = JSONObject.toJSONString(emp);IndexResponse indexResponse = preBuiltTransportClient.prepareIndex("xizi777", "emp").setSource(empString, XContentType.JSON).get();System.out.println(indexResponse.status());}

④. 更新一条索引
//更新一条记录@Testpublic void testUpdate() throws Exception {Emp emp = new Emp();emp.setName("小尹666");String s = JSONObject.toJSONString(emp);UpdateResponse updateResponse = preBuiltTransportClient.prepareUpdate("xizi777", "emp", "1").setDoc(s,XContentType.JSON).get();System.out.println(updateResponse.status());}

⑤. 删除一条索引
//删除一条记录@Testpublic void testDelete() throws Exception {DeleteResponse deleteResponse = preBuiltTransportClient.prepareDelete("xizi777", "emp", "1").get();System.out.println(deleteResponse.status());}

⑥. 批量操作
//批量操作@Testpublic void testBulk() throws Exception {//添加第一条记录IndexRequest request1 = new IndexRequest("xizi777","emp","6");Emp emp = new Emp("戏子665", 21, "男", "牛逼");request1.source(JSONObject.toJSONString(emp),XContentType.JSON);//添加第二条记录IndexRequest request2 = new IndexRequest("xizi777","emp","7");Emp emp2 = new Emp("伟少666", 21, "女", "牛逼");request2.source(JSONObject.toJSONString(emp2),XContentType.JSON);//更新记录UpdateRequest updateRequest = new UpdateRequest("xizi777","emp","4");Emp empUpdate = new Emp();empUpdate.setName("伟少牛逼");updateRequest.doc(JSONObject.toJSONString(empUpdate),XContentType.JSON);//删除一条记录DeleteRequest deleteRequest = new DeleteRequest("xizi777","emp","5");BulkResponse bulkItemResponses = preBuiltTransportClient.prepareBulk().add(request1).add(request2).add(updateRequest).add(deleteRequest).get();BulkItemResponse[] items = bulkItemResponses.getItems();for (BulkItemResponse item : items) {System.out.println(item.status());}}

⑦. 查询操作
1. 查询所有并排序
/*** 查询所有并排序* addSort("age", SortOrder.ASC) 指定排序字段以及使用哪种方式排序* addSort("age", SortOrder.DESC) 指定排序字段以及使用哪种方式排序*/@Testpublic void testMatchAllQuery() throws Exception {SearchResponse searchResponse = preBuiltTransportClient.prepareSearch("xizi777").setTypes("emp").setQuery(QueryBuilders.matchAllQuery()).addSort("age", SortOrder.DESC).get();SearchHits hits = searchResponse.getHits();System.out.println("符合条件的记录数: "+hits.totalHits);System.out.println("最大得分:"+hits.getMaxScore());for (SearchHit hit : hits) {System.out.print("当前索引的分数: "+hit.getScore());System.out.print(", 对应结果:=====>"+hit.getSourceAsString());System.out.println(", 指定字段结果:"+hit.getSourceAsMap().get("name"));System.out.println("=================================================");}}

2. term查询
// term查询@Testpublic void testTerm() throws Exception {//创建term查询条件TermQueryBuilder queryBuilder = QueryBuilders.termQuery("name","尹");SearchResponse searchResponse = preBuiltTransportClient.prepareSearch("xizi777").setTypes("emp").setQuery(queryBuilder).get();SearchHits hits = searchResponse.getHits();System.out.println("符合条件的记录数: "+hits.totalHits);System.out.println("最大得分:"+hits.getMaxScore());for (SearchHit hit : hits) {System.out.print("当前索引的分数: "+hit.getScore());System.out.print(", 对应结果:=====>"+hit.getSourceAsString());System.out.println("=================================================");}}

3. rang查询
// rang查询@Testpublic void testRange() throws Exception {RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("age").lt(45).gte(8);SearchResponse searchResponse = preBuiltTransportClient.prepareSearch("xizi777").setTypes("emp").setQuery(rangeQueryBuilder).get();SearchHits hits = searchResponse.getHits();System.out.println("符合条件的记录数: "+hits.totalHits);System.out.println("最大得分:"+hits.getMaxScore());for (SearchHit hit : hits) {System.out.print("当前索引的分数: "+hit.getScore());System.out.print(", 对应结果:=====>"+hit.getSourceAsString());System.out.println("=================================================");}}

4. 分页查询
/*** 分页查询* From 从那条记录开始 默认从0 开始 form = (pageNow-1)*size* Size 每次返回多少条符合条件的结果 默认10*/@Testpublic void testMatchAllQueryFormAndSize() throws Exception {SearchResponse searchResponse = preBuiltTransportClient.prepareSearch("xizi777").setTypes("emp").setQuery(QueryBuilders.matchAllQuery()).setFrom(0).setSize(2).get();SearchHits hits = searchResponse.getHits();System.out.println("符合条件的记录数: "+hits.totalHits);for (SearchHit hit : hits.getHits()) {System.out.print("当前索引的分数: "+hit.getScore());System.out.print(", 对应结果:=====>"+hit.getSourceAsString());System.out.println("=================================================");}}

5. 查询返回指定字段
/*** 查询返回指定字段(source) 默认返回所有* setFetchSource 参数1:包含哪些字段 参数2:排除哪些字段* setFetchSource("*","age") 返回所有字段中排除age字段* setFetchSource("name","") 只返回name字段* setFetchSource(new String[]{},new String[]{})*/@Testpublic void testMatchAllQuerySource() throws Exception {SearchResponse searchResponse = preBuiltTransportClient.prepareSearch("xizi777").setTypes("emp").setQuery(QueryBuilders.matchAllQuery()).setFetchSource("*","age").get();SearchHits hits = searchResponse.getHits();System.out.println("符合条件的记录数: "+hits.totalHits);for (SearchHit hit : hits) {System.out.print("当前索引的分数: "+hit.getScore());System.out.print(", 对应结果:=====>"+hit.getSourceAsString());System.out.println("=================================================");}}

6. prefix 前缀查询
// prefix 前缀查询@Testpublic void testPrefix() throws Exception {PrefixQueryBuilder prefixQueryBuilder = QueryBuilders.prefixQuery("name", "小");SearchResponse searchResponse = preBuiltTransportClient.prepareSearch("xizi777").setTypes("emp").setQuery(prefixQueryBuilder).get();SearchHits hits = searchResponse.getHits();System.out.println("符合条件的记录数: "+hits.totalHits);for (SearchHit hit : hits) {System.out.print("当前索引的分数: "+hit.getScore());System.out.print(", 对应结果:=====>"+hit.getSourceAsString());System.out.println("=================================================");}}

7. wildcardQuery 通配符查询
// wildcardQuery 通配符查询 ?代表一个 *代表多个@Testpublic void testwildcardQuery() throws Exception {WildcardQueryBuilder wildcardQueryBuilder = QueryBuilders.wildcardQuery("name", "小*");SearchResponse searchResponse = preBuiltTransportClient.prepareSearch("xizi777").setTypes("emp").setQuery(wildcardQueryBuilder).get();SearchHits hits = searchResponse.getHits();System.out.println("符合条件的记录数: "+hits.totalHits);for (SearchHit hit : hits) {System.out.print("当前索引的分数: "+hit.getScore());System.out.print(", 对应结果:=====>"+hit.getSourceAsString());System.out.println("=================================================");}}

8. ids 多id查询
// ids 查询@Testpublic void testIds() throws Exception {IdsQueryBuilder idsQueryBuilder = QueryBuilders.idsQuery().addIds("6","7");SearchResponse searchResponse = preBuiltTransportClient.prepareSearch("xizi777").setTypes("emp").setQuery(idsQueryBuilder).get();SearchHits hits = searchResponse.getHits();System.out.println("符合条件的记录数: "+hits.totalHits);for (SearchHit hit : hits) {System.out.print("当前索引的分数: "+hit.getScore());System.out.print(", 对应结果:=====>"+hit.getSourceAsString());System.out.println("=================================================");}}

9. fuzzy 模糊查询
// fuzzy 查询@Testpublic void testFuzzy() throws Exception {FuzzyQueryBuilder fuzzyQueryBuilder = QueryBuilders.fuzzyQuery("name", "尹");SearchResponse searchResponse = preBuiltTransportClient.prepareSearch("xizi777").setTypes("emp").setQuery(fuzzyQueryBuilder).get();SearchHits hits = searchResponse.getHits();System.out.println("符合条件的记录数: "+hits.totalHits);for (SearchHit hit : hits) {System.out.print("当前索引的分数: "+hit.getScore());System.out.print(", 对应结果:=====>"+hit.getSourceAsString());System.out.println("=================================================");}}

10. bool 布尔查询
// bool 查询@Testpublic void testBool() throws Exception {BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
// boolQueryBuilder.should(QueryBuilders.matchAllQuery());
// boolQueryBuilder.mustNot(QueryBuilders.rangeQuery("age").lte(8));boolQueryBuilder.must(QueryBuilders.termQuery("name","尹"));SearchResponse searchResponse = preBuiltTransportClient.prepareSearch("xizi777").setTypes("emp").setQuery(boolQueryBuilder).get();SearchHits hits = searchResponse.getHits();System.out.println("符合条件的记录数: "+hits.totalHits);for (SearchHit hit : hits) {System.out.print("当前索引的分数: "+hit.getScore());System.out.print(", 对应结果:=====>"+hit.getSourceAsString());System.out.println("=================================================");}}

11. highlighter 高亮查询
/*** 高亮查询* .highlighter(highlightBuilder) 用来指定高亮设置 requireFieldMatch(false) 开启多个字段高亮* field 用来定义高亮字段 * preTags("") 用来指定高亮前缀 postTags("") 用来指定高亮后缀*/@Testpublic void testHighlight() throws Exception {TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name", "尹");HighlightBuilder highlightBuilder = new HighlightBuilder();highlightBuilder.requireFieldMatch(false).field("name").field("content").preTags("").postTags("");SearchResponse searchResponse = preBuiltTransportClient.prepareSearch("xizi777").setTypes("emp").highlighter(highlightBuilder).setQuery(termQueryBuilder).get();SearchHits hits = searchResponse.getHits();System.out.println("符合条件的记录数: "+hits.totalHits);for (SearchHit hit : hits) {Map<String, Object> sourceAsMap = hit.getSourceAsMap();System.out.println("================高亮之前==========");for(Map.Entry<String,Object> entry:sourceAsMap.entrySet()){System.out.println("key: "+entry.getKey() +" value: "+entry.getValue());}System.out.println("================高亮之后==========");Map<String, HighlightField> highlightFields = hit.getHighlightFields();for (Map.Entry<String,Object> entry:sourceAsMap.entrySet()){HighlightField highlightField = highlightFields.get(entry.getKey());if (highlightField!=null){System.out.println("key: "+entry.getKey() +" value: "+ highlightField.fragments()[0]);}else{System.out.println("key: "+entry.getKey() +" value: "+entry.getValue());}}}}

12. 过滤查询
// 过滤查询 在查询之前对大量数据进行筛选@Testpublic void testFilter(){RangeQueryBuilder age = QueryBuilders.rangeQuery("age").gte(18).lte(21);SearchResponse searchResponse = preBuiltTransportClient.prepareSearch("xizi777").setTypes("emp").setPostFilter(age).setQuery(QueryBuilders.matchAllQuery()).get();SearchHits hits = searchResponse.getHits();System.out.println("符合条件的记录数: "+hits.totalHits);for (SearchHit hit : hits) {System.out.print("当前索引的分数: "+hit.getScore());System.out.print(", 对应结果:=====>"+hit.getSourceAsString());System.out.println("=================================================");}}

13. 基于多字段关键词查询
/*** 基于多字段关键词查询* 分页* 排序* 过滤* 执行字段返回* 高亮处理*/@Testpublic void All(){SearchResponse searchResponse = preBuiltTransportClient.prepareSearch("xizi777").setTypes("emp").setFrom(0).setSize(20).addSort("age", SortOrder.DESC) //排序.setSource(SearchSourceBuilder.searchSource().fetchSource("*", "sex")) //指定字段.setPostFilter(QueryBuilders.termQuery("name", "伟")).setQuery(QueryBuilders.multiMatchQuery("牛逼", "content","name")) //多字段搜索.highlighter(new HighlightBuilder().field("*").requireFieldMatch(false).preTags("").postTags("")).get();SearchHits hits = searchResponse.getHits();System.out.println("符合条件的记录数: "+hits.totalHits);for (SearchHit hit : hits) {System.out.print("当前索引的分数: "+hit.getScore());System.out.println(", 原始文档对应结果:=====>"+hit.getSourceAsString());System.out.println("高亮字段:"+hit.getHighlightFields());System.out.println("=================================================");}}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
