注意再倒入相关依赖的时候需要导入一个Springboot管理依赖的parent,否则在导入其他依赖不写版本就会报错,因为在这个parent中,springboot内部自动帮我们固定了版本号等。
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.0.5.RELEASEversion>
parent>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-data-elasticsearchartifactId>
dependency>
resources中创建applciation.yml配置文件
spring:
application:
name: ESApplication
data:
elasticsearch:
cluster-name: elasticsearch
cluster-nodes: 127.0.0.1:9300 #9200是图形界面端,9300代码端
该类主要是,需要做文档映射的那张表对应的字段。
/**
* 针对于 User 表的文档映射
* indexName:索引库
* type:类型(表类型)
*/
@Document(indexName = "hrm" , type = "user")
public class UserDoc {
//对应文档的id PUT /index/type/id
@Id
private Long id;
@Field(type = FieldType.Keyword) //指定为 不分词
private String userName;
private int age;
@Field(type = FieldType.Text, analyzer = "ik_max_word", searchAnalyzer = "ik_max_word")
private String intro;
}
这里我们采用在测试类做文档映射的方式来简单学会对ElasticSearch在Springboot中的操作。创建了文档映射之后可以对其中的内容做查询、条件匹配等。
// 指定启动类
@SpringBootTest(classes = ESApplication.class)
@RunWith(SpringRunner.class)
public class ESTest {
@Autowired
public ElasticsearchTemplate elasticsearchTemplate;
@Test
public void testCreateIndex() {
// 创建索引
elasticsearchTemplate.createIndex(UserDoc.class);
// 做文档映射
elasticsearchTemplate.putMapping(UserDoc.class);
}
}
Springboot中已经封装好了一个类供我们使用,直接继承他然后就可以使用了。
// 继承了一个SringBoot中封装好的可以对ES进行操作的类
@Repository
public interface UserElasticSearchRepository extends ElasticsearchRepository<UserDoc, Long> {}
在前面的测试类中,注入UserElasticSearchRepository,然后操作已经创建好的文档
添加好的数据可以通过Kibana可视化界面去查看数据是否添加成功。
// 文档的添加
@Test
public void testAdd() {
for (long i = 1; i < 10; i++) {
UserDoc userDoc = new UserDoc();
userDoc.setId(i);
if (i % 2 == 0) {
userDoc.setUserName("芜湖大司马");
userDoc.setAge(30);
} else {
userDoc.setUserName("烫嘴PDD");
userDoc.setAge(28);
}
userElasticSearchRepository.save(userDoc);
System.out.println("保存成功");
}
}
查询出得到结果,这里只是简单查询。
// 查询
@Test
public void testGet() {
Optional<UserDoc> user = userElasticSearchRepository.findById(5L);
UserDoc userDoc = user.get();
System.out.println(userDoc.getUserName());
}
删除某条数据之后,在使用查询可以看到该条数据已经查询不到了。
// 删除操作
@Test
public void testDelete() {
// 通过ID删除ES中的这条数据
userElasticSearchRepository.deleteById(5L);
System.out.println("删除成功");
testGet();
}
做高级查询我们采用另外一种封装好的工具对ElasticSearch做查询。
NativeSearchQueryBuilder:本地查询的builder
BoolQueryBuilder:组合查询的条件
withSort:排序
whithPageable:分页
NativeSearchQuery: 查询对象
使用查询对象将上述的所有可能用到的条件,调用repository方法进行查询
term表示精确匹配,value值不会被分词器拆分,按照倒排索引匹配
match表示全文检索,value值会被分词器拆分,然后去倒排索引中匹配
range表示范围检索,其value值是一个对象,如{ “range”: {field: {比较规则: value, …}} } 比较规则有gt / gte / lt / lte 等
@Test
public void testSearch(){
//创建一个本机查询builder
NativeSearchQueryBuilder builder = new NativeSearchQueryBuilder();
//=================================================
//1.查询条件
//组合查询
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//查询 username 中包含 pd : DSL查询 - must - match
boolQueryBuilder.must(QueryBuilders.matchQuery("intro","掌握"));
// Age 在 10 - 20 : DSL过滤 - filter - range
boolQueryBuilder.filter(QueryBuilders.rangeQuery("age").gte(10).lte(20));
builder.withQuery(boolQueryBuilder);
//2.排序 按照id倒排
builder.withSort(new FieldSortBuilder("id").order(SortOrder.DESC));
//3.分页
builder.withPageable(PageRequest.of(0,5));
//=================================================
//构建一个查询对象
NativeSearchQuery searchQuery = builder.build();
//执行查询,得到结果
Page<UserDoc> page = userElasticSearchRepository.search(searchQuery);
//page -> PageList
System.out.println("总条数:"+page.getTotalElements());
System.out.println("总页数:"+page.getTotalPages());
//结果列表
List<UserDoc> content = page.getContent();
content.forEach(userDoc -> {
System.out.println(userDoc);
});
}
上述java代码对应在kibana中的表达:
GET hrm/user/_search
{
"query": {
"bool": {
"filter": {
"range": {
"age": {
"gte": 10,
"lte": 20
}
}
},
"must": [
{
"match": {
"intro": "掌握"
}
}
]
}
}
, "sort": [
{
"id": {
"order": "desc"
}
}
]
}