es 与 mysql 对比表如下:
PUT index/type --> update
spring操作es
- 引入依赖
<!-- elasticsearch的spring-data包 -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-elasticsearch</artifactId>
<version>x.y.z.RELEASE</version>
</dependency>
<!-- elasticsearch客户端,version填入本地安装好的ES版本号 -->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>x.y.z</version>
</dependency>
- 配置es
@Configuration
public class EsConfiguration {
@Value("${elasticsearch.host}")
private String elasticsearchHost;
@Value("${elasticsearch.cluster.name}")
private String clusterName;
@Bean
public Client transportClient() throws Exception {
TransportClientFactoryBean factory = new TransportClientFactoryBean();
factory.setClusterNodes(elasticsearchHost);
factory.setClusterName(clusterName);
factory.afterPropertiesSet();
return factory.getObject();
}
@Bean
public ElasticsearchTemplate elasticsearchTemplate() throws Exception {
return new ElasticsearchTemplate(transportClient(), new EsCustomEntityMapper());
}
}
- 操作
1.创建索引
// 1、直接用名称创建
elasticsearchTemplate.createIndex("book");
// 2、填入class对象
elasticsearchTemplate.createIndex(BookEntity.class);
2.创建数据
IndexQuery indexQuery = new IndexQueryBuilder()
.withId(bookEntity.getId())
.withObject(bookEntity)
.build();
elasticsearchTemplate.index(indexQuery);
//多条数据
elasticsearchTemplate.bulkIndex(indexQueries);
- 更新
UpdateRequest updateRequest = new UpdateRequest();
updateRequest.doc(mapper.mapObject(chatMessageHistory));
UpdateQuery updateQuery = new UpdateQueryBuilder().withId(chatMessageHistory.getMsgId())
.withClass(ChatMessageHistory.class).build();
updateQuery.setUpdateRequest(updateRequest);
updateQuery.setIndexName(getIndexNameByCreateDateTime(chatMessageHistory.getCreateDateTime()));
elasticsearchTemplate.update(updateQuery);
3.查询
单字符串查询
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(QueryBuilders.queryStringQuery("菜鸟"))
.withPageable(new PageRequest(0, 20))
.build();
List<BookEntity> list = elasticsearchTemplate.queryForList(searchQuery, BookEntity.class);
分页+排序
Pageable pageable= new PageRequest(0, 20,new Sort(Sort.Direction.DESC, "name"));
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(QueryBuilders.queryStringQuery("菜鸟"))
.withPageable(pageable)
.build();
Page<BookEntity> list = elasticsearchTemplate.queryForPage(searchQuery, BookEntity.class);
//排序
SortBuilder sortBuilder = SortBuilders.fieldSort("price") //排序字段
.order(SortOrder.DESC); //排序方式
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(matchQuery("name", "gaolujie"))
.withSort(sortBuilder)
.build();
return elasticsearchTemplate.queryForList(searchQuery, Product.class);
模糊查询
Pageable pageable = new PageRequest(0, 10);
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(QueryBuilders.matchQuery("name", "菜鸟"))
.withPageable(pageable)
.build();
List<BookEntity> list = elasticsearchTemplate.queryForList(searchQuery, BookEntity.class);
其余匹配:类似mysql中like "%word%"的模糊匹配
Pageable pageable = new PageRequest(0, 10);
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(QueryBuilders.matchPhraseQuery("name", "菜鸟"))
.withPageable(pageable)
.build();
List<BookEntity> list = elasticsearchTemplate.queryForList(searchQuery, BookEntity.class);
Term全等查询
Pageable pageable = new PageRequest(0, 10);
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(QueryBuilders.termQuery("name", "菜鸟"))
.withPageable(pageable)
.build();
List<BookEntity> list = elasticsearchTemplate.queryForList(searchQuery, BookEntity.class);
组合查询
must代表返回的文档必须满足must子句的条件,会参与计算分值;
filter代表返回的文档必须满足filter子句的条件,但不会参与计算分值;
should代表返回的文档可能满足should子句的条件,也可能不满足,有多个should时满足任何一个就可以,通过minimum_should_match设置至少满足几个。
mustnot代表必须不满足子句的条件。
QueryBuilder filterQuery = QueryBuilders
.boolQuery()
.filter(QueryBuilders.termQuery("name", "菜鸟"))
.filter(QueryBuilders.termQuery("author", "小菜"));
List<BookEntity> list = elasticsearchTemplate.queryForList(filterQuery, BookEntity.class);
- 聚合操作
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(
matchQuery("name", "heiren")
)
.addAggregation(
AggregationBuilders
.terms("group_by_tags")
.field("tags")
.order(
Terms.Order.aggregation("price", false)
)
.subAggregation(
AggregationBuilders
.avg("price")
.field("price")
)
)
.build();
return elasticsearchTemplate.query(searchQuery, response -> {
//直接返回es原封结果到前端
return JSONObject.parseObject(response.toString());
});