- 使用idea创建一个SpringBoot demo工程
- 引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
- application.yml文件配置:
spring:
data:
elasticsearch:
cluster-name: elasticsearch
cluster-nodes: 192.168.x.x:9300
- 实体类
@Document(indexName = "items", shards = 1, replicas = 0)
public class Item {
@Id
private Long id;
@Field(type = FieldType.Text, analyzer = "ik_max_word")
private String title;
@Field(type = FieldType.Keyword)
private String category;
@Field(type = FieldType.Keyword)
private String brand;
@Field(type = FieldType.Double)
private Double price;
@Field(index = false, type = FieldType.Keyword)
private String images;
}
- 测试
@SpringBootTest
@RunWith(SpringRunner.class)
public class ElasticsearchTest {
@Autowired
private ElasticsearchRestTemplate restTemplate;
@Autowired
private ItemRepository itemRepository;
@Test
public void testCreatedIndex(){
this.restTemplate.createIndex(Item.class);
this.restTemplate.putMapping(Item.class);
}
@Test
public void testDeleteIndex(){
this.restTemplate.deleteIndex("item");
}
@Test
public void testSave(){
Item item = new Item(1L, "小米手机7", " 手机",
"小米", 3499.00, "http://image.leyou.com/13123.jpg");
this.itemRepository.save(item);
}
@Test
public void testSaveALl(){
List<Item> list = new ArrayList<>();
list.add(new Item(2L, "坚果手机R1", " 手机", "锤子", 3699.00, "http://image.leyou.com/123.jpg"));
list.add(new Item(3L, "华为META10", " 手机", "华为", 4499.00, "http://image.leyou.com/3.jpg"));
this.itemRepository.saveAll(list);
}
@Test
public void testUpdate(){
Item item = new Item(1L, "小米手机8", " 手机",
"小米", 3599.00, "http://image.leyou.com/13123.jpg");
this.itemRepository.save(item);
}
@Test
public void testDelete(){
this.itemRepository.deleteAll();
}
@Test
public void testQuery(){
Iterable<Item> items = this.itemRepository.findAll(Sort.by("price").descending());
items.forEach(System.out::println);
}
@Test
public void testQueryByTitle(){
List<Item> items = this.itemRepository.findByPriceBetween(3600d, 5000d);
items.forEach(System.out::println);
}
@Test
public void indexList() {
List<Item> list = new ArrayList<>();
list.add(new Item(1L, "小米手机7", "手机", "小米", 3299.00, "http://image.leyou.com/13123.jpg"));
list.add(new Item(2L, "坚果手机R1", "手机", "锤子", 3699.00, "http://image.leyou.com/13123.jpg"));
list.add(new Item(3L, "华为META10", "手机", "华为", 4499.00, "http://image.leyou.com/13123.jpg"));
list.add(new Item(4L, "小米Mix2S", "手机", "小米", 4299.00, "http://image.leyou.com/13123.jpg"));
list.add(new Item(5L, "荣耀V10", "手机", "华为", 2799.00, "http://image.leyou.com/13123.jpg"));
this.itemRepository.saveAll(list);
}
@Test
public void testSearch(){
MatchQueryBuilder queryBuilder = QueryBuilders.matchQuery("title", "手机");
Iterable<Item> items = this.itemRepository.search(queryBuilder);
items.forEach(System.out::println);
}
@Test
public void testNative(){
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
nativeSearchQueryBuilder.withQuery(QueryBuilders.matchQuery("title","手机"));
Page<Item> items = this.itemRepository.search(nativeSearchQueryBuilder.build());
items.forEach(System.out::println);
}
@Test
public void testNativeByPages(){
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
nativeSearchQueryBuilder.withQuery(QueryBuilders.matchQuery("category","手机"));
nativeSearchQueryBuilder.withPageable(PageRequest.of(1,2));
Page<Item> items = this.itemRepository.search(nativeSearchQueryBuilder.build());
System.out.println(items.getTotalPages());
System.out.println(items.getTotalElements());
items.forEach(System.out::println);
}
@Test
public void testNativeBySort(){
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
nativeSearchQueryBuilder.withQuery(QueryBuilders.matchQuery("category","手机"));
nativeSearchQueryBuilder.withSort(SortBuilders.fieldSort("price").order(SortOrder.DESC));
Page<Item> items = this.itemRepository.search(nativeSearchQueryBuilder.build());
System.out.println(items.getTotalPages());
System.out.println(items.getTotalElements());
items.forEach(System.out::println);
}
@Test
public void testAgg(){
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
nativeSearchQueryBuilder.withSourceFilter(new FetchSourceFilter(new String[]{},null));
nativeSearchQueryBuilder.addAggregation(AggregationBuilders.terms("brand_agg").field("brand"));
AggregatedPageImpl<Item> itemPage = (AggregatedPageImpl<Item>)this.itemRepository.search(nativeSearchQueryBuilder.build());
ParsedStringTerms stringTerms = (ParsedStringTerms)itemPage.getAggregation("brand_agg");
List<? extends Terms.Bucket> buckets = stringTerms.getBuckets();
buckets.forEach(bucket -> {
System.out.println(bucket.getKeyAsString());
System.out.println(bucket.getDocCount());
});
}
@Test
public void testSubAgg(){
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
nativeSearchQueryBuilder.withSourceFilter(new FetchSourceFilter(new String[]{},null));
nativeSearchQueryBuilder.addAggregation(AggregationBuilders.terms("brand_agg").field("brand")
.subAggregation(AggregationBuilders.avg("avg_price").field("price"))
);
AggregatedPageImpl<Item> itemPage = (AggregatedPageImpl<Item>)this.itemRepository.search(nativeSearchQueryBuilder.build());
ParsedStringTerms stringTerms = (ParsedStringTerms)itemPage.getAggregation("brand_agg");
List<? extends Terms.Bucket> buckets = stringTerms.getBuckets();
buckets.forEach(bucket -> {
System.out.println(bucket.getKeyAsString());
System.out.println(bucket.getDocCount());
ParsedAvg avgPrice = (ParsedAvg)bucket.getAggregations().asMap().get("avg_price");
System.out.println(avgPrice.getValue());;
});
}
}