当前位置: 代码迷 >> 综合 >> ElasticSearch学习笔记(5)·Java操作Elasticsearch
  详细解决方案

ElasticSearch学习笔记(5)·Java操作Elasticsearch

热度:29   发布时间:2024-03-10 00:52:39.0

目录

  • 十、Java操作ElasticSearch
    • 1、引入maven依赖
    • 2、添加实体类
    • 3、创建索引
    • 4、索引一条数据
    • 5、删除一条索引
    • 6、更新文档
    • 7、批量索引
    • 8、普通查询一条文档
    • 9、高级检索
      • 查询所有并排序、分页
      • 查询返回字段
      • 检索查询
      • 高亮查询
      • 过滤查询

十、Java操作ElasticSearch

本章基于ElasticSearch6.2.4版本

1、引入maven依赖

<dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>6.2.4</version>
</dependency>
<dependency><groupId>org.elasticsearch</groupId><artifactId>transport</artifactId><version>6.2.4</version>
</dependency>

2、添加实体类

@Data
@Accessors(chain=true)	//链式编程 set方法返回当前对象
public class Book{
    private String id;private String name;private String sex;private Integer age;private String content;
}

3、创建索引

//创建索引、类型、字段映射
@Test
public void testCreateIndexAndTypeAndMapping() throws Exception {
    TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY).addTransportAddress(new TransportAddress(InetAddress.getByName("192.168.0.1"), 9300));System.out.println("=========创建索引=========");CreateIndexResponse indexResponse = transportClient.admin().indices().prepareCreate("dangdang").execute().get();System.out.println(indexResponse.index());System.out.println("========创建类型指定映射=======");XContentBuilder mappingBuilder = XContentFactory.jsonBuilder();appingBuilder.startObject().startObject("properties").startObject("name").field("type", "text")						.field("analyzer","ik_max_word").endObject().startObject("age").field("type", "integer").endObject().startObject("sex").field("type", "keyword").endObject().startObject("content").field("type", "text").field("analyzer", "ik_max_word").endObject().endObject().endObject();PutMappingRequest putMappingRequest = new PutMappingRequest("dangdang").type("book").source(mappingBuilder);transportClient.admin().indices().putMapping(putMappingRequest).get();}

NOTE:下面省略创建TransportClient的过程

4、索引一条数据

//索引一条记录到ES 如果指定id 使用指定id作为文档_id,如果不指定id为自动生成
@Test
public void  testAddDocument() throw Exception{
    Map<String, Object> result=new HashMap<>();result.put("name", "小黑的故事");result.put("sex", "男");result.put("age","23");result.put("content", "小黑的故事,小黑今天特别开心");IndexResponse indexReponse=transportClient.prepareIndex("dangdang","book",1).setSource(result)	//设置数据.get();	//发送请求到ES//也可以传入JSON格式数据// .setSource(json,XContentType.JSON) //设置数据,请求类型为json格式System.out.println(indexReponse.status());

5、删除一条索引

//删除一条索引记录
@Test
public void testDelete() throws Exception {
    DeleteResponse deleteResponse = transportClient.prepareDelete("dangdang", "book", "1").get();System.out.println(deleteResponse.status());
}

6、更新文档

//更新文档
@Test 
public void testUpdate() throws Exception{
    Map<String,Object> result=new HashMap<>();result.put("name", "小黑的故事-1");UpdateResponse updateResponse = transportClient.prepareUpdate("dangdang", "book", "1").setDoc(result).get();//也可以转成JSON格式传输// .setDoc(json,XContentType.JSON)System.out.println(updateResponse.status());
}

7、批量索引

//批量操作,添加、更新、删除
@Test
public void testBulk() throws Exception{
    //索引一条记录Book book=new Book();book.setId("3");book.setSex("女");book.setName("下载问题-3");book.setContent("今天下载好慢");IndexRequest indexRequest=new IndexRequest("dangdang", "book", book.getId());indexRequest.source(JSONObject.toJSONString(book),XContentType.JSON);//删除一条记录DeleteRequest deleteRequest = new DeleteRequest("dangdang","book","1");//更新记录Book updateBook=new Book();updateBook.setId("4cdbc040-657a-4847-b266-7e31d9e2c3d9");updateBook.setName("下载依赖问题-update");UpdateRequest updateRequest = new UpdateRequest("dangdang", "book", updateBook.getId());BulkResponse bulkResponse = transportClient.prepareBulk().add(indexRequest).add(deleteRequest).add(updateRequest).get();BulkItemResponse[] items = bulkResponse.getItems();for (BulkItemResponse bulkItemResponse : items) {
    System.out.println(bulkItemResponse.status());}
}

8、普通查询一条文档

