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("=================================================");}}

在这里插入图片描述
在这里插入图片描述


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

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部