spring-boot-starter-data-elasticsearch實現es的增刪查改


首先,必須吐槽一下,springboot這個elasticsearch包對於elasticsearch的支持十分不友好,目前只支持很低版本的elasticsearch,如果有哪位大牛知道如何兼容更高版本的elasticsearch,歡迎給我留言。

 

es下載地址:https://www.elastic.co/downloads/elasticsearch

我測試的es版本是2.4.5,spring-boot-starter-data-elasticsearch不支持太高版本的elasticsearch。

另外,我是在windows下安裝的,在官網下載好zip包后,到bin文件夾下,運行elasticsearch.bat,測試:http://localhost:9200/,能正確顯示版本就可以了。

 

安裝好后,我們在pom.xml文件添加依賴

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
            <version>1.5.10.RELEASE</version>
        </dependency>

 

在properties文件中添加es設置:
spring.data.elasticsearch.cluster-name=elasticsearch  es默認
spring.data.elasticsearch.cluster-nodes= 127.0.0.1:9300 es默認

 

實體類:

@Document(indexName = "monitoralarm", type = "monitorAlarms")//加上了@Document注解之后,默認情況下這個實體中所有的屬性都會被建立索引、並且分詞
public class MonitorAlarmVO implements Serializable {

    @Id
    private Long id;
    private String uniqueKey;
    private Long monitoryPointId;
    private int modelDivisionType;
    private Long groupId;
    private int type;
    private int status;
    private String serverHost;
    private String data;
    private int picWidth;
    private int picHeight;
    private String objects;
    private Date alarmTime;
    private Date createTime;
    private boolean isRemove;
    private Date removeTime;
}

 

接口:

import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;

public interface MonitorAlarmRepository extends ElasticsearchRepository<MonitorAlarmVO, Long> {

    //Page<MonitorAlarmVO> findByGroupId(Long groupId);


}

 

controller:

public class MonitorAlarmController {


    @Autowired
    private MonitorAlarmRepository monitorAlarmRepository;

    //============================elasticsearch
    /**
     * 1、根據id查
     * @param id
     * @return
     */
    @GetMapping("/esById/{id}")
    public MonitorAlarmVO getBookById(@PathVariable Long id) {
        return monitorAlarmRepository.findOne(id);
    }

    /**
     * 2、查  ++:全文檢索(根據整個實體的所有屬性,可能結果為0個)
     * @param key
     * @return
     */
    @GetMapping("/esByKey/{key}")
    public List<MonitorAlarmVO> testSearch(@PathVariable String key) {
        QueryStringQueryBuilder builder = new QueryStringQueryBuilder(key);
        Iterable<MonitorAlarmVO> searchResult = monitorAlarmRepository.search(builder);
        Iterator<MonitorAlarmVO> iterator = searchResult.iterator();
        List<MonitorAlarmVO> list = new ArrayList<MonitorAlarmVO>();
        while (iterator.hasNext()) {
            list.add(iterator.next());
        }
        return list;
    }

    /**
     * 3、查   +++:分頁、分數、分域(結果一個也不少)
     * @param page
     * @param size
     * @param q
     * @return
     * @return
     */
    @GetMapping("/{page}/{size}/{key}")
    public List<MonitorAlarmVO> searchCity(@PathVariable Integer page, @PathVariable Integer size, @PathVariable String key) {

        // 分頁參數
        Pageable pageable = new PageRequest(page, size);

        // 分數,並自動按分排序
        FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery()
                .add(QueryBuilders.boolQuery().should(QueryBuilders.matchQuery("name", key)),
                        ScoreFunctionBuilders.weightFactorFunction(1000)) // 權重:name 1000分
                .add(QueryBuilders.boolQuery().should(QueryBuilders.matchQuery("message", key)),
                        ScoreFunctionBuilders.weightFactorFunction(100)); // 權重:message 100分

        // 分數、分頁
        SearchQuery searchQuery = new NativeSearchQueryBuilder().withPageable(pageable)
                .withQuery(functionScoreQueryBuilder).build();

        Page<MonitorAlarmVO> searchPageResults = monitorAlarmRepository.search(searchQuery);
        return searchPageResults.getContent();

    }

    /**
     * 4、增
     * @param monitorAlarmVO
     * @return
     */
    @PostMapping("/esInsert")
    public MonitorAlarmVO insertBook(MonitorAlarmVO monitorAlarmVO) {
        monitorAlarmRepository.save(monitorAlarmVO);
        return monitorAlarmVO;
    }

    /**
     * 5、刪 id
     * @param id
     * @return
     */
    @DeleteMapping("/esDelete/{id}")
    public MonitorAlarmVO insertBook(@PathVariable Long id) {
        MonitorAlarmVO monitorAlarmVO = monitorAlarmRepository.findOne(id);
        monitorAlarmRepository.delete(id);
        return monitorAlarmVO;
    }

    /**
     * 6、改
     * @param monitorAlarmVO
     * @return
     */
    @PutMapping("/esUpdate")
    public MonitorAlarmVO updateBook(MonitorAlarmVO monitorAlarmVO) {
        monitorAlarmRepository.save(monitorAlarmVO);
        return monitorAlarmVO;
    }


    //============================elasticsearch
}

 

好的,我們啟動試試,報了一個錯誤,提示如下:

threw exception; nested exception is java.lang.NoSuchMethodError: org.jboss.netty.channel.socket.nio.NioWorker
 
這個是因為我的項目里的dubbo/zookeeper的netty包和es的netty包沖突了導致啟動不了,解決方法是排除其中一個的netty包,我這里選擇排除dubbo和zookeeper的netty包試試,但是后面發現排除了netty包會導致dubbo出錯,有兩全其美的辦法麻煩給我留言下。
如下:
        <dependency>
            <groupId>com.alibaba.spring.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <exclusions>
                <exclusion>
                    <artifactId>netty</artifactId>
                    <groupId>org.jboss.netty</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-api</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>log4j</groupId>
                    <artifactId>log4j</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>io.netty</groupId>
                    <artifactId>netty</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

 

最后,我們可以啟動項目,訪問試試了。

 


免責聲明!

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



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