ElasticSearch学习笔记(5)· Java操作Elasticsearch6.2.4

十、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());
	updateRequest.doc(JSON.toJSONString(updateBook),XContentType.JSON);
	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();
}

ElasticSearch学习笔记(1)· ES基本概念
ElasticSearch学习笔记(2)· 基于Kibana的基本CRUD
ElasticSearch学习笔记(3)· ES高级检索(query)
ElasticSearch学习笔记(4)· ES IK分词器
ElasticSearch学习笔记(5)· Java操作Elasticsearch6.2.4
ElasticSearch学习笔记(6)· Java操作Elasticsearch7.6.1
ElasticSearch学习笔记(7)· Springboot+SpringData操作ES
ElasticSearch学习笔记(8)· ES集群的搭建

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值