1、添加依赖
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>7.12.1</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.12.1</version>
</dependency>
2、kabana测试脚本
# 查看索引列表
GET _cat/indices
# 查看索引信息
GET /tb_hero
# 查看索引所有文档
GET /tb_hero/_search
# 根据ID查询文档
GET /tb_hero/_doc/101
# 检查安装的插件
GET _cat/plugins
# 删除索引
DELETE /tb_hero
# 测试分词效果
GET _analyze?pretty=true
{
"text": "打虎"
}
3、实体类
package com.shenma2009.pojo;
import lombok.Data;
import java.io.Serializable;
/**
* @author 军哥
* @version 1.0
* @description: TbHero
* @date 2023/8/20 14:56
*/
@Data
public class TbHero implements Serializable {
private Integer userId;
private String userName;
private Integer age;
private String sex;
private String userTech;
}
4、配置类
package com.shenma2009.config;
/**
* @author 军哥
* @version 1.0
* @description: ElasticSearchConfig
* @date 2023/8/20 9:14
*/
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ElasticSearchConfig {
@Bean
public RestHighLevelClient restHighLevelClient(){
HttpHost localhost = new HttpHost("192.168.80.131",9200,"http");
RestClientBuilder builder = RestClient.builder(localhost);
return new RestHighLevelClient(builder);
}
}
5、注入client
@SpringBootTest
public class EsTestApp {
@Autowired
RestHighLevelClient restHighLevelClient;
}
6、Java API 操作ElasticSearch
1)、创建索引
/**
* @description 创建索引
* @author 军哥
* @date 2023/8/20 13:00
* @version 1.0
*/
@Test
public void createIndex() throws IOException {
// 定义索引请求
String indexName = "tb_hero";
CreateIndexRequest createIndexRequest = new CreateIndexRequest(indexName);
// 定义索引映射
XContentBuilder mapping = XContentFactory.jsonBuilder();
mapping.startObject()
.startObject("properties")
.startObject("userId").field("type","long").endObject()
.startObject("userName").field("type","keyword").endObject()
.startObject("age").field("type","long").endObject()
.startObject("sex").field("type","keyword").endObject()
.startObject("userTech").field("type","text").field("analyzer", "ik_smart").endObject()
.endObject()
.endObject();
createIndexRequest.mapping(mapping);
//createIndexRequest.mapping("_doc", mapping);
// 创建索引
CreateIndexResponse response = restHighLevelClient.indices().create(createIndexRequest, RequestOptions.DEFAULT);
boolean acknowledged = response.isAcknowledged();
System.out.println("Mapping creation acknowledged: " + acknowledged);
// 获取索引的状态
GetIndexResponse indexResponse = restHighLevelClient.indices().get(new GetIndexRequest(indexName), RequestOptions.DEFAULT);
System.out.println(indexResponse.getAliases());
System.out.println(indexResponse.getMappings().toString());
System.out.println(indexResponse.getSettings());
}
2)、删除索引
/**
* @description 删除索引
* @author 军哥
* @date 2023/8/20 14:44
* @version 1.0
*/
@Test
public void deleteIndex() throws IOException {
String indexName = "tb_hero";
// 判断索引是否存在
boolean exists = restHighLevelClient.indices().exists(new GetIndexRequest(indexName), RequestOptions.DEFAULT);
if(!exists) {
System.out.println("索引不存在:"+indexName);
return;
}
// 删除索引
AcknowledgedResponse delete = restHighLevelClient.indices().delete(new DeleteIndexRequest(indexName), RequestOptions.DEFAULT);
if(delete.isAcknowledged()) {
System.out.println("索引已经删除");
}
else {
System.out.println("索引删除失败");
}
}
3)、添加文档
/**
* @description 增加记录
* @author 军哥
* @date 2023/8/20 17:18
* @version 1.0
*/
@Test
public void insertDoc() throws IOException {
String indexName = "tb_hero";
TbHero tbHero = new TbHero();
tbHero.setUserId(101);
tbHero.setUserName("鲁智深");
tbHero.setAge(33);
tbHero.setSex("男");
tbHero.setUserTech("倒拔垂杨柳");
IndexRequest indexRequest = new IndexRequest();
indexRequest.index(indexName).id(""+tbHero.getUserId());
ObjectMapper mapper = new ObjectMapper();
String s = mapper.writeValueAsString(tbHero);
indexRequest.source(s, XContentType.JSON);
IndexResponse index = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);
System.out.println("" + index.toString());
}
4)、修改文档
/**
* @description 更新文档
* @author 军哥
* @date 2023/8/20 17:35
* @version 1.0
*/
@Test
public void updateDoc() throws IOException {
String indexName = "tb_hero";
UpdateRequest updateRequest = new UpdateRequest();
updateRequest.index(indexName).id("101");
updateRequest.doc(XContentType.JSON, "userTech", "拳打镇关西");
UpdateResponse response = restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);
System.out.println(response.toString());
}
5)、根据ID读取单个文档
/**
* @description 根据ID读取单个文档
* @author 军哥
* @date 2023/8/20 17:46
* @version 1.0
*/
@Test
public void selectDoc() throws IOException {
String indexName = "tb_hero";
GetRequest request = new GetRequest();
request.index(indexName).id("101");
GetResponse response = restHighLevelClient.get(request, RequestOptions.DEFAULT);
System.out.println(response.getSourceAsString());
ObjectMapper objectMapper = new ObjectMapper();
TbHero tbHero = objectMapper.readValue(response.getSourceAsString(), TbHero.class);
System.out.println(tbHero.toString());
}
6)、删除单个文档
/**
* @description 删除单个文档
* @author 军哥
* @date 2023/8/20 17:52
* @version 1.0
*/
@Test
public void deleteDoc() throws IOException {
String indexName = "tb_hero";
DeleteRequest request = new DeleteRequest();
request.index(indexName).id("101");
DeleteResponse response = restHighLevelClient.delete(request, RequestOptions.DEFAULT);
System.out.println(response.toString());
}
7)、批量插入文档
/**
* @description 批量插入文档
* @author 军哥
* @date 2023/8/20 17:52
* @version 1.0
*/
@Test
public void insertDocs() throws IOException {
// 索引名字
String indexName = "tb_hero";
// 准备多个数据
ArrayList<TbHero> tbHeroes = new ArrayList<>();
TbHero tbHero1 = new TbHero();
tbHero1.setUserId(101);
tbHero1.setUserName("鲁智深");
tbHero1.setSex("男");
tbHero1.setAge(33);
tbHero1.setUserTech("倒拔垂杨柳");
TbHero tbHero2 = new TbHero();
tbHero2.setUserId(102);
tbHero2.setUserName("武松");
tbHero2.setSex("男");
tbHero2.setAge(33);
tbHero2.setUserTech("景阳冈打虎");
tbHeroes.add(tbHero1);
tbHeroes.add(tbHero2);
// 准备请求
BulkRequest bulkRequest = new BulkRequest();
ObjectMapper mapper = new ObjectMapper();
tbHeroes.forEach(item -> {
IndexRequest indexRequest = new IndexRequest();
String s = null;
try {
indexRequest.index(indexName).id(""+item.getUserId());
s = mapper.writeValueAsString(item);
indexRequest.source(s, XContentType.JSON);
bulkRequest.add(indexRequest);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
});
BulkResponse response = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
System.out.println(response.toString());
}
8)、批量删除文档
/**
* @description 批量删除
* @author 军哥
* @date 2023/8/20 18:20
* @version 1.0
*/
@Test
public void deleteDocs() throws IOException {
// 索引名字
String indexName = "tb_hero";
BulkRequest bulkRequest = new BulkRequest();
bulkRequest.add(new DeleteRequest().index(indexName).id("101"));
bulkRequest.add(new DeleteRequest().index(indexName).id("102"));
BulkResponse response = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
System.out.println(response.toString());
}
9)、全量查询
/**
* @description 全量查询
* @author 军哥
* @date 2023/8/20 18:26
* @version 1.0
*/
@Test
public void queryAll() throws IOException {
// 索引名字
String indexName = "tb_hero";
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices(indexName);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchAllQuery());
searchRequest.source(searchSourceBuilder);
SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
TotalHits total = response.getHits().getTotalHits();
System.out.println("总记录数为:"+total);
ObjectMapper mapper = new ObjectMapper();
SearchHit[] hits = response.getHits().getHits();
for (SearchHit hit : hits) {
String source = hit.getSourceAsString();
TbHero tbHero = mapper.readValue(source, TbHero.class);
System.out.println(tbHero.toString());
}
}
10)、精确查询+分页+排序+字段查询
/**
* @description 精确查询+分页+排序+字段查询
* @author 军哥
* @date 2023/8/20 18:42
* @version 1.0
*/
@Test
public void termQuery() throws IOException {
// 索引名字
String indexName = "tb_hero";
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices(indexName);
SearchSourceBuilder builder = new SearchSourceBuilder();
builder.query(QueryBuilders.termQuery("sex", "男"));
// 分页+排序
builder.from(0).size(10).sort("userId", SortOrder.DESC);
// 字段查询
String includes[] = {"userName", "sex"};
String excludes[] = {"sex"};
builder.fetchSource(includes, excludes);
searchRequest.source(builder);
SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
TotalHits total = response.getHits().getTotalHits();
System.out.println("总记录数为:"+total);
ObjectMapper mapper = new ObjectMapper();
SearchHit[] hits = response.getHits().getHits();
for (SearchHit hit : hits) {
String source = hit.getSourceAsString();
TbHero tbHero = mapper.readValue(source, TbHero.class);
System.out.println(tbHero.toString());
}
}
11)、多条件查询
/**
* @description 多条件查询
* @author 军哥
* @date 2023/8/20 21:03
* @version 1.0
*/
@Test
public void boolQuery() throws IOException {
// 索引名字
String indexName = "tb_hero";
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices(indexName);
SearchSourceBuilder builder = new SearchSourceBuilder();
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.must(QueryBuilders.termQuery("age", 33));
boolQueryBuilder.must(QueryBuilders.termQuery("userName", "武松"));
builder.query(boolQueryBuilder);
searchRequest.source(builder);
SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
TotalHits total = response.getHits().getTotalHits();
System.out.println("总记录数为:"+total);
ObjectMapper mapper = new ObjectMapper();
SearchHit[] hits = response.getHits().getHits();
for (SearchHit hit : hits) {
String source = hit.getSourceAsString();
TbHero tbHero = mapper.readValue(source, TbHero.class);
System.out.println(tbHero.toString());
}
}
12)、区间查询
/**
* @description 区间查询
* @author 军哥
* @date 2023/8/20 21:12
* @version 1.0
*/
@Test
public void rangeQuery() throws IOException {
// 索引名字
String indexName = "tb_hero";
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices(indexName);
SearchSourceBuilder builder = new SearchSourceBuilder();
RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("userId").lte(200).gte(100);
builder.query(rangeQueryBuilder);
searchRequest.source(builder);
SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
TotalHits total = response.getHits().getTotalHits();
System.out.println("总记录数为:"+total);
ObjectMapper mapper = new ObjectMapper();
SearchHit[] hits = response.getHits().getHits();
for (SearchHit hit : hits) {
String source = hit.getSourceAsString();
TbHero tbHero = mapper.readValue(source, TbHero.class);
System.out.println(tbHero.toString());
}
}
13)、模糊查询
/**
* @description 模糊查询
* @author 军哥
* @date 2023/8/20 21:21
* @version 1.0
*/
@Test
public void fuzzyQuery() throws IOException {
// 索引名字
String indexName = "tb_hero";
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices(indexName);
SearchSourceBuilder builder = new SearchSourceBuilder();
FuzzyQueryBuilder fuzziness = QueryBuilders.fuzzyQuery("userName", "武").fuzziness(Fuzziness.ONE);
builder.query(fuzziness);
searchRequest.source(builder);
SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
TotalHits total = response.getHits().getTotalHits();
System.out.println("总记录数为:"+total);
ObjectMapper mapper = new ObjectMapper();
SearchHit[] hits = response.getHits().getHits();
for (SearchHit hit : hits) {
String source = hit.getSourceAsString();
TbHero tbHero = mapper.readValue(source, TbHero.class);
System.out.println(tbHero.toString());
}
}
14)、高亮查询
/**
* @description 高亮查询
* @author 军哥
* @date 2023/8/20 21:36
* @version 1.0
*/
@Test
public void highLightQuery() throws IOException {
// 索引名字
String indexName = "tb_hero";
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices(indexName);
SearchSourceBuilder builder = new SearchSourceBuilder();
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("userTech", "柳虎");
HighlightBuilder highlightBuilder = new HighlightBuilder();
highlightBuilder.preTags("<font color='red'>");
highlightBuilder.postTags("</font>");
highlightBuilder.field("userTech");
builder.highlighter(highlightBuilder);
builder.query(matchQueryBuilder);
searchRequest.source(builder);
SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
TotalHits total = response.getHits().getTotalHits();
System.out.println("总记录数为:"+total);
ObjectMapper mapper = new ObjectMapper();
SearchHit[] hits = response.getHits().getHits();
for (SearchHit hit : hits) {
String source = hit.getSourceAsString();
TbHero tbHero = mapper.readValue(source, TbHero.class);
HighlightField techName = hit.getHighlightFields().get("userTech");
if(techName != null) {
String string = techName.getFragments()[0].string();
tbHero.setUserTech(string);
}
System.out.println(tbHero.toString());
}
}