Elasticsearch学习3

package com.sike;

import co.elastic.clients.elasticsearch.ElasticsearchAsyncClient;
import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch._types.SortOptions;
import co.elastic.clients.elasticsearch._types.SortOptionsBuilders;
import co.elastic.clients.elasticsearch._types.SortOrder;
import co.elastic.clients.elasticsearch._types.aggregations.Aggregate;
import co.elastic.clients.elasticsearch._types.aggregations.AvgAggregate;
import co.elastic.clients.elasticsearch._types.query_dsl.MatchQuery;
import co.elastic.clients.elasticsearch._types.query_dsl.Query;
import co.elastic.clients.elasticsearch.cat.IndicesResponse;
import co.elastic.clients.elasticsearch.core.*;
import co.elastic.clients.elasticsearch.core.bulk.BulkOperation;
import co.elastic.clients.elasticsearch.core.search.Highlight;
import co.elastic.clients.elasticsearch.core.search.Hit;
import co.elastic.clients.elasticsearch.core.search.Suggester;
import co.elastic.clients.elasticsearch.indices.CreateIndexResponse;
import co.elastic.clients.elasticsearch.indices.DeleteIndexResponse;
import co.elastic.clients.elasticsearch.indices.GetIndexResponse;
import co.elastic.clients.elasticsearch.indices.IndexState;
import co.elastic.clients.transport.endpoints.BooleanResponse;
import co.elastic.clients.util.ObjectBuilder;
import com.sike.entity.Emp;
import com.sike.entity.Student;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.function.Function;

