1、依赖的导入
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
</dependency>
2、客户端链接
RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(HttpHost.create("http://localhost:9200")));
3、索引库的相关操作
1、索引库的创建
@Test
void createTestIndex() throws IOException {
CreateIndexRequest request = new CreateIndexRequest("test_index");
String source = "{\n" +
" \"mappings\":{\n" +
" \"properties\":{\n" +
" \"id\":{\n" +
" \"type\":\"integer\"\n" +
" },\n" +
" \"name\":{\n" +
" \"type\":\"text\",\n" +
" \"analyzer\":\"ik_max_word\"\n" +
" },\n" +
" \"age\":{\n" +
" \"type\":\"integer\"\n" +
" },\n" +
" \"sex\":{\n" +
" \"type\":\"keyword\"\n" +
" },\n" +
" \"bossId\":{\n" +
" \"type\":\"integer\"\n" +
" },\n" +
" \"departmentId\":{\n" +
" \"type\":\"integer\"\n" +
" }\n" +
" }\n" +
" }\n" +
"}";
request.source(source, XContentType.JSON);
client.indices().create(request, RequestOptions.DEFAULT);
}
2、判断索引库是否存在
@Test
void existsTestIndex() throws IOException {
GetIndexRequest request = new GetIndexRequest("test_index");
boolean is = client.indices().exists(request, RequestOptions.DEFAULT);
System.out.println(is);
}
3、删除索引库
@Test
void deleteTestIndex() throws IOException {
DeleteIndexRequest request = new DeleteIndexRequest("test_index");
client.indices().delete(request, RequestOptions.DEFAULT);
}
4、文档的操作
1、创建文档
@Test
void createDocTest() throws IOException {
Employee employee = employeeMapper.selectAllById(1);
IndexRequest request = new IndexRequest("test_index").id(employee.getId().toString());
String source = JSON.toJSONString(employee);
request.source(source, XContentType.JSON);
client.index(request, RequestOptions.DEFAULT);
}
2、获取指定的文档
@Test
void getDocTest() throws IOException {
GetRequest request = new GetRequest("test_index","1");
GetResponse response = client.get(request, RequestOptions.DEFAULT);
String json = response.getSourceAsString();
System.out.println(json);
Employee employee = JSON.parseObject(json, Employee.class);
System.out.println(employee);
}
3、更新文档
@Test
void updateDocTest() throws IOException {
UpdateRequest request = new UpdateRequest("test_index","1");
request.doc(
"age",18
);
client.update(request,RequestOptions.DEFAULT);
}
4、删除文档
@Test
void deleteDocTest() throws IOException {
DeleteRequest request = new DeleteRequest("test_index","1");
client.delete(request,RequestOptions.DEFAULT);
}
5、批量操作(创建)
@Test
void batchCreateDocTest() throws IOException {
BulkRequest request = new BulkRequest();
List<Employee> employees = employeeMapper.selectAll();
for(Employee e : employees){
request.add(new IndexRequest("test_index")
.id(e.getId().toString())
.source(JSON.toJSONString(e),XContentType.JSON));
}
client.bulk(request,RequestOptions.DEFAULT);
}
5、搜索文档
1、分词查询-查询全部
@Test
void matchAllTest() throws IOException {
SearchRequest request = new SearchRequest("test_index");
request.source()
.query(QueryBuilders.matchAllQuery());
SearchResponse response = client.search(request,RequestOptions.DEFAULT);
SearchHits searchHits = response.getHits();
long total = searchHits.getTotalHits().value;
System.out.println("总共有:" + total + "条数据");
SearchHit[] hits = searchHits.getHits();
for(SearchHit h : hits){
String json = h.getSourceAsString();
Employee employee = JSON.parseObject(json, Employee.class);
System.out.println(employee);
}
}
2、分词查询-指定字段
@Test
void matchQueryTest() throws IOException {
SearchRequest request = new SearchRequest("test_index");
request.source()
.query(QueryBuilders.matchQuery("name","晨"));
SearchResponse response = client.search(request,RequestOptions.DEFAULT);
SearchHits searchHits = response.getHits();
long total = searchHits.getTotalHits().value;
System.out.println("总共有:" + total + "条数据");
SearchHit[] hits = searchHits.getHits();
for(SearchHit h : hits){
String json = h.getSourceAsString();
Employee employee = JSON.parseObject(json, Employee.class);
System.out.println(employee);
}
}
3、精确查询
@Test
void termQueryTest() throws IOException {
SearchRequest request = new SearchRequest("test_index");
request.source()
.query(QueryBuilders.termQuery("age","33"));
SearchResponse response = client.search(request,RequestOptions.DEFAULT);
SearchHits searchHits = response.getHits();
long total = searchHits.getTotalHits().value;
System.out.println("总共有:" + total + "条数据");
SearchHit[] hits = searchHits.getHits();
for(SearchHit h : hits){
String json = h.getSourceAsString();
Employee employee = JSON.parseObject(json, Employee.class);
System.out.println(employee);
}
}
4、范围查询
@Test
void rangeQueryTest() throws IOException {
SearchRequest request = new SearchRequest("test_index");
request.source()
.query(QueryBuilders.rangeQuery("age").gte(30).lte(35));
SearchResponse response = client.search(request,RequestOptions.DEFAULT);
SearchHits searchHits = response.getHits();
long total = searchHits.getTotalHits().value;
System.out.println("总共有:" + total + "条数据");
SearchHit[] hits = searchHits.getHits();
for(SearchHit h : hits){
String json = h.getSourceAsString();
Employee employee = JSON.parseObject(json, Employee.class);
System.out.println(employee);
}
}
5、复合查询
@Test
void boolQueryTest() throws IOException {
SearchRequest request = new SearchRequest("test_index");
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
boolQuery.must(QueryBuilders.matchQuery("name","雨"));
boolQuery.filter(QueryBuilders.rangeQuery("age").gte(20).lte(35));
request.source()
.query(boolQuery);
SearchResponse response = client.search(request,RequestOptions.DEFAULT);
SearchHits searchHits = response.getHits();
long total = searchHits.getTotalHits().value;
System.out.println("总共有:" + total + "条数据");
SearchHit[] hits = searchHits.getHits();
for(SearchHit h : hits){
String json = h.getSourceAsString();
Employee employee = JSON.parseObject(json, Employee.class);
System.out.println(employee);
}
}
6、分页排序查询
@Test
void pageSortQueryTest() throws IOException {
int page = 3,size = 10;
SearchRequest request = new SearchRequest("test_index");
request.source()
.from((page-1)*size)
.size(size)
.sort("id", SortOrder.ASC)
.query(QueryBuilders.matchAllQuery());
SearchResponse response = client.search(request,RequestOptions.DEFAULT);
SearchHits searchHits = response.getHits();
long total = searchHits.getTotalHits().value;
System.out.println("总共有:" + total + "条数据");
SearchHit[] hits = searchHits.getHits();
for(SearchHit h : hits){
String json = h.getSourceAsString();
Employee employee = JSON.parseObject(json, Employee.class);
System.out.println(employee);
}
}
6、高亮查询
@Test
void highLightQueryTest() throws IOException {
SearchRequest request = new SearchRequest("test_index");
request.source()
.highlighter(new HighlightBuilder()
.field("name")
.requireFieldMatch(false)
)
.query(QueryBuilders.matchQuery("name","晨"));
SearchResponse response = client.search(request,RequestOptions.DEFAULT);
SearchHits searchHits = response.getHits();
long total = searchHits.getTotalHits().value;
System.out.println("总共有:" + total + "条数据");
SearchHit[] hits = searchHits.getHits();
for(SearchHit h : hits){
String json = h.getSourceAsString();
Employee employee = JSON.parseObject(json, Employee.class);
HighlightField name = h.getHighlightFields().get("name");
employee.setName(name.getFragments()[0].toString());
System.out.println(employee);
}
}