Elasticsearch JavaRestClient版
文章目录
- 初始化RestHighLeveClient(必要条件)
- 索引库操作
- 1.创建索引库(4步)
- 2.删除索引库(3步)
- 3.判断索引库是否存在(3步)
- 4.总结:四步走
- 文档操作
- 1.创建文档(4步)
- 2.删除文档(3步)
- 3.查看文档(4步)
- 4.增量修改文档(局部更新)(4步)
- 5.批量创建文档(4步)
- 6.总结:五步走
- Elasticsearch查询语法
- 1.全文检索(5步)
- match_all
- match
- multi_match
- 2.精确查找
- term
- range
- 3.复合查询
- Bool Query(5步)
- function score(广告置顶)
- 排序(sort)
- 分页(from/size)
- 高亮(highlight)
- 总结
初始化RestHighLeveClient(必要条件)
<!--Maven配置-->
<!--引入es的RestHignLeveClient依赖-->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
</dependency>
<!--因为SpringBoot默认的ES版本是7.6.2,所以我们需要覆盖默认的ES版本:-->
<properties>
<java.version>1.8</iava.version>
<elasticsearch,version>7.12.1</elasticsearch.version>
</properties>
//1.初始化RestHighLeveClient
RestHighLeveClient client = new RestHighLeveClient(RestClient.builder(
//写自己的ES地址
HttpHost.create("localhost:9200");
))
索引库操作
1.创建索引库(4步)
//2.相当于 PUT /索引名
CreateIndexRequest request = new CreateIndexRequest("索引库名");
//3.相当于请求体JSON风格
request.source("请求体",XContentType.JSON);
//4.发起请求.indices()包含索引库操作的的所有方法
client.indices().create(request,RequestOptions.DEFAULT);
2.删除索引库(3步)
// 2.相当于 DELETE /索引库名
DeleteIndexRequest request = new DeleteIndexRequest("索引库名");
//3.发起请求
client.indices().create(request,RequestOptions.DEFAULT);
3.判断索引库是否存在(3步)
// 2.相当于 GET /索引库名
GetIndexRequest request = new GetIndexRequest("索引库名称");
// 3.发起请求
boolean exists = client.indices.exists(request,RequestOptions.DEFAULT);
//输出查看是否存在,是为true,不是为false
System.out.println(exists);
4.总结:四步走
从这里可以看出,创建索引有四步,其余只有三步
文档操作
1.创建文档(4步)
// 2.相当于POST /索引库名/_doc/文档id
IndexRequest request = new IndexRequest("索引库名").id("文档id");
// 3.准备json文档,也就是文档的内容,请求体
request.source("请求体",XContentType.JSON);
// 4.发送请求
client.index(request,RequestOptions.DEFAULT);
/**注意:
*如果是请求体是实体对象,请序列化成JSON.toJSONString(请求体)
*文档id在ES默认是keyword,在java中也就是String类型,需要toString()转成字符串
*/
2.删除文档(3步)
// 2.相当于 DELETE /索引库名/_doc/文档id
DeleteRequest request = new DeleteRequest("索引库名","文档id");
// 3.发送请求
client.delete(request,RequestOptions.DEFAULT);
3.查看文档(4步)
// 2.相当于 GET /索引库名/_doc/文档id
GetRequest request = new GetRequest("索引库名","文档id");
// 3.发送请求
GetResponse response = client.get(request,RequestOptions.DEFAULT)
// 4.解析结果
String json = response.getSourceAsString();
System.out.println(json)
4.增量修改文档(局部更新)(4步)
// 2.相当于 POST /索引库名/ _update/文档id
UpdateRequest request = new UpdateRequest("indexName","文档id");
// 3.准备参数
request.doc(
"age":18,
"name":"Rose"
)
// 4.更新文档
client.update(request,RequestOptions.DEFAULT)
5.批量创建文档(4步)
// 2.创建Bulk请求
BulkRequest request = new BulkRequest();
// 3.准备参数,添加多个IndexRequest(),以实体类为例
for(Student student:students){
Student student = new Student();
request.add(new IndexRequest("索引库名")
.id(student.getId())
.source(JSON.toJSONString(student),XContentType.JSON);)
}
// 4.发送请求
client.bulk(request,RequestOptions.DEFAULT)
6.总结:五步走
Elasticsearch查询语法
1.全文检索(5步)
match_all
// match_all
// 2.准备request
SearchRequest request = new SearchRequest("索引库名");
// 3.组织DSL参数
request.source.query(QueryBuilders.matchAll());
// 4.发送请求,得到结果
SearchResponse response = client.search(request,RequestOptions.DEFAULT);
// 5.解析响应结果
SearchHits searchHits = response.getHits();
// 5.1获取总条数
long total = searchHits.getTotalHits().value;
// 5.2获取文档数组并且遍历
SearHits[] hits = searchHits.getHits();
for(SearchHits hit : hits){
//获取文档数据源
String json = hit.getSourceAaString();
//反序列化
HoteDoc hotelDoc = JSON.parseObject(json,HoteDoc.class);
}
System.out.println(response);
match
//在match_all第5行修改
QueryBuilders.matchQuery("要查询的字段","查询的内容");
multi_match
//在match_all第5行修改
QueryBuilders.multiMatchQuery("要查询的内容","被查询的字段","被查询的字段");
2.精确查找
term
//在match_all第5行修改
QueryBuilders.termQuery("查询字段","被查询的内容")
range
//在match_all第5行修改
QueryBuilders.rangeQuery("被查询字段").get(100).lte(150)
3.复合查询
Bool Query(5步)
// 2.准备request
SearchRequest request = new SearchRequest("索引库名");
// 3.复合条件
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
boolQuery.must();
boolQuery.filter();
// 3.1组织DSL参数
request.source.query(boolQuery);
// 4.发送请求,得到结果
SearchResponse response = client.search(request,RequestOptions.DEFAULT);
// 5.解析结果
function score(广告置顶)
// 2.准备request
SearchRequest request = new SearchRequest("索引库名");
// 3.复合条件
FunctionScoreQueryBuilder functionScoreQuery =
QueryBuilders.functionScoreQuery(
//原始查询
QueryBuilders.matchAll();
//function
new FunctionScoreQueryBuilder.FilterFunctionBuilder(
//过滤条件
QueryBuilders.termQuery("查询字段","被查询的内容")
//算分函数
ScoreFunctionBuilders.weightFactorFunction(10)
)
)
// 3.1组织DSL参数
request.source.query(functionScoreQuery);
// 4.发送请求,得到结果
SearchResponse response = client.search(request,RequestOptions.DEFAULT);
排序(sort)
// 普通字段排序
request.source.sort("要排序的字段",排序方式);
// 地理坐标距离排序
request.source.sort(SortBuilders
.geoDistanceSort("geo_point类型字段",new GeoPoint("经度,纬度"))
.order(SortOrder.ASC)
.unit(DistanceUnit.KILOMETERS)
)
分页(from/size)
request.source.from(0).size(5);
高亮(highlight)
// 2.准备request
SearchRequest request = new SearchRequest("索引库名");
// 3.准备DSL查询出来的字段
request.source.query(QueryBuilders.matchQuery("要查询的字段","查询的内容"))
// 3.1对查询出来的字段高亮显示
request.source.highlighter(new HighlightBuilder().field("要高亮的字段")
.requireFieldMatch(false)//是否需要与查询字段匹配
)
// 4.发送请求
SearchResponse response = client.search(request,RequestOptions.DEFAULT);
//高亮结果的处理
// 5.解析响应结果
SearchHits searchHits = response.getHits();
// 5.1获取总条数
long total = searchHits.getTotalHits().value;
// 5.2获取文档数组并且遍历
SearHits[] hits = searchHits.getHits();
for(SearchHits hit : hits){
//获取文档数据源
String json = hit.getSourceAaString();
//反序列化
HoteDoc hotelDoc = JSON.parseObject(json,HoteDoc.class);
//获取高亮结果
Map<String,HighlightField> highlightFields = hit.getHighlightFields();
if(!CollectionUtils.isEmpty(highlightFields)){
//根据字段获取高亮结果
HighlightFields highlightField = highlightFields.get("name");
if(highlightField != null){
highlightField.getFragments()[0].string();
hotelDoc.setName(name);
}
}
}