目录
十、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集群的搭建