POM依赖
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.4.0</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
<version>7.4.0</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>7.4.0</version>
</dependency>
application.yml配置
elasticsearch:
host: 127.0.0.1
port: 1234
Bean配置
@Configuration
@ConfigurationProperties(prefix="elasticsearch")
public class ElasticSearchConfig {
private String host;
private int port;
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public int getPort() {
return port;
}
public void setPort(int port) {
this.port = port;
}
@Bean
public RestHighLevelClient client(){
return new RestHighLevelClient(RestClient.builder(
new HttpHost(host,port,"http")
));
}
}
注入使用
@Autowired
RestHighLevelClient client;
操作索引
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.support.master.AcknowledgedResponse;
import org.elasticsearch.client.IndicesClient;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.CreateIndexResponse;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.client.indices.GetIndexResponse;
import org.elasticsearch.cluster.metadata.MappingMetaData;
import org.elasticsearch.common.xcontent.XContentType;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.Map;
@SpringBootTest
class SpringbootEsApplicationTests {
@Autowired
RestHighLevelClient client;
//添加索引
@Test
void addIndex() throws Exception {
//1.使用client获取操作索引的对象
IndicesClient indicesClient = client.indices();
//2.创建person2索引
CreateIndexRequest createRequest = new CreateIndexRequest("person2");
CreateIndexResponse createIndexResponse = indicesClient.create(createRequest, RequestOptions.DEFAULT);
//3.获取创建结果 - true成功,false失败
boolean acknowledged = createIndexResponse.isAcknowledged();
System.out.println(acknowledged);
}
//添加索引并指定映射
@Test
void addIndexAndMapping() throws Exception {
//1.使用client获取操作索引的对象
IndicesClient indicesClient = client.indices();
//2.创建person2索引
CreateIndexRequest createRequest = new CreateIndexRequest("person3");
//3.设置映射
String mapping = "{\n" +
" \"properties\" : {\n" +
" \"address\" : {\n" +
" \"type\" : \"text\",\n" +
" \"analyzer\" : \"ik_max_word\"\n" +
" },\n" +
" \"age\" : {\n" +
" \"type\" : \"long\"\n" +
" },\n" +
" \"name\" : {\n" +
" \"type\" : \"keyword\"\n" +
" }\n" +
" }\n" +
" }";
createRequest.mapping(mapping, XContentType.JSON);
CreateIndexResponse createIndexResponse = indicesClient.create(createRequest, RequestOptions.DEFAULT);
//4.获取创建结果 - true成功,false失败
boolean acknowledged = createIndexResponse.isAcknowledged();
System.out.println(acknowledged);
}
//查询索引
@Test
void queryIndex() throws Exception {
IndicesClient indicesClient = client.indices();
GetIndexRequest getRequest = new GetIndexRequest("person3");
GetIndexResponse getIndexResponse = indicesClient.get(getRequest, RequestOptions.DEFAULT);
Map<String, MappingMetaData> mappings = getIndexResponse.getMappings();
for (Map.Entry<String, MappingMetaData> metaDataEntry : mappings.entrySet()) {
System.out.println("key:" + metaDataEntry.getKey() + " -> value:" + metaDataEntry.getValue().getSourceAsMap());
}
}
//删除索引
@Test
void deleteIndex() throws Exception {
IndicesClient indicesClient = client.indices();
DeleteIndexRequest deleteRequest = new DeleteIndexRequest("person2");
AcknowledgedResponse acknowledgedResponse = indicesClient.delete(deleteRequest, RequestOptions.DEFAULT);
System.out.println(acknowledgedResponse.isAcknowledged());
}
//检查索引是否存在
@Test
void existIndex() throws Exception {
IndicesClient indicesClient = client.indices();
GetIndexRequest getRequest = new GetIndexRequest("person3");
boolean exists = indicesClient.exists(getRequest, RequestOptions.DEFAULT);
System.out.println(exists);
}
}
操作文档
package com.example.springboot_es;
import com.alibaba.fastjson.JSONObject;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.HashMap;
import java.util.Map;
//person实体
class Person{
private String id;
private String name;
private Integer age;
private String address;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
@SpringBootTest
class SpringbootEsApplicationTests {
@Autowired
RestHighLevelClient client;
//添加文档,Map添加
@Test
void addDocumentByMap() throws Exception {
Map<String, Object> data = new HashMap<>();
data.put("address", "北京海淀北土城");
data.put("name", "王五");
data.put("age", 27);
IndexRequest indexRequest = new IndexRequest("person").id("id5").source(data);
IndexResponse indexResponse = client.index(indexRequest, RequestOptions.DEFAULT);
System.out.println(indexResponse.getId());
}
//添加文档,实体添加
@Test
void addDocumentByPO() throws Exception {
Person person = new Person();
person.setId("id6");
person.setName("赵六");
person.setAge(23);
person.setAddress("河北石家庄火车站");
String jsonPO = JSONObject.toJSONString(person);
IndexRequest indexRequest = new IndexRequest("person").id(person.getId()).source(jsonPO, XContentType.JSON);
IndexResponse indexResponse = client.index(indexRequest, RequestOptions.DEFAULT);
System.out.println(indexResponse.getId());
}
//修改文档:添加文档时,Id存在则修改,Id不存在则添加
@Test
void updateDocument() throws Exception {
Person person = new Person();
person.setId("id6");
person.setName("赵六");
person.setAge(25);
person.setAddress("河北廊坊");
String jsonPO = JSONObject.toJSONString(person);
IndexRequest indexRequest = new IndexRequest("person").id(person.getId()).source(jsonPO, XContentType.JSON);
IndexResponse indexResponse = client.index(indexRequest, RequestOptions.DEFAULT);
System.out.println(indexResponse.getId());
}
//根据ID查询文档
@Test
void queryDocumentById() throws Exception {
GetRequest getRequest = new GetRequest("person", "id6");
GetResponse documentFields = client.get(getRequest, RequestOptions.DEFAULT);
System.out.println(documentFields.getSourceAsString());
}
//删除文档
@Test
void deleteDocumentById() throws Exception {
DeleteRequest deleteRequest = new DeleteRequest("person", "id6");
DeleteResponse deleteResponse = client.delete(deleteRequest, RequestOptions.DEFAULT);
System.out.println(deleteResponse.getId());
System.out.println(deleteResponse.status());
}
}
批量操作
void addDocumentByMap() throws Exception {
//创建BulkRequest,整合所有操作
BulkRequest bulkRequest = new BulkRequest();
//删除id5记录
DeleteRequest deleteRequest = new DeleteRequest("person", "id5");
bulkRequest.add(deleteRequest);
//插入id8记录
Map<String, Object> data = new HashMap<>();
data.put("address", "北京海淀北土城");
data.put("name", "李四测试");
data.put("age", 27);
IndexRequest indexRequest = new IndexRequest("person").id("id10").source(data);
bulkRequest.add(indexRequest);
//修改id4记录
Map<String, Object> upMap = new HashMap<>();
upMap.put("address", "北京海淀北土城");
upMap.put("name", "修改测试");
upMap.put("age", 27);
UpdateRequest updateRequest = new UpdateRequest("person", "id4").doc(upMap);
bulkRequest.add(updateRequest);
//执行批量操作
BulkResponse bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT);
System.out.println(bulkResponse.status());
}
批量插入
void importData() throws Exception {
List<Person> personList = new ArrayList<>();
for (int i = 0; i < 10; i++) {
Person person = new Person();
person.setId("id-" + i);
person.setName("测试名称-" + i);
person.setAddress("测试地址-" + i);
person.setAge(20 + i);
personList.add(person);
}
//创建BulkRequest
BulkRequest bulkRequest = new BulkRequest();
//循环数据
for (Person person : personList) {
String jsonString = JSONObject.toJSONString(person);
IndexRequest indexRequest = new IndexRequest("person").id(person.getId()).source(jsonString, XContentType.JSON);
bulkRequest.add(indexRequest);
}
//执行插入数据
BulkResponse bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT);
System.out.println(bulkResponse.status());
}
查询所有
void matchAll() throws Exception {
SearchRequest searchResult = new SearchRequest("person");
//查询构建器
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//查询条件
QueryBuilder queryBuilder = QueryBuilders.matchAllQuery();
searchSourceBuilder.query(queryBuilder);
//分页 - 不加分页默认10条
searchSourceBuilder.from(0);
searchSourceBuilder.size(100);
searchResult.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchResult, RequestOptions.DEFAULT);
SearchHits searchHits = searchResponse.getHits();
System.out.println("总条数:" + searchHits.getTotalHits().value);
//获取数据
SearchHit[] hits = searchHits.getHits();
List<Person> personList = new ArrayList<>();
for (SearchHit hit : hits) {
String sourceAsString = hit.getSourceAsString();
Person person = JSONObject.parseObject(sourceAsString, Person.class);
personList.add(person);
}
System.out.println(JSONObject.toJSONString(personList));
}
词条查询
void termQuery() throws Exception {
SearchRequest searchResult = new SearchRequest("person");
//查询构建器
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//查询条件
QueryBuilder queryBuilder = QueryBuilders.termQuery("address", "北京");
searchSourceBuilder.query(queryBuilder);
//分页 - 不加分页默认10条
searchSourceBuilder.from(0);
searchSourceBuilder.size(100);
searchResult.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchResult, RequestOptions.DEFAULT);
SearchHits searchHits = searchResponse.getHits();
System.out.println("总条数:" + searchHits.getTotalHits().value);
//获取数据
SearchHit[] hits = searchHits.getHits();
List<Person> personList = new ArrayList<>();
for (SearchHit hit : hits) {
String sourceAsString = hit.getSourceAsString();
Person person = JSONObject.parseObject(sourceAsString, Person.class);
personList.add(person);
}
System.out.println(JSONObject.toJSONString(personList));
}
分词查询
void matchQuery() throws Exception {
SearchRequest searchResult = new SearchRequest("person");
//查询构建器
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//查询条件
QueryBuilder queryBuilder = QueryBuilders.matchQuery("address", "测试北京");
//取交集或并集
((MatchQueryBuilder) queryBuilder).operator(Operator.OR);
searchSourceBuilder.query(queryBuilder);
//分页 - 不加分页默认10条
searchSourceBuilder.from(0);
searchSourceBuilder.size(100);
searchResult.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchResult, RequestOptions.DEFAULT);
SearchHits searchHits = searchResponse.getHits();
System.out.println("总条数:" + searchHits.getTotalHits().value);
//获取数据
SearchHit[] hits = searchHits.getHits();
List<Person> personList = new ArrayList<>();
for (SearchHit hit : hits) {
String sourceAsString = hit.getSourceAsString();
Person person = JSONObject.parseObject(sourceAsString, Person.class);
personList.add(person);
}
System.out.println(JSONObject.toJSONString(personList));
}
模糊查询
void likeQuery() throws Exception {
SearchRequest searchResult = new SearchRequest("person");
//查询构建器
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//widcard查询
QueryBuilder queryBuilder = QueryBuilders.wildcardQuery("address", "北*");
//正则查询
QueryBuilder queryBuilder = QueryBuilders.regexpQuery("address", "\\w+(.)*");
//前缀查询
QueryBuilder queryBuilder = QueryBuilders.prefixQuery("address", "北");
searchSourceBuilder.query(queryBuilder);
//分页 - 不加分页默认10条
searchSourceBuilder.from(0);
searchSourceBuilder.size(100);
searchResult.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchResult, RequestOptions.DEFAULT);
SearchHits searchHits = searchResponse.getHits();
System.out.println("总条数:" + searchHits.getTotalHits().value);
//获取数据
SearchHit[] hits = searchHits.getHits();
List<Person> personList = new ArrayList<>();
for (SearchHit hit : hits) {
String sourceAsString = hit.getSourceAsString();
Person person = JSONObject.parseObject(sourceAsString, Person.class);
personList.add(person);
}
System.out.println(JSONObject.toJSONString(personList));
}
范围查询
void rangeQuery() throws Exception {
SearchRequest searchResult = new SearchRequest("person");
//查询构建器
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//范围查询 年龄25-30岁
QueryBuilder queryBuilder = QueryBuilders.rangeQuery("age");
((RangeQueryBuilder) queryBuilder).gte(25);
((RangeQueryBuilder) queryBuilder).lte(30);
searchSourceBuilder.query(queryBuilder);
//分页 - 不加分页默认10条
searchSourceBuilder.from(0);
searchSourceBuilder.size(100);
searchResult.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchResult, RequestOptions.DEFAULT);
SearchHits searchHits = searchResponse.getHits();
System.out.println("总条数:" + searchHits.getTotalHits().value);
//获取数据
SearchHit[] hits = searchHits.getHits();
List<Person> personList = new ArrayList<>();
for (SearchHit hit : hits) {
String sourceAsString = hit.getSourceAsString();
Person person = JSONObject.parseObject(sourceAsString, Person.class);
personList.add(person);
}
System.out.println(JSONObject.toJSONString(personList));
}
排序
void rangeQuerySort() throws Exception {
SearchRequest searchResult = new SearchRequest("person");
//查询构建器
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//范围查询 年龄25-30岁
QueryBuilder queryBuilder = QueryBuilders.rangeQuery("age");
((RangeQueryBuilder) queryBuilder).gte(25);
((RangeQueryBuilder) queryBuilder).lte(30);
searchSourceBuilder.query(queryBuilder);
//分页 - 不加分页默认10条
searchSourceBuilder.from(0);
searchSourceBuilder.size(100);
//排序
searchSourceBuilder.sort("age", SortOrder.DESC);
searchResult.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchResult, RequestOptions.DEFAULT);
SearchHits searchHits = searchResponse.getHits();
System.out.println("总条数:" + searchHits.getTotalHits().value);
//获取数据
SearchHit[] hits = searchHits.getHits();
List<Person> personList = new ArrayList<>();
for (SearchHit hit : hits) {
String sourceAsString = hit.getSourceAsString();
Person person = JSONObject.parseObject(sourceAsString, Person.class);
personList.add(person);
}
System.out.println(JSONObject.toJSONString(personList));
}
多字段查询
void queryString() throws Exception {
SearchRequest searchResult = new SearchRequest("person");
//查询构建器
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
QueryBuilder queryBuilder = QueryBuilders.queryStringQuery("李四测试")
.field("address").field("name").defaultOperator(Operator.OR);
searchSourceBuilder.query(queryBuilder);
//分页 - 不加分页默认10条
searchSourceBuilder.from(0);
searchSourceBuilder.size(100);
searchResult.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchResult, RequestOptions.DEFAULT);
SearchHits searchHits = searchResponse.getHits();
System.out.println("总条数:" + searchHits.getTotalHits().value);
//获取数据
SearchHit[] hits = searchHits.getHits();
List<Person> personList = new ArrayList<>();
for (SearchHit hit : hits) {
String sourceAsString = hit.getSourceAsString();
Person person = JSONObject.parseObject(sourceAsString, Person.class);
personList.add(person);
}
System.out.println(JSONObject.toJSONString(personList));
}
多条件查询
void boolQuery() throws Exception {
SearchRequest searchResult = new SearchRequest("person");
//查询构建器
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//1.查询地址为北京的。2.查询名字是李四测试的。
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
MatchQueryBuilder matchQuery = QueryBuilders.matchQuery("address", "北京");
queryBuilder.filter(matchQuery);
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name", "李四测试");
queryBuilder.must(termQueryBuilder);
searchSourceBuilder.query(queryBuilder);
//分页 - 不加分页默认10条
searchSourceBuilder.from(0);
searchSourceBuilder.size(100);
searchResult.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchResult, RequestOptions.DEFAULT);
SearchHits searchHits = searchResponse.getHits();
System.out.println("总条数:" + searchHits.getTotalHits().value);
//获取数据
SearchHit[] hits = searchHits.getHits();
List<Person> personList = new ArrayList<>();
for (SearchHit hit : hits) {
String sourceAsString = hit.getSourceAsString();
Person person = JSONObject.parseObject(sourceAsString, Person.class);
personList.add(person);
}
System.out.println(JSONObject.toJSONString(personList));
}
高亮查询
void boolQuery() throws Exception {
SearchRequest searchResult = new SearchRequest("person");
//查询构建器
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//1.查询地址为北京的。2.查询名字是李四测试的。
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
MatchQueryBuilder matchQuery = QueryBuilders.matchQuery("address", "北京");
queryBuilder.filter(matchQuery);
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name", "李四测试");
queryBuilder.must(termQueryBuilder);
searchSourceBuilder.query(queryBuilder);
//设置高亮
HighlightBuilder highlighter = new HighlightBuilder();
//设置三要素
highlighter.field("address");
//设置前后缀标签
highlighter.preTags("<font color='red'>");
highlighter.postTags("</font>");
//加载已经设置好的高亮配置
searchSourceBuilder.highlighter(highlighter);
//分页 - 不加分页默认10条
searchSourceBuilder.from(0);
searchSourceBuilder.size(100);
searchResult.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchResult, RequestOptions.DEFAULT);
SearchHits searchHits = searchResponse.getHits();
System.out.println("总条数:" + searchHits.getTotalHits().value);
//获取数据
SearchHit[] hits = searchHits.getHits();
List<Person> personList = new ArrayList<>();
for (SearchHit hit : hits) {
String sourceAsString = hit.getSourceAsString();
Person person = JSONObject.parseObject(sourceAsString, Person.class);
//获取高亮结果,替换person中的address
Map<String, HighlightField> highlightFields = hit.getHighlightFields();
HighlightField HighlightField = highlightFields.get("address");
Text[] fragments = HighlightField.fragments();
//highlight title替换 替换goods中的title
person.setAddress(fragments[0].toString());
personList.add(person);
}
System.out.println(JSONObject.toJSONString(personList));
}