這篇博客主要講入門,具體實現須要看官方文檔! Spring集成ElasticSearch: 優勢:將原生API進行封裝,操做ES很是簡單。 缺點:容易形成版本衝突。 ##參考資料 spring-data-elasticsearch官網java
##設置pom文件node
<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文件spring
#默認即爲elasticsearch cluster_name=elasticsearch #配置es節點信息,逗號分隔。 elasticsearch_nodes=172.16.30.56:9300,172.16.30.126:9300
##配置elasticSearch.xml中的ElasticsearchTemplate類信息app
<?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引入上面的配置信息elasticsearch
<import resource="classpath:elasticSearch.xml"/>
##索引對應的實體類(和文檔的元數據要對應哦)ui
索引: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接口spa
@Component // 由於文檔的id是String類型的,因此泛型的第二個參數是String。 public interface ZjbNoteEsRepository extends ElasticsearchRepository<EsZjbNote,String>{ }
##查:根據Id屬性查找文檔3d
// ES存在一個id=023dc4f1a0c9451ab6e88962f9b623ea的文檔。 EsZjbNote note = repository.findOne("023dc4f1a0c9451ab6e88962f9b623ea");
##查:全文檢索code
QueryStringQueryBuilder builder = new QueryStringQueryBuilder(message); iterable = repository.search(builder); iterator = iterable.iterator();
##查:簡單的布爾查詢server
@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);