@SpringBootTest
class Elasticsearch1ApplicationTests {

@Autowired
ElasticsearchClient client; //同步

@Autowired
ElasticsearchAsyncClient asyncclient; //异步

@Test
void createIndex() throws IOException { //创建索引
//写法比RestHighLevelClient更加简洁
CreateIndexResponse indexResponse = client.indices().create(c -> c.index("emp"));
System.out.println(indexResponse);
System.out.println(indexResponse.acknowledged());
}

@Test
void existsIndex() throws IOException { // 判断索引是否存在
BooleanResponse booleanResponse = client.indices().exists(e -> e.index("emp"));
System.out.println(booleanResponse.value());

}

//查看某个索引信息
@Test
void findIndex() throws IOException {
GetIndexResponse getIndexResponse = client.indices().get(getIndex
-> getIndex.index("emp"));
System.out.println(getIndexResponse.result());
}

//查看所有索引信息
@Test
void findIndexes() throws IOException {
IndicesResponse indicesResponse = client.cat().indices();
System.out.println(indicesResponse.valueBody());
}


//删除某个索引
@Test
void deleteIndex() throws IOException {
DeleteIndexResponse deleteIndexResponse = client.indices().delete(d -> d.index("emp"));
System.out.println(deleteIndexResponse.acknowledged());
}


@Test //添加文档
void addDocument() throws IOException {
Emp emp = new Emp("1", "李白", "男", 20, "经理", 10000, "销售部");
IndexResponse indexResponse = client.index(i -> i
.index("emp") //索引名称
.id(emp.getEmpno()) //设置id
.document(emp)); //存入emp对象作为文档,会自动转换为JSON格式
System.out.println(indexResponse);
}

//批量添加文档
@Test
public void bulkTest() throws IOException {
List<Emp> empList = new ArrayList<>();
empList.add(new Emp("2", "杜甫", "男", 25, "销售", 10000, "销售部"));
empList.add(new Emp("3", "李清照", "女", 20, "经理", 20000, "宣传部"));
empList.add(new Emp("4", "苏东坡", "男", 25, "销售", 20000, "销售部"));
empList.add(new Emp("5", "王维", "男", 20, "策划", 10000, "宣传部"));
List<BulkOperation> bulkOperationArrayList = new ArrayList<>();
//遍历添加到bulk中
for (Emp emp : empList) {
bulkOperationArrayList.add(BulkOperation.of(o -> o.index(i -> i.document(emp).id(emp.getEmpno()))));
}
CompletableFuture<BulkResponse> bulkResponse = asyncclient.bulk(b -> b.index("emp")
.operations(bulkOperationArrayList));
System.out.println(bulkResponse);
}

//查询文档
@Test
public void getDocumentTest() throws IOException {
GetResponse<Emp> getResponse = client.get(g -> g
.index("emp")//索引名称
.id("1")//文档id编号
, Emp.class
);
System.out.println(getResponse.source());
}

//判断文档是否存在
@Test
public void existDocumentTest() throws IOException {
BooleanResponse indexResponse = client.exists(e -> e.index("emp").id("1"));
System.out.println(indexResponse.value());
}

// 更新文档
@Test
public void updateDocumentTest() throws IOException {
//修改后的Emp对象
Emp emp=new Emp("1", "李白", "男", 20, "经理", 20000, "销售部");
UpdateResponse<Emp> updateResponse = client.update(u -> u
.index("emp")
.id("1")
.doc(emp) //此处传入修改后的Emp对象
, Emp.class);
}

//删除文档
@Test
public void deleteDocumentTest() throws IOException {
DeleteResponse deleteResponse = client.delete(d -> d
.index("emp")
.id("1")
);
System.out.println(deleteResponse.id());
}

//查询某个索引的全部数据
@Test
public void searchAll() throws IOException {
List<Emp> list = new ArrayList<>(); //备用,可以供其他类调用
Query queryAll = Query.of(q -> q.matchAll(m -> m));
SearchRequest searchRequest = new SearchRequest.Builder().index("emp").query(queryAll).build();
SearchResponse<Emp> search = client.search(searchRequest, Emp.class);
for (Hit<Emp> hit : search.hits().hits()) {//获取查询结果
System.out.println(hit.source());
list.add(hit.source());
}
}

//查询某个索引的总文档条数
@Test
public void searchCount() throws IOException {
CountRequest countRequest = CountRequest.of(s -> s.index("emp"));
CountResponse countResponse = client.count(countRequest);
System.out.println("总文档条数:" + countResponse.count());
}

//条件查询,查询姓名为李白的员工,有分词效果
@Test
public void searchMatch() throws IOException {
List<Emp> list = new ArrayList<>(); //备用,可以供其他类调用
Query queryByName = Query.of(q -> q.match(m -> m.field("ename").query("李白")));
SearchRequest searchRequest = new SearchRequest.Builder().index("emp").query(queryByName).build();
SearchResponse<Emp> search = client.search(searchRequest, Emp.class);
for (Hit<Emp> hit : search.hits().hits()) {//获取查询结果
System.out.println(hit.source());
list.add(hit.source());
}
}

//完全匹配查询,查询姓名为李白的员工,无分词效果
@Test
public void searchMatchPhrase() throws IOException {
List<Emp> list = new ArrayList<>(); //备用,可以供其他类调用
Query queryByName = Query.of(q -> q.matchPhrase(m -> m.field("ename").query("李白")));
SearchRequest searchRequest = new SearchRequest.Builder().index("emp").query(queryByName).build();
SearchResponse<Emp> search = client.search(searchRequest, Emp.class);
for (Hit<Emp> hit : search.hits().hits()) {
System.out.println(hit.source());
list.add(hit.source());
}
}

//多条件查询,多个条件都同时要满足(逻辑关系为and),查询姓名为李白的男员工
@Test
public void searchBoolMust() throws IOException {

List<Emp> list = new ArrayList<>(); //备用,可以供其他类调用
Query queryByEname = Query.of((q -> q.match(m -> m.field("ename").query("李白"))));
Query queryByGender = Query.of((q -> q.match(m -> m.field("gender").query("男"))));
Query bool = Query.of(q -> q.bool(b -> b.must(queryByEname).must(queryByGender)));
SearchRequest searchRequest = new SearchRequest.Builder().index("emp").query(bool).build();
SearchResponse<Emp> search = client.search(searchRequest, Emp.class);
for (Hit<Emp> hit : search.hits().hits()) {
System.out.println(hit.source());
list.add(hit.source());
}
}

//多条件查询,多个条件都满足任意一个均可(逻辑关系为or),查询姓名为李白的女员工
@Test
public void searchBoolShould() throws IOException {
List<Emp> list = new ArrayList<>(); //备用,可以供其他类调用
Query QueryByEname = Query.of((q -> q.match(m -> m.field("ename").query("李白"))));
Query QueryByGender = Query.of((q -> q.match(m -> m.field("gender").query("女"))));
Query bool = Query.of(q -> q.bool(b -> b.should(QueryByEname).should(QueryByGender)));
SearchRequest searchRequest = new SearchRequest.Builder().index("emp").query(bool).build();
SearchResponse<Emp> search = client.search(searchRequest, Emp.class);
for (Hit<Emp> hit : search.hits().hits()) {
System.out.println(hit.source());
list.add(hit.source());
}
}

//模糊查询,查询姓名为中包含李的员工
@Test
public void searchFuzzy() throws IOException {
List<Emp> list = new ArrayList<>(); //备用,可以供其他类调用
Query queryByNameFuzzy = Query.of(q -> q.wildcard(m -> m.field("ename").value("*李*")));//包含李字
// Query queryByNameFuzzy = Query.of(q -> q.prefix(m -> m.field("ename").value("李")));//以李字为前缀(开头)
// Query queryByNameFuzzy = Query.of(q -> q.fuzzy(m -> m.field("ename").value("李")));//包含李字
// Query queryByNameFuzzy = Query.of(q -> q.fuzzy(m -> m.field("ename").value("李").fuzziness("2"))); //这样如果相差不超过两个字符,也算

SearchRequest searchRequest = new SearchRequest.Builder().index("emp").query(queryByNameFuzzy).build();
SearchResponse<Emp> search = client.search(searchRequest, Emp.class);
for (Hit<Emp> hit : search.hits().hits()) {
System.out.println(hit.source());
list.add(hit.source());
}

}

//按指定字段排序,按年龄降序排序
@Test
public void searchAllSort() throws IOException {
List<Emp> list = new ArrayList<>(); //备用,可以供其他类调用
Query queryAll = Query.of(q -> q.matchAll(m -> m));
SortOptions sortByAgeDesc = SortOptions.of(o -> o.field(f -> f.field("age").order(SortOrder.Desc)));//按年龄降序,升序就用Asc
SearchRequest searchRequest = new SearchRequest.Builder().index("emp").query(queryAll).sort(sortByAgeDesc).build();
SearchResponse<Emp> search = client.search(searchRequest, Emp.class);
for (Hit<Emp> hit : search.hits().hits()) {
System.out.println(hit.source());
list.add(hit.source());
}
}

//分页查询 查询第1页,每页显示3条
@Test
void searchPage() throws IOException {
int pageNum = 1;//页码
int pageSize = 3;//每页显示条数
List<Emp> list = new ArrayList<>(); //备用,可以供其他类调用
Query queryAll = Query.of(q -> q.matchAll(m -> m));
SearchRequest searchRequest = new SearchRequest.Builder().index("emp").query(queryAll)
.from((pageNum - 1) * pageSize)
.size(pageSize)
.build();
SearchResponse<Emp> search = client.search(searchRequest, Emp.class);
for (Hit<Emp> hit : search.hits().hits()) {
System.out.println(hit.source());
list.add(hit.source());
}
}


//聚合查询,查询男员工的平均年龄
@Test
void searchAggr() throws IOException {
List<Emp> list = new ArrayList<>(); //备用,可以供其他类调用
Query queryByGender = Query.of(q -> q.match(m -> m.field("gender").query("男")));
SearchRequest searchRequest = new SearchRequest.Builder()
.index("emp")
.query(queryByGender)
.aggregations("avg_age", a -> a.avg(t -> t.field("age")))
.build();
SearchResponse<Emp> search = client.search(searchRequest, Emp.class);
System.out.println("男生平均年龄:" + search.aggregations().get("avg_age").avg().value());
}



//高亮显示
@Test
void hightLight() throws IOException {

List<Emp> list = new ArrayList<>(); //备用,可以供其他类调用
Query queryByName = Query.of(q -> q.match(m -> m.field("ename").query("李白")));
String[] fields = {"ename"}; //指定哪些字段要高亮
Highlight highlightBuilder = Highlight.of(h -> { //设置高亮字段的效果,前后缀HTML标签
for (String field : fields) {
h.fields(
field
,
h1 -> h1.preTags("<font color='red'>").postTags("</font>"));
}
return h;
}
);
SearchRequest searchRequest = new SearchRequest.Builder()
.index("emp")
.query(queryByName)
.highlight(highlightBuilder) //添加高亮效果
.build();
SearchResponse<Emp> search = client.search(searchRequest, Emp.class);
for (Hit<Emp> hit : search.hits().hits()) {
Emp emp = hit.source();
emp.setEname(hit.highlight().get("ename").get(0));//将原始字段ename替换为高亮显示效果后的字段
System.out.println(emp);
// System.out.println(hit.source()+"---"+hit.highlight());//也可简单展示进行观察
list.add(emp);
}


}

//自动补全查询
@Test
void testCompletion() throws IOException {
List<Student> list = new ArrayList<>(); //备用,可以供其他类调用
Suggester suggester = Suggester.of(s -> s.suggesters("university_suggest", p -> p.prefix("北").
completion(c -> c.field("university").size(3).skipDuplicates(true))));
// Query queryByName = Query.of(q -> q.match(m -> m.field("ename").query("李白")));
SearchRequest searchRequest = new SearchRequest.Builder().index("student").suggest(suggester).build();
// SearchRequest searchRequest = new SearchRequest.Builder().index("emp").query(queryByName).build();
SearchResponse<Student> search = client.search(searchRequest, Student.class);
int size = search.suggest().get("university_suggest").get(0).completion().options().size();
for (int i = 0; i < size; i++) {
Student student = search.suggest().get("university_suggest").get(0).completion().options().get(i).source();
list.add(student);
System.out.println(student);
}
}
}
posted @   全琪俊  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
点击右上角即可分享
微信分享提示