//查询一个
@Test
public void testFindOne(){
    GetResponse getResponse = transportClient.prepareGet("dangdang","book","1").get();String sourceAsString = getResponse.getSourceAsString();System.out.println(sourceAsString);
}

9、高级检索

查询所有并排序、分页

/*** 查询所有并排序* ASC 升序 DESC 降序* addSort("age",SortOrder.ASC) 指定排序字段以及使用哪种方式排序 * addSort("age",SortOrder.DESC) 指定排序字段以及使用哪种方式排序* setFrom(0) 从第几页开始* setSize(2) 返回几条数据*/
@Test
public void testMatchAllQuery() throws Exception {
    SearchResponse searchResponse = transportClient.prepareSearch("dangdang").setTypes("book").setQuery(QueryBuilders.matchAllQuery()).addSort("age", SortOrder.DESC)	//排序.setFrom(0)	//从第0页开始.setSize(2)	//返回2条数据.get();SearchHits hits = searchResponse.getHits();System.out.println("符合条件的记录数:"+hits.totalHits);for (SearchHit hit : hits) {
    System.out.println("当前索引的分数:"+hit.getScore());System.out.println("对应结果:====="+hit.getSourceAsString());System.out.println("指定字段结果:"+hit.getSourceAsMap().get("name"));System.out.println("======================");}
}

查询返回字段

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

检索查询

/** 1、Term查询* 2、range查询* 3、prefix查询* 4、wildcard通配符查询* 5、ids查询* 6、fuzzy模糊查询* 7、bool查询* 8、多字段查询* 9、多字段分词查询(与8不同的十可以设置分词器) @Test public void testTerm() throws Exception{// 1、Term查询TermQueryBuilder termQuery = QueryBuilders.termQuery("name", "小黑");// 2、range查询RangeQueryBuilder rangQuery = QueryBuilders.rangeQuery("age").lt(45).gte(40);// 3、prefix查询PrefixQueryBuilder prefixQuery = QueryBuilders.prefixQuery("name", "小");// 4、wildcard通配符查询WildcardQueryBuilder wildcardQuery = QueryBuilders.wildcardQuery("name", "小*");// 5、ids查询IdsQueryBuilder idsQuery = QueryBuilders.idsQuery().addIds("1","2");// 6、fuzzy模糊查询FuzzyQueryBuilder fuzzyQuery = QueryBuilders.fuzzyQuery("content", "小白");// 7、bool查询BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();boolQuery.should(QueryBuilders.matchAllQuery());boolQuery.mustNot(QueryBuilders.rangeQuery("age").lte(8));boolQuery.must(QueryBuilders.termQuery("name", "小黑"));//8、多字段查询MultiMatchQueryBuilder multiMatchQuery = QueryBuilders.multiMatchQuery("框架", "content","name");//9、多字段分词查询QueryStringQueryBuilder field = QueryBuilders.queryStringQuery("框架张无忌").analyzer("ik_max_word") //定义分词器.field("name").field("content"); //字段transportClient.prepareSearch("dangdang").setTypes("book").setQuery(termQuery).get(); } 

高亮查询

/*** 高亮查询* highlighter(highlightBuilder)用来指定高亮设置* requireFiledMatch(false)开启多个字段高亮* field 用来定义哪些字段高亮 *表示高亮所有字段* preTags("<span style='color:red'>") 用来指定高亮的前缀* postTags("</span>") 用来指定高亮后缀*/
@Test
public void testHighLight() throws Exception {
    TermQueryBuilder termQuery = QueryBuilders.termQuery("name", "小黑");HighlightBuilder highlightBuilder = new HighlightBuilder();highlightBuilder.requireFieldMatch(false).field("name").field("content").preTags("<span style='color:red'>").postTags("</span>");SearchResponse searchResponse = transportClient.prepareSearch("dangdang").setTypes("book").highlighter(highlightBuilder).setQuery(termQuery).get();SearchHits hits = searchResponse.getHits();System.out.println("符合条件的记录数:"+hits.totalHits);for (SearchHit hit : hits) {
    Map<String, Object> sourceAsMap = hit.getSourceAsMap();Map<String, HighlightField> highlightFields = hit.getHighlightFields();System.out.println("=========高亮之前=========");sourceAsMap.forEach(((k,v)->{
    System.out.println("key:"+k+" value:"+v);});System.out.println("==========高亮之后========");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.getFragments()[0]);}else{
    System.out.println("key:"+entry.getKey()+" value:"+entry.getValue());}}}
}

过滤查询

/*** 会先进行filter过滤然后在执行query查询*/
@Test
public void queryFilter() throws Exception {
    transportClient.prepareSearch("dangdang").setTypes("book").setQuery(QueryBuilders.termQuery("content", "spring")).setPostFilter(QueryBuilders.rangeQuery("age").gt(23)).get();
}
  相关解决方案