首先pom檔案裡依賴:
<!-- Elastic search-->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-elasticsearch</artifactId>
<version>1.1.3.RELEASE</version>
</dependency>
配置elastic
<elasticsearch:repositories base-package="com.*.dao" />
<elasticsearch:transport-client id="client" cluster-nodes="@{elasticsearch.clusterNodes}" cluster-name="@{elasticsearch.clusterName}" />
<bean name="elasticsearchTemplate" class="org.springframework.data.elasticsearch.core.ElasticsearchTemplate">
<constructor-arg name="client" ref="client"/>
</bean>
<elasticsearch: 目前不全,可以改用常用注入bean方式:
<bean id="client" class="org.springframework.data.elasticsearch.client.TransportClientFactoryBean" >
<property name="clusterNodes" value="ip:port,ip:port"/>
<property name="clusterName" value="myelasticsearch"/>
<property name="properties" >
<props>
<prop key="sh" >cass</prop>
<prop key=""></prop>
</props>
</property>
</bean>
定義的文檔結構:
@Document(indexName = "product-index",type = "PRODUCT",shards = 1, replicas = 1 ,refreshInterval = "-1")
public class ProductDocument {
private
@Id
String id;
private @Field(type = Nested)List<CityBean> bookCityCode;
}
Dao
public interface ProductDocumentRepository extends ElasticsearchRepository<ProductDocument,String> {
public ProductDocument findByProductId(long productId);
}
spring data會自動生成repository 的實作類。
也可以寫查詢的query:
結構bean:
@Data
@Builder
@Document(indexName = "conference-index", shards = 1, replicas = 0, indexStoreType = "memory", refreshInterval = "-1")
public class Conference {
private @Id
String id;
private String name;
private @Field(type = Date) String date;
private @GeoPointField
String location;
private List<String> keywords;
private List<CityBean> cityBeans;
// do not remove it
public Conference() {}
// do not remove it - work around for lombok generated constructor for all params
public Conference(String id, String name, String date, String location, List<String> keywords,List<CityBean> cityBeans) {
this.id = id;
this.name = name;
this.date = date;
this.location = location;
this.keywords = keywords;
this.cityBeans=cityBeans;
}
}
public class CityBean {
private int code;
private String name;
}
DAO :
<pre name="code" class="java">public interface ConferenceRepository extends ElasticsearchRepository<Conference, String> {
@Query("{\"bool\":{\"must\":[{\"nested\":{\"path\":\"cityBeans\",\"query\":{\"bool\":{\"must\":[{\"match\":{\"cityBeans.code\":?0}}]}}}}]}}" )
public List<Conference> findByCityCode(int code,Pageable pageable);
}
t調用查詢:
List<Conference> conferences=repository.findByCityCode(1602,new PageRequest(0,20));
另外一種查詢方式:
QueryBuilder builder = QueryBuilders.nestedQuery("cityBeans", QueryBuilders.boolQuery().must(termQuery("cityBeans.code", 1602)));
QueryBuilder builder1=QueryBuilders.boolQuery().must(builder);
Iterable<Conference> result4 =repository.search(builder1);