Spring集成ElasticSearch


這篇博客主要講入門,具體實現需要看官方文檔!
Spring集成ElasticSearch:
優點:將原生API進行封裝,操作ES非常簡單。
缺點:容易造成版本沖突。

參考資料

spring-data-elasticsearch官網

設置pom文件

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-elasticsearch</artifactId>
    <version>2.1.0.RELEASE</version>
</dependency>
		
<dependency>
    <groupId>org.elasticsearch</groupId>
    <artifactId>elasticsearch</artifactId>
    <version>2.4.5</version>
</dependency>

配置es.properties文件

#默認即為elasticsearch
cluster_name=elasticsearch
#配置es節點信息,逗號分隔。
elasticsearch_nodes=172.16.30.56:9300,172.16.30.126:9300

配置elasticSearch.xml中的ElasticsearchTemplate類信息

<?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:context="http://www.springframework.org/schema/context"
    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-4.0.xsd
		http://www.springframework.org/schema/context 
		http://www.springframework.org/schema/context/spring-context-4.0.xsd 
        http://www.springframework.org/schema/data/elasticsearch
        http://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch-1.0.xsd ">
    <context:property-placeholder location="WEB-INF/conf/es.properties" />
    <elasticsearch:repositories base-package="com.scheduleserver.repository"/>
    <elasticsearch:transport-client id="client" cluster-nodes="${elasticsearch_nodes}" cluster-name="${cluster_name}"/>

    <bean id="elasticsearchTemplate" class="org.springframework.data.elasticsearch.core.ElasticsearchTemplate">
        <constructor-arg name="client" ref="client"/>
    </bean>
</beans>

application.xml引入上面的配置信息

<import resource="classpath:elasticSearch.xml"/>

索引對應的實體類(和文檔的元數據要對應哦)

索引:zjb,類型:note
@Document(indexName="zjb",type="note")
public class EsZjbNote {
	@Id
    private String f_note_id;
	/**
	 * type  	可以是Boolean,Long,Double,Date,String類型。
	 * index 	analyzed表示索引,並且對數據進行拆詞;not_analyzed表示索引,但是不進行拆詞;no表示不索引。
	 * analyzer   是字段文本的分詞器。默認standard分詞器。
	 * search_analyzer     是搜索詞的分詞器。
	 * 設置store為true,可以把字段原始值保存,但是索引會更大,需要根據需求使用。
	 */
	@Field(type = FieldType.String, index = FieldIndex.not_analyzed, store= true)
	private String f_criticalit;
	@Field
	private String f_start_time;
	@Field
	private String f_create_time;
	@Field
	private String f_attention;
	@Field
	private String f_relation;
......此處省略一堆setter和getter方法

定義實體類對應的dao接口

@Component
// 因為文檔的id是String類型的,所以泛型的第二個參數是String。
public interface ZjbNoteEsRepository extends ElasticsearchRepository<EsZjbNote,String>{

}

查:根據Id屬性查找文檔

// ES存在一個id=023dc4f1a0c9451ab6e88962f9b623ea的文檔。
EsZjbNote note = repository.findOne("023dc4f1a0c9451ab6e88962f9b623ea");

查:全文檢索

QueryStringQueryBuilder builder = new QueryStringQueryBuilder(message);
iterable = repository.search(builder);
iterator = iterable.iterator();

查:簡單的布爾查詢

	@Autowired
	private ZjbNoteEsRepository repository;

	public List<ZjbNotePo> searchByEs(String message,String userId) {
	  	Iterable<EsZjbNote> iterable;
		Iterator<EsZjbNote> iterator;
		List<ZjbNotePo> list = new ArrayList<>();
		BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
		boolQueryBuilder.must(QueryBuilders.matchQuery("f_keywords", message));
		boolQueryBuilder.filter(QueryBuilders.termQuery("f_user_id", userId));
		iterable = repository.search(boolQueryBuilder);
		iterator = iterable.iterator();
		// 遍歷取值
		while(iterator.hasNext()) {
			EsZjbNote esNote = iterator.next();
			ZjbNotePo note = new ZjbNotePo();
			note.setfAttention(Integer.parseInt(esNote.getF_attention()));
			note.setfContent(esNote.getF_content());
			note.setfCreateTime(esNote.getF_create_time());
			note.setfCriticalit(Integer.parseInt(esNote.getF_criticalit()));
			note.setfKeywords(esNote.getF_keywords());
			list.add(note);
			........省略代碼

查:分頁、權重

// 從第0個開始,返回3個文檔。
Pageable pageable = new PageRequest(0, 3);
//設置權重
FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery()
	.add(QueryBuilders.boolQuery().should(QueryBuilders.matchQuery("f_keywords", message)),
		ScoreFunctionBuilders.weightFactorFunction(1000))
	.add(QueryBuilders.boolQuery().should(QueryBuilders.matchQuery("f_content", message)),
		ScoreFunctionBuilders.weightFactorFunction(100));
//分頁,權重
SearchQuery searchQuery = new NativeSearchQueryBuilder().withPageable(pageable)
	.withQuery(functionScoreQueryBuilder).build();
iterable = repository.search(searchQuery);
iterator = iterable.iterator();

增:增加或者修改都是使用save方法

// 這個屬性必須要有,它對應ES中唯一文檔!
note.setF_note_id("023dc4f1a0c9451ab6e88962f9b623ea");
EsZjbNote note = new EsZjbNote();
note.setF_user_id("666666");
note.setF_content("費哥好帥啊");
note.setF_keywords("keyword");
note.setF_locale("中國山東濟南歷下區");
//倉庫接口
repository.save(note);

刪:刪除的對象必須要有標記為@Id的屬性

EsZjbNote note = new EsZjbNote();
note.setF_note_id("023dc4f1a0c9451ab6e88962f9b623ea");
repository.delete(note);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM