官方示例
解释一下:你想要使用多属性进行作为查询条件时,你只在接口中自定义方法即可,但是你的方法名应按照以上格式
findByXXXAndXXXAndXXX
,无需写实现,ElasticsearchRepository即会自动生成查询的json格式
示例
public interface BookRepository extends ElasticsearchRepository<Book,String> {
//自定义查询方法 根据name ,content
List<Book> findByNameAndContent(String nameKeyWord,String contentKeyWord);
}
@Test
public void findByNameAndContent(){
//直接调用接口中的方法即可
List<Book> list = bookRepository.findByNameAndContent("张三", "发现");
list.forEach(book -> System.out.println(book));
}
其他方法亦是如此
复杂查询 分页
@Test
public void testSearch(){
MatchAllQueryBuilder queryBuilder = QueryBuilders.matchAllQuery();
SearchQuery searchQuery = new NativeSearchQuery(queryBuilder)
.setPageable(PageRequest.of(0,1));
Page<Book> books = bookRepository.search(searchQuery);
books.forEach(book -> System.out.println(book));
}
使用ElasticsearchTemplate做复杂查询
分页,排序
@Autowired
private ElasticsearchTemplate elasticsearchTemplate;//spring容器已存在此bean实例,直接注入即可
/**
* 使用ElasticsearchTemplate做复杂查询
* 分页,排序
*/
@Test
public void testElasticsearchTemplate(){
SearchQuery searchQuery = new NativeSearchQueryBuilder()//查询数据,构造出一个查询
.withIndices("dangdang")//设置要查询的索引,参数为可变参数,可写多个索引("dangdang","kaungkang",...)
.withTypes("book")//查询的文档类型,也是桐同样,可变参数,在多个类型中查询("book","",...)
.withQuery(QueryBuilders.matchAllQuery())//设置一个查询条件,,此处为查询所有
.withSort(new FieldSortBuilder("price").order(SortOrder.DESC))//设置排序条件,此处根据属性排序,根据价格的降序
.withPageable(PageRequest.of(0,5))//设置分页参数
.build();//构造一个SearchQuery
AggregatedPage<Book> books = elasticsearchTemplate.queryForPage(searchQuery, Book.class);//传入查询,和要查询的类型
books.forEach(book -> System.out.println(book));
}
多字段,分词检索,过滤,分页,排序,高亮
/**
* 多字段,分词检索,过滤,分页,排序,高亮
*/
@Test
public void testMangSearchN(){
HighlightBuilder.Field filed = new HighlightBuilder.Field("*");//设置需要高亮的属性,也可使用通配符*
filed.preTags("<span style='color:red;'>");//样式前缀
filed.postTags("</span");//样式后缀
SearchQuery searchQuery =new NativeSearchQueryBuilder()
.withIndices("dangdang")//索引
.withTypes("book")//类型
//.withFields("name","content")//可以设置只查询那些属性
.withQuery(QueryBuilders.queryStringQuery("张三").field("name").field("content"))//查询内容,基于name,content
.withFilter(QueryBuilders.rangeQuery("price").gte("50"))//设置过滤条件,价格大于等于50的
.withPageable(PageRequest.of(0,5))//分页
.withSort(new FieldSortBuilder("price").order(SortOrder.DESC))//根据价格降序排列
.withHighlightFields(filed)//设置高亮,可变参数,可传入多个高亮的属性
.build();
AggregatedPage<Book> books = elasticsearchTemplate.queryForPage(searchQuery, Book.class, new SearchResultMapper() {//对查询进行自定义封装
@Override
public <T> AggregatedPage<T> mapResults(SearchResponse searchResponse, Class<T> aClass, Pageable pageable) {
List<Book> books = new ArrayList<>();
//根据相应结果货期His
SearchHits hits = searchResponse.getHits();
//索取his数组
SearchHit[] searchHits = hits.getHits();
//遍历结果数据
for (SearchHit searchHit : searchHits) {
Book book = new Book();
//获取原始数据
Map<String, Object> sourceAsMap = searchHit.getSourceAsMap();
//获取高亮处理后的数据
Map<String, HighlightField> highlightFields = searchHit.getHighlightFields();
book.setId(searchHit.getId());
book.setAuther(sourceAsMap.get("auther").toString());
if(highlightFields.containsKey("auther")){//是否有高亮处理,有就将原始数据覆盖掉
book.setAuther(highlightFields.get("auther").getFragments()[0].toString());
}
book.setContent(sourceAsMap.get("content").toString());
if(highlightFields.containsKey("content")){//是否有高亮处理,有就将原始数据覆盖掉
book.setContent(highlightFields.get("content").getFragments()[0].toString());
}
book.setName(sourceAsMap.get("name").toString());
if(highlightFields.containsKey("name")){//是否有高亮处理,有就将原始数据覆盖掉
book.setName(highlightFields.get("name").getFragments()[0].toString());
}
book.setPrice(Double.parseDouble(sourceAsMap.get("price").toString()));
if(highlightFields.containsKey("price")){//是否有高亮处理,有就将原始数据覆盖掉
book.setPrice(Double.parseDouble(highlightFields.get("price").getFragments()[0].toString()));
}
book.setPubdata(new Date(Long.parseLong(sourceAsMap.get("pubdata").toString())));
if(highlightFields.containsKey("pubdata")){//是否有高亮处理,有就将原始数据覆盖掉
book.setPubdata(new Date(Long.parseLong(highlightFields.get("pubdata").getFragments()[0].toString())));
}
books.add(book);
}
return new AggregatedPageImpl<>((List<T>)books);
}
@Override
public <T> T mapSearchHit(SearchHit searchHit, Class<T> aClass) {
return null;
}
});
books.forEach(book -> System.out.println(book));
}
执行结果
Book(id=1001, name=<span style='color:red;'>张三</span历险记-被更新了, price=99.89, pubdata=Sat Dec 12 00:06:26 CST 2020, content=<span style='color:red;'>张三</span醒来发现自己在一个荒无人烟的小岛上,他四处望了望。。。, auther=李四呀)
Book(id=1002, name=法外狂徒, price=66.66, pubdata=Sat Dec 12 15:03:29 CST 2020, content=是人性的扭曲,还是道德的沦丧,<span style='color:red;'>张三</span始终逍遥法外。。。, auther=王五呀)