006-spring-data-elasticsearch 3.0.0.0使用【四】-spring-data之Elasticsearch Repositories
續
二、Elasticsearch Repositories
2.1、簡介
2.1.1、Spring命名空間
Spring Data Elasticsearch模塊包含一個允許定義存儲庫bean的自定義名稱空間以及用于實例化ElasticsearchServer的元素。使用repositories元素查找Spring Data存儲庫
示例、使用名稱空間設置Elasticsearch存儲庫
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:elasticsearch="http://www.springframework.org/schema/data/elasticsearch" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/data/elasticsearch http://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch-1.0.xsd"><elasticsearch:repositories base-package="com.acme.repositories" /></beans> View Code使用傳輸客戶端或節點客戶端元素在上下文中注冊Elasticsearch服務器的實例。
傳輸客戶端使用命名空間
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:elasticsearch="http://www.springframework.org/schema/data/elasticsearch" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/data/elasticsearch http://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch-1.0.xsd"><elasticsearch:transport-client id="client" cluster-nodes="localhost:9300,someip:9300" /></beans> View Code節點客戶端使用命名空間
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:elasticsearch="http://www.springframework.org/schema/data/elasticsearch" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/data/elasticsearch http://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch-1.0.xsd"><elasticsearch:node-client id="client" local="true"" /></beans> View Code2.1.2、基于注釋的配置
Spring Data Elasticsearch存儲庫支持不僅可以通過XML命名空間激活,還可以通過JavaConfig使用注釋。
示例、使用JavaConfig激活Elasticsearch數據儲存庫
@Configuration @EnableElasticsearchRepositories(basePackages = "org/springframework/data/elasticsearch/repositories") static class Config {@Beanpublic ElasticsearchOperations elasticsearchTemplate() {return new ElasticsearchTemplate(nodeBuilder().local(true).node().client());} } View Code上面的配置設置了ElasticsearchTemplate使用的嵌入式Elasticsearch服務器。Spring Data Elasticsearch Repositories使用@EnableElasticsearchRepositories注釋來激活,它本質上具有與XML名稱空間相同的屬性。如果沒有配置基礎軟件包,它將使用配置類所在的軟件包。
2.1.3、Elasticsearch使用CDI進行存儲
Spring Data Elasticsearch存儲庫也可以使用CDI功能進行設置。
示例
class ElasticsearchTemplateProducer {@Produces@ApplicationScopedpublic ElasticsearchOperations createElasticsearchTemplate() {return new ElasticsearchTemplate(nodeBuilder().local(true).node().client());} }class ProductService {private ProductRepository repository;public Page<Product> findAvailableBookByName(String name, Pageable pageable) {return repository.findByAvailableTrueAndNameStartingWith(name, pageable);}@Injectpublic void setRepository(ProductRepository repository) {this.repository = repository;} } View Code2.2、查詢方法
2.2.1、查詢策略
Elasticsearch模塊支持所有基本的查詢構建功能,如String,Abstract,Criteria或從方法名派生。
聲明的查詢
從方法名稱派生查詢并不總是足夠的和/或可能導致不可讀的方法名稱。在這種情況下,可以使用@Query注解(請參閱使用@Query注釋)。
2.2.2、query創建
示例
public interface BookRepository extends Repository<Book, String>{List<Book> findByNameAndPrice(String name, Integer price); }上面的方法名稱將被轉換為以下Elasticsearch json查詢
{ "bool" :{ "must" :[{ "field" : {"name" : "?"} },{ "field" : {"price" : "?"} }]} }下面顯示了Elasticsearch支持的關鍵字列表。
| And | findByNameAndPrice | {"bool" : {"must" : [ {"field" : {"name" : "?"}}, {"field" : {"price" : "?"}} ]}} |
| Or | findByNameOrPrice | {"bool" : {"should" : [ {"field" : {"name" : "?"}}, {"field" : {"price" : "?"}} ]}} |
| Is | findByName | {"bool" : {"must" : {"field" : {"name" : "?"}}}} |
| Not | findByNameNot | {"bool" : {"must_not" : {"field" : {"name" : "?"}}}} |
| Between | findByPriceBetween | {"bool" : {"must" : {"range" : {"price" : {"from" : ?,"to" : ?,"include_lower" : true,"include_upper" : true}}}}} |
| LessThanEqual | findByPriceLessThan | {"bool" : {"must" : {"range" : {"price" : {"from" : null,"to" : ?,"include_lower" : true,"include_upper" : true}}}}} |
| GreaterThanEqual | findByPriceGreaterThan | {"bool" : {"must" : {"range" : {"price" : {"from" : ?,"to" : null,"include_lower" : true,"include_upper" : true}}}}} |
| Before | findByPriceBefore | {"bool" : {"must" : {"range" : {"price" : {"from" : null,"to" : ?,"include_lower" : true,"include_upper" : true}}}}} |
| After | findByPriceAfter | {"bool" : {"must" : {"range" : {"price" : {"from" : ?,"to" : null,"include_lower" : true,"include_upper" : true}}}}} |
| Like | findByNameLike | {"bool" : {"must" : {"field" : {"name" : {"query" : "?*","analyze_wildcard" : true}}}}} |
| StartingWith | findByNameStartingWith | {"bool" : {"must" : {"field" : {"name" : {"query" : "?*","analyze_wildcard" : true}}}}} |
| EndingWith | findByNameEndingWith | {"bool" : {"must" : {"field" : {"name" : {"query" : "*?","analyze_wildcard" : true}}}}} |
| Contains/Containing | findByNameContaining | {"bool" : {"must" : {"field" : {"name" : {"query" : "?","analyze_wildcard" : true}}}}} |
| In | findByNameIn(Collection<String>names) | {"bool" : {"must" : {"bool" : {"should" : [ {"field" : {"name" : "?"}}, {"field" : {"name" : "?"}} ]}}}} |
| NotIn | findByNameNotIn(Collection<String>names) | {"bool" : {"must_not" : {"bool" : {"should" : {"field" : {"name" : "?"}}}}}} |
| Near | findByStoreNear | Not Supported Yet ! |
| True | findByAvailableTrue | {"bool" : {"must" : {"field" : {"available" : true}}}} |
| False | findByAvailableFalse | {"bool" : {"must" : {"field" : {"available" : false}}}} |
| OrderBy | findByAvailableTrueOrderByNameDesc | {"sort" : [{ "name" : {"order" : "desc"} }],"bool" : {"must" : {"field" : {"available" : true}}}} |
2.2.3、使用@Query注解
public interface BookRepository extends ElasticsearchRepository<Book, String> {@Query("{"bool" : {"must" : {"field" : {"name" : "?0"}}}}")Page<Book> findByName(String name,Pageable pageable); }三、其他Elasticsearch操作支持
無法通過存儲庫接口直接訪問的Elasticsearch操作的額外支持。建議將這些操作添加為自定義實現,如Spring Data存儲庫的自定義實現中所述。
3.1、Filter Builder
private ElasticsearchTemplate elasticsearchTemplate;SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).withFilter(boolFilter().must(termFilter("id", documentId))).build();Page<SampleEntity> sampleEntities =elasticsearchTemplate.queryForPage(searchQuery,SampleEntity.class); View Code3.2、使用Scan And Scroll查看大結果集
Elasticsearch具有掃描和滾動功能,可以獲取大塊結果集。 ElasticsearchTemplate具有可用于以下的掃描和滾動方法。
SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).withIndices("test-index").withTypes("test-type").withPageable(new PageRequest(0,1)).build(); String scrollId = elasticsearchTemplate.scan(searchQuery,1000,false); List<SampleEntity> sampleEntities = new ArrayList<SampleEntity>(); boolean hasRecords = true; while (hasRecords){Page<SampleEntity> page = elasticsearchTemplate.scroll(scrollId, 5000L , new ResultsMapper<SampleEntity>(){@Overridepublic Page<SampleEntity> mapResults(SearchResponse response) {List<SampleEntity> chunk = new ArrayList<SampleEntity>();for(SearchHit searchHit : response.getHits()){if(response.getHits().getHits().length <= 0) {return null;}SampleEntity user = new SampleEntity();user.setId(searchHit.getId());user.setMessage((String)searchHit.getSource().get("message"));chunk.add(user);}return new PageImpl<SampleEntity>(chunk);}});if(page != null) {sampleEntities.addAll(page.getContent());hasRecords = page.hasNextPage();}else{hasRecords = false;}} } View Code整體spring配置參看
?
總結
以上是生活随笔為你收集整理的006-spring-data-elasticsearch 3.0.0.0使用【四】-spring-data之Elasticsearch Repositories的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【转】如何掌握所有的程序语言
- 下一篇: Spring Boot 2.0(二):S