Spring Data elasticsearch
pom
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
配置文件
spring:
data:
elasticsearch:
# elasticsearch集群名称,默认的是elasticsearch
cluster-name: elasticsearch
#节点的地址 注意api模式下端口号是9300,千万不要写成9200
cluster-nodes: 192.168.25.132:9300
#是否开启本地存储
repositories:
enabled: true
# 异常处理
elasticsearch:
rest:
uris: 192.168.25.132:9200
创建实体
@Document(indexName = "company",type = "employee", shards = 1,replicas = 0, refreshInterval = "-1")
@Data
public class Employee {
@Id
@Field(type = FieldType.Keyword)
private String id;
@Field(type = FieldType.Text,analyzer = "ik_smart")
private String firstName;
@Field(type = FieldType.Text,analyzer = "ik_smart")
private String lastName;
@Field(type = FieldType.Keyword)
private Integer age = 0;
@Field(type = FieldType.Keyword)
private String about;
创建索引库
@Test
public void create() {
//创建索引库
elasticsearchTemplate.createIndex(Employee.class);
//设置映射
elasticsearchTemplate.putMapping(Employee.class);
}
继承spring提接口 ElasticsearchRepository
@Repository
public interface EmployeeRepository extends ElasticsearchRepository<Employee,String> {
List<Employee> findByAgeBetween();
}
@Test
public void addIndex() {
Employee employee = new Employee();
employee.setId("1");
employee.setFirstName("zhang");
employee.setLastName("san");
employee.setAge(22);
employeeRepository.save(employee);
}
复杂查询
Test
public void search() {
NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
//过滤结果
queryBuilder.withSourceFilter(new FetchSourceFilter(new String[]{"id","firstName"},null));
//添加查询条件
queryBuilder.withQuery(QueryBuilders.matchQuery("firstName","张"));
//排序
queryBuilder.withSort(SortBuilders.fieldSort("age").order(SortOrder.DESC));
//分页 页码是从0开始
queryBuilder.withPageable(PageRequest.of(0,10));
Page<Employee> search = employeeRepository.search(queryBuilder.build());
List<Employee> content = search.getContent();
for (Employee employee : content) {
System.out.println(employee);
}
模糊查询
//创建查询条件
MatchQueryBuilder matchQueryBuilder = QueryBuilders
.matchQuery("staffName", staffName)//查询字段
.analyzer("ik_smart")//分词器类型
.minimumShouldMatch("100%");//匹配度
//bool查询
BoolQueryBuilder query = QueryBuilders.boolQuery();
query.must(matchQueryBuilder);
聚合查询
@Test
public void aggr() {
NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
//设置聚合字段
queryBuilder.addAggregation(AggregationBuilders.terms("name").field("age"));
AggregatedPage<Employee> result = elasticsearchTemplate.queryForPage(queryBuilder.build(), Employee.class);
//解析聚合
Aggregations aggr = result.getAggregations();
//获取指定名称的聚合
StringTerms terms = aggr.get("name");
//获取桶
List<StringTerms.Bucket> buckets = terms.getBuckets();
for (StringTerms.Bucket bucket : buckets) {
String keyAsString = bucket.getKeyAsString();
long docCount = bucket.getDocCount();
System.out.println("key:"+keyAsString+" Count:"+docCount);
}
}
聚合统计
@Test
public void funSearch() throws ParseException {
NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
QueryBuilder query = QueryBuilders.boolQuery()
.must(QueryBuilders.rangeQuery("dateTime").gte(new SimpleDateFormat("yyyyMMdd").parse("20190501").getTime())
.lte(new SimpleDateFormat("yyyyMMdd").parse("20190601").getTime()));
queryBuilder.withQuery(query);
//条件
// ((BoolQueryBuilder) query).must(QueryBuilders.matchQuery("name","王二"));
//过滤条件不会影响得分
//设置聚合字段
queryBuilder.addAggregation(AggregationBuilders.terms("group_month").field("month")
.subAggregation(AggregationBuilders.sum("priceSum").field("price3"))//设置组内统计
.subAggregation(AggregationBuilders.sum("priceSum2").field("price3"))
);
//分页
queryBuilder.withPageable(PageRequest.of(0, 10));
//排序
queryBuilder.withSort(SortBuilders.fieldSort("month").order(SortOrder.DESC));
AggregatedPage<Salary> result = elasticsearchTemplate.queryForPage(queryBuilder.build(), Salary.class);
List<Salary> content = result.getContent();
//解析聚合
Aggregations aggr = result.getAggregations();
//获取指定名称的聚合
StringTerms terms = aggr.get("group_month");
//获取桶
List<StringTerms.Bucket> buckets = terms.getBuckets();
for (StringTerms.Bucket bucket : buckets) {
String keyAsString = bucket.getKeyAsString();
//获取桶中聚合结果
Sum priceSum = bucket.getAggregations().get("priceSum");
System.out.println(priceSum.getValue());
long docCount = bucket.getDocCount();
System.out.println("key:"+keyAsString+" Count:"+docCount);
}
}