目录:
1.安装Elasticsearch
2.Elasticsearch概念
3.Elasticsearch索引
4.Elasticsearch查询
5.Elasticsearch聚合aggregations
6.Spring Data Elasticsearch入门
7.Repository文档操作
1.注解说明
Spring Data通过注解来声明实体类字段的映射属性,有下面的三个注解:
@Document
作用在类,标记实体类为文档对象,一般有两个属性- indexName:对应索引库名称
- type:对应在索引库中的类型
- shards:分片数量,默认5
- replicas:副本数量,默认1
@Id
作用在成员变量,标记一个字段作为id主键@Field
作用在成员变量,标记为文档的字段,并指定字段映射属性:- type:字段类型,取值是枚举:FieldType
- index:是否索引,布尔类型,默认是true
- store:是否存储,布尔类型,默认是false
- analyzer:分词器名称
2.示例
2.1 实体类实例
@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel("es-产品")
@Document(indexName = "product", type = "phone",shards = 2,replicas = 0)
public class EsProduct {
/** */
@ApiModelProperty("")
@Id
private Long id;
/** 这条记录所有需要被搜索信息的拼接,后面拿关键字查询匹配这个字段 */
@Field(analyzer = "ik_max_word",type = FieldType.Text)
private String keywordsAll;
/** 分类id */
@ApiModelProperty("分类id")
@Field(type = FieldType.Long,index = false)
private Long catalogId;
/** 产品名称 */
@ApiModelProperty("产品名称")
@Field(type = FieldType.Keyword)
private String productName;
/** 单价 */
@ApiModelProperty("单价")
@Field(type = FieldType.Double)
private BigDecimal price;
/** 属性1 */
@ApiModelProperty("属性1")
@Field(type = FieldType.Keyword)
private String attr1;
/** 属性2 */
@ApiModelProperty("属性2")
@Field(type = FieldType.Keyword)
private String attr2;
/** 属性3 */
@ApiModelProperty("属性3")
@Field(type = FieldType.Keyword)
private String attr3;
Map<String, Object> map;
}
2.2 ElasticsearchRepository实例
public interface EsProductRepository extends ElasticsearchRepository<EsProduct, Long> {
/**
* 根据属性1查询
* @param attr1
* @param pageable
* @return
*/
Page<EsProduct> findByAttr1(String attr1, Pageable pageable);
}
3.创建索引及映射
public void createIndex() {
// 创建索引及映射
this.elasticsearchTemplate.createIndex(EsProduct.class);
// 配置映射
// this.elasticsearchTemplate.putMapping(EsProduct.class);
}
4.简单查询
public Page<EsProduct> pageList(Integer pageNum, Integer pageSize, String keywords) {
// 分页
Pageable pageable = PageRequest.of(pageNum, pageSize);
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
nativeSearchQueryBuilder.withPageable(pageable);
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
if (StringUtils.isEmpty(keywords)) {
nativeSearchQueryBuilder.withQuery(QueryBuilders.matchAllQuery());
} else {
// 关键字查询
boolQueryBuilder.must(QueryBuilders.matchQuery("keywordsAll", keywords));
// 价格范围
boolQueryBuilder.must(QueryBuilders.rangeQuery("price").from(2000D).to(6000D));
}
nativeSearchQueryBuilder.withQuery(boolQueryBuilder);
// 根据价格倒序
nativeSearchQueryBuilder.withSort(SortBuilders.fieldSort("price").order(SortOrder.DESC));
NativeSearchQuery nativeSearchQuery = nativeSearchQueryBuilder.build();
return esProductRepository.search(nativeSearchQuery);
}
5.ElasticsearchRepository中自定义查询
/**
* 根据属性1自定义查询
* @param pageNum
* @param pageSize
* @param attr1
* @return
*/
public Page<EsProduct> listAttr1(Integer pageNum, Integer pageSize, String attr1) {
Pageable pageable = PageRequest.of(pageNum, pageSize);
Page<EsProduct> esProducts = esProductRepository.findByAttr1(attr1, pageable);
return esProducts;
}
6.聚合查询
/**
* 根据attr1聚合查询
* @return
*/
public EsProduct aggsAttr1() {
EsProduct esProduct = new EsProduct();
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
nativeSearchQueryBuilder.addAggregation(AggregationBuilders.terms("aggs_attr1").field("attr1"));
NativeSearchQuery searchQuery = nativeSearchQueryBuilder.build();
Map<String, Object> map = new HashMap<>();
// 执行查询
// 过elasticsearchTemplate.query()方法查询,获得聚合
Aggregations aggregations = elasticsearchTemplate.query(searchQuery, response -> response.getAggregations());
// 转换成Map集合
Map<String, Aggregation> aggregationMap = aggregations.asMap();
StringTerms stringTerms = (StringTerms) aggregationMap.get("aggs_attr1");
List<StringTerms.Bucket> buckets = stringTerms.getBuckets();
buckets.forEach(bucket -> map.put(bucket.getKeyAsString(),bucket.getDocCount()));
esProduct.setMap(map);
return esProduct;
}
7.新增或修改文档
public EsProduct save(EsProduct esProduct) {
EsProduct save = esProductRepository.save(esProduct);
return save;
}
8.删除文档
/**
* 根据id删除文档
* @param id
*/
public void deleteById(Long id) {
esProductRepository.deleteById(id);
}