天天看點

spring data elastic search初識

首先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);