ElasticSearchRepository和ElasticSearchTemplate的使⽤Spring-data-elasticarch是Spring提供的操作ElasticSearch的数据层,封装了⼤量的基础操作,通过它可以很⽅便的操作ElasticSearch的数据。
版本说明洁面啫喱怎么用
ElasticSearch⽬前最新的已到5.5.1
spring data elasticarch elasticarch
3.0.0.RC1 5.5.0
3.0.0.M4 5.
4.0
2.0.4.RELEASE 2.4.0
2.0.0.RELEASE 2.2.0
1.4.0.M1 1.7.3
1.3.0.RELEASE 1.5.2
1.2.0.RELEASE 1.4.4
1.1.0.RELEASE 1.3.2
1.0.0.RELEASE 1.1.1
这有⼀个对应关系,不过不太完整,我⽬前使⽤的SpringBoot版本1.5.4对应的spring-data-ElasticSearch是2.1.4,在图上就没有体现。
但是可以预见对应的ElasticSearch应该在2.4.*往上,但应该是不⽀持5.4.0及以上。
注意:我这篇例⼦,所使⽤的ElasticSearch版本就是最新的5.5.1,SpringBoot版本是1.5.4,经初步试验,插⼊及查询都没问题。估计是5.5.*的新特性之类的会⽆法使⽤,基本操作应该都没问题。
ElasticSearchRepository的基本使⽤
@NoRepositoryBean
public interface ElasticarchRepository<T, ID extends Serializable> extends ElasticarchCrudRepository<T, ID> {
羊排骨的做法
<S extends T> S index(S var1);
Iterable<T> arch(QueryBuilder var1);
Page<T> arch(QueryBuilder var1, Pageable var2);
Page<T> arch(SearchQuery var1);
Page<T> archSimilar(T var1, String[] var2, Pageable var3);
void refresh();
Class<T> getEntityClass();
}
我们是通过继承ElasticarchRepository来完成基本的CRUD及分页操作的,和普通的JPA没有什么区别。
ElasticarchRepository继承了ElasticarchCrudRepository extends PagingAndSortingRepository.
先看看普通查询:
public interface BookRepository extends Repository<Book, String> {
List<Book> findByNameAndPrice(String name, Integer price);
List<Book> findByNameOrPrice(String name, Integer price);
Page<Book> findByName(String name,Pageable page);
Page<Book> findByNameNot(String name,Pageable page);
Page<Book> findByPriceBetween(int price,Pageable page);
Page<Book> findByNameLike(String name,Pageable page);
@Query("{\"bool\" : {\"must\" : {\"term\" : {\"message\" : \"?0\"}}}}")
Page<Book> findByMessage(String message, Pageable pageable);
}
大型活动策划方案这个没什么特点,就是普通的JPA查询,这个很熟悉,通过上⾯的JPA查询就能完成很多的基本操作了。
插⼊数据也很简单:
@Autowired
private SampleElasticarchRepository repository;
String documentId = "123456";
SampleEntity sampleEntity = new SampleEntity();
包饺子用英语怎么说sampleEntity.tId(documentId);
sampleEntity.tMessage("some message");
repository.save(sampleEntity);
还可以批量插⼊数据:
@Autowired
private SampleElasticarchRepository repository;
String documentId = "123456";
SampleEntity sampleEntity1 = new SampleEntity();
sampleEntity1.tId(documentId);
sampleEntity1.tMessage("some message");
String documentId2 = "123457"
SampleEntity sampleEntity2 = new SampleEntity();
sampleEntity2.tId(documentId2);
sampleEntity2.tMessage("test message");
List<SampleEntity> sampleEntities = Arrays.asList(sampleEntity1, sampleEntity2);
//bulk index
repository.save(sampleEntities);
特殊情况下,ElasticarchRepository⾥⾯有⼏个特殊的arch⽅法,这些是ES特有的,和普通的JPA区别的地⽅,⽤来构建⼀些ES查询的。
主要是看QueryBuilder和SearchQuery两个参数,要完成⼀些特殊查询就主要看构建这两个参数。风什么雨雪
我们先来看看它们之间的类关系
从这个关系中可以看到ES的arch⽅法需要的参数SearchQuery是⼀个接⼝,有⼀个实现类叫NativeSearchQuery,实际使⽤中,我们的主要任务就是构建NativeSearchQuery来完成⼀些复杂的查询的。
我们可以看到要构建NativeSearchQuery,主要是需要⼏个构造参数
public NativeSearchQuery(QueryBuilder query, QueryBuilder filter, List<SortBuilder> sorts, Field[] highlightFields) {
this.query = query;
this.filter = filter;
this.sorts = sorts;
this.highlightFields = highlightFields;
}
手机imei码查询方法当然了,我们没必要实现所有的参数。
可以看出来,⼤概是需要QueryBuilder,filter,和排序的SortBuilder,和⾼亮的字段。
⼀般情况下,我们不是直接是new NativeSearchQuery,⽽是使⽤NativeSearchQueryBuilder。
通过
毕业论文要求NativeSearchQueryBuilder.withQuery(QueryBuilder1).withFilter(QueryBuilder2).withSort(SortBuilder1).withXXXX().build();这样的⽅式来完成NativeSearchQuery的构建。
从名字就能看出来,QueryBuilder主要⽤来构建查询条件、过滤条件,SortBuilder主要是构建排序。
譬如,我们要查询距离某个位置100⽶范围内的所有⼈、并且按照距离远近进⾏排序:
double lat = 39.929986;
double lon = 116.395645;
Long nowTime = System.currentTimeMillis();
//查询某经纬度100⽶范围内
GeoDistanceQueryBuilder builder = DistanceQuery("address").point(lat, lon)
.distance(100, DistanceUnit.METERS);
GeoDistanceSortBuilder sortBuilder = DistanceSort("address")
.point(lat, lon)
.unit(DistanceUnit.METERS)
.
order(SortOrder.ASC);
Pageable pageable = new PageRequest(0, 50);
NativeSearchQueryBuilder builder1 = new NativeSearchQueryBuilder().withFilter(builder).withSort(sortBuilder).withPageable(pageable);
SearchQuery archQuery = builder1.build();
要完成字符串的查询:
SearchQuery archQuery = new NativeSearchQueryBuilder().withQuery(QueryBuilders.queryStringQuery("spring boot OR 书籍")).build();
要构建QueryBuilder,我们可以使⽤⼯具类QueryBuilders,⾥⾯有⼤量的⽅法⽤来完成各种各样的QueryBuilder的构建,字符串的、Boolean型的、match的、地理范围的等等。
德能勤绩廉个人总结要构建SortBuilder,可以使⽤SortBuilders来完成各种排序。
然后就可以通过NativeSearchQueryBuilder来组合这些QueryBuilder和SortBuilder,再组合分页的参数等等,最终就能得到⼀个SearchQuery了。
⾄此,我们明⽩了ElasticSearchRepository⾥那⼏个arch查询⽅法需要的参数的含义和构建⽅式了。ElasticSearchTemplate的使⽤
ElasticSearchTemplate更多是对ESRepository的补充,⾥⾯提供了⼀些更底层的⽅法。
这⾥主要是⼀些查询相关的,同样是构建各种SearchQuery条件。
也可以完成add操作
String documentId = "123456";
SampleEntity sampleEntity = new SampleEntity();
sampleEntity.tId(documentId);
sampleEntity.tMessage("some message");
IndexQuery indexQuery = new IndexQueryBuilder().Id()).withObject(sampleEntity).build();
elasticarchTemplate.index(indexQuery);
add主要是通过index⽅法来完成,需要构建⼀个IndexQuery对象
构建这个对象,主要是设置⼀下id,就是你的对象的id,Object就是对象本⾝,indexName和type就是在你的对象javaBean上声明的