ElasticSearch(2)---SpringBoot整合ElasticSearch


SpringBoot整合ElasticSearch

 

一、基於spring-boot-starter-data-elasticsearch整合

 開發環境:springboot版本:2.0.1,elasticSearch-5.6.8.jar版本:5.6.8,服務器部署ElasticSearch版本:6.3.2

1、application.properties

spring.data.elasticsearch.cluster-name=elasticsearch
spring.data.elasticsearch.cluster-nodes=127.0.0.1:9300
spring.data.elasticsearch.repositories.enabled=true

2、pom.xml

        <!--spring整合elasticsearch包-->
        <dependency>  
           <groupId>org.springframework.boot</groupId>  
           <artifactId>spring-boot-starter-data-elasticsearch</artifactId>  
       </dependency>

        <!--實體工具包-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <!--集合工具包-->
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>19.0</version>
        </dependency>

3、Notice實體

@Data
@AllArgsConstructor
@NoArgsConstructor
//indexName代表所以名稱,type代表表名稱
@Document(indexName = "wantu_notice_info", type = "doc")
public class Notice {

    //id
    @JsonProperty("auto_id")
    private Long id;

    //標題
    @JsonProperty("title")
    private String title;

    //公告標簽
    @JsonProperty("exchange_mc")
    private String exchangeMc;

    //公告發布時間
    @JsonProperty("create_time")
    private String originCreateTime;

    //公告閱讀數量
    @JsonProperty("read_count")
    private Integer readCount;
    
}

4、NoticeRepository類

import com.jincou.elasearch.domain.Notice;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Component;

@Component
public interface NoticeRepository extends ElasticsearchRepository<Notice, Long> {

} 

5、NoticeController

@RestController
@RequestMapping("/api/v1/article")
public class NoticeController {


    @Autowired
    private NoticeRepository nticeRepository;
    
    @GetMapping("save")
    public CommandResult<Void> save(long id, String title){
    
        Notice article = new Notice();
        article.setId(id);
        article.setReadCount(123);
        article.setTitle("springboot整合elasticsearch,這個是新版本 2018年");
        nticeRepository.save(article);
        return CommandResult.ofSucceed();
    }


    /**
     * @param title   搜索標題
     * @param pageable page = 第幾頁參數, value = 每頁顯示條數
     */
    @GetMapping("search")
    public CommandResult<List<Notice>> search(String title,@PageableDefault(page = 1, value = 10) Pageable pageable){
//按標題進行搜索 QueryBuilder queryBuilder
= QueryBuilders.matchQuery("title", title);
//如果實體和數據的名稱對應就會自動封裝,pageable分頁參數 Iterable
<Notice> listIt = nticeRepository.search(queryBuilder,pageable);
//Iterable轉list List
<Notice> list= Lists.newArrayList(listIt); return CommandResult.ofSucceed(list); } }

6、查看運行結果

它會進行中文分詞查詢,然后安裝相識度進行排序

總體步驟還是蠻清晰簡單的,因為有spring-boot-starter-data-elasticsearch進行了整合,所以我們可以少敲很多代碼。

 

二、 基於TransportClient整合

首先明白:如果項目SpringBoot1.5.X以下的,那么elasticSearch.jar最高是2.4.4版本的,只有SpringBoot2.X+,elasticSearch.jar才是5.X+

              如果你的SpringBoot是1.5.X以下,那你又想用elasticSearch.jar5.X+怎么辦呢,那就不要用spring-boot-starter-data-elasticsearch,用原生的TransportClient實現即可。

這個相當於用原生的去使用elasticsearch,這里面並沒有用到spring-boot-starter-data-elasticsearch相關jar包,因為我們公司的springBoot版本是1.5.9。

如果用spring-boot-starter-data-elasticsearch的話,那么elasticsearch版本最高只有2.4.4,這也太落后了,現在elasticsearch已經到6.3.2了,為了用更好的版本有兩個方案:

1、提高springboot版本到2.X(不過不現實,船大難掉頭),2、用原生的TransportClient實現。最終落地實現是通過TransportClient實現

把關鍵代碼展示出來。

1、pom.xml

    <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>5.6.8</version>
        </dependency>


        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>transport</artifactId>
            <version>5.6.8</version>
        </dependency>

        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.7</version>
        </dependency>

2、創建實體

    @Configuration public class ServerModule {

        @Bean public TransportClient transportClient() {
            Settings settings = Settings.builder().put("cluster.name", "biteniuniu").build();
            //我用6.3.2版本的時候這里一直報異常說找不到InetSocketTransportAddress類,這應該和jar有關,當我改成5.6.8就不報錯了
            TransportClient client = new PreBuiltTransportClient(settings);//6.3.2這里TransportAddress代替InetSocketTransportAddress
            client.addTransportAddress(new InetSocketTransportAddress(
                    new InetSocketAddress(InetAddresses.forString("127.0.0.1"), 9300)));
            return client;
        }
    }

3、NoticeController類

@RestController
@RequestMapping("/api/v1/notice")
public class NoticeController {
    

    @Autowired private TransportClient transportClient;
    
    /**
     *利用TransportClient實現搜索功能
     * @param title   搜索標題
     * @param  page = 從第幾條結果返回 | Integer(比如一次size=20,page=0,如果要顯示下一頁20條記錄則需要size=20,page=20)這個和之前有點區別, size = 每頁顯示條數
     */

    @RequestMapping(value = "trsearch", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
    public CommandResult<List<Notice>> search(@RequestParam(value = "title", defaultValue = "比特幣")String title, @RequestParam(value = "page", defaultValue = "0")Integer page,
                                                              @RequestParam(value = "size", defaultValue = "20")Integer size) {

        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        //按標題進行查找
        boolQueryBuilder.must(QueryBuilders.matchQuery("title", title));
        
//在這里輸入索引名稱和type類型 SearchResponse response
= transportClient.prepareSearch("wantu_notice_info").setTypes("doc") // 設置查詢類型java .setSearchType(SearchType.DFS_QUERY_THEN_FETCH) // 設置查詢關鍵詞 .setQuery(boolQueryBuilder) // 設置查詢數據的位置,分頁用 .setFrom(page) // 設置查詢結果集的最大條數 .setSize(size) // 設置是否按查詢匹配度排序 .setExplain(true) // 最后就是返回搜索響應信息 .get(); SearchHits searchHits = response.getHits(); List<Notice> list = Lists.newArrayListWithCapacity(size); for (SearchHit searchHit : searchHits) { Map<String, Object> sourceAsMap = searchHit.getSourceAsMap(); //獲得titie數據 String titles = (String) sourceAsMap.get("title"); //獲得閱讀量數據 Integer readCount = (Integer) sourceAsMap.get("read_count"); //把數據裝入對象中 Notice notice=new Notice(); notice.setTitle(titles); notice.setReadCount(readCount); list.add(notice); } return CommandResult.ofSucceed(list); } }

4、運行結果

 總結下:第一種整合相對簡單很多,因為本身封裝很多東西,比如分頁,封裝數據等。第二種的話可以在不用spring的情況下使用它。

 

 我只是偶爾安靜下來,對過去的種種思忖一番。那些曾經的舊時光里即便有過天真愚鈍,也不值得譴責。畢竟,往后的日子,還很長。不斷鼓勵自己,

 天一亮,又是嶄新的起點,又是未知的征程(上校4)

 

  


免責聲明!

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



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