ES開發(fā)指南|如何快速上手ElasticSearch
前言
ElasticSearch不只是全文檢索引擎的領(lǐng)頭羊,現(xiàn)在也是各個大廠標(biāo)配的大數(shù)據(jù)平臺之一,被廣泛用于搜索加速,用戶標(biāo)簽、畫像系統(tǒng)、向量搜索等領(lǐng)域,它不是傳統(tǒng)的關(guān)系型數(shù)據(jù)庫,但這個信息爆炸,數(shù)據(jù)堆積的時代,我們獲取知識的方式已經(jīng)極大的改變,搜索、提問成了獲取知識的第一手段。對ElasticSearch工程師的要求已經(jīng)不亞于甚至超過了對DBA的要求。那么,要如何才能成為一個被認(rèn)可的ElasticSearch工程師?希望這篇文章能夠從一個開發(fā)工程師的角度,給大家?guī)韼椭?/p>
1、全文檢索
「Lucence的簡單入門:」
- 在此之前我們先談?wù)凩ucence,它是apache軟件基金會發(fā)布的一個開放源代碼的全文檢索引擎工具包,由資深全文檢索專家Doug Cutting所撰寫,它是一個全文檢索引擎的架構(gòu),提供了完整的創(chuàng)建索引和查詢索引,以及部分文本分析的引擎。
 - Lucence的目的是為軟件開發(fā)人員提供一個簡單易用的工具包,以方便在目標(biāo)系統(tǒng)中實現(xiàn)全文檢索的功能,或者是以此為基礎(chǔ)建立起完整的全文檢索引擎,Lucence在全文檢索領(lǐng)域是一個經(jīng)典的祖先,現(xiàn)在很多檢索引擎都在其基礎(chǔ)上創(chuàng)建的,思想是相通的。
 - Lucence是根據(jù)關(guān)鍵字來搜索的文本搜索工具,只能在某個網(wǎng)站內(nèi)容搜索文本內(nèi)容,不能跨網(wǎng)站搜索。
 - 想進一步了解Lucence的可以下面博客查閱
 
https://www.cnblogs.com/ysdrzp/p/10009660.html
2、ElasticSearch是什么?
「倒排索引原理:」
- 倒排索引是目前搜索引擎公司對搜索引擎最常用的存儲方式,也是搜索引擎的核心內(nèi)容,在搜索引擎的實際應(yīng)用中,有時需要按照關(guān)鍵字的某些值查找記錄,所以是按照關(guān)鍵字建立索引,這個索引就是倒排索引
 
「ElasticSearch概念:」
- ElasticSearch是一個基于Lucence的全文搜索服務(wù)器,java語言編寫,提供了分布式的搜索引擎,安裝方便,使用簡單
 
3、ElasticSearch能干什么?
「主要用途:」
- 分布式下首頁搜索,如百度,淘寶,京東...
 - 基于索引數(shù)據(jù)存儲
 
4、Elastic有哪些產(chǎn)品
「主要產(chǎn)品:」
- E(ElasticSearch)
 - L(logstash)
 - K(Kibana)
 - B(Beats)
 
5、ElasticSearch的安裝以及使用
「安裝ElasticSearch:」
- Elasticsearch官網(wǎng):https://www.elastic.co/cn/products/elasticsearch
 - 下載地址:https://www.elastic.co/downloads/past-releases
 - 安裝Elasticsearch前提條件:JDK1.8及以上
 
「安裝:」
- ElasticSearch無需安裝,解壓即用
 
「運行:」
- 進入elasticsearch/bin目錄,雙擊可執(zhí)行文件elasticsearch.bat
 - 可以看到綁定了兩個端口:
 - 9300:Java程序訪問的端口
 - 9200:瀏覽器、postman訪問的端口
 - 我們在瀏覽器中訪問:http://127.0.0.1:9200,出現(xiàn)json數(shù)據(jù)字符串,說明安裝成功。
 
6、安裝Head插件
「什么是Head:」
- ElasticSearch只是后端提供各種API,那么怎么直觀的使用它呢?ElasticSearch-head將是一款專門針對ElasticSearch的客戶端工具
 - ElasticSearch-head配置包,下載地址:https://github.com/mobz/elasticsearch-head
 
「安裝Head:」
- 注意:es5以上版本安裝head需要安裝node和grunt
 - 第一步:從地址:https://nodejs.org/en/download/ 下載相應(yīng)系統(tǒng)的msi,雙擊安裝。
 - 第二步:安裝完成用cmd進入安裝目錄執(zhí)行 node -v可查看版本號
 - 能看到版本號說明node安裝成功
 - 第三步:執(zhí)行 npm install -g grunt-cli 安裝grunt ,安裝完成后執(zhí)行g(shù)runt - version查看是否安裝成功,會顯示安裝的版本號
 
「配置運行:」
- 第一步:進入Elasticsearch安裝目錄下的config目錄,修改elasticsearch.yml文件.在文件的末尾加入以下代碼
 - http.cors.enabled: true
 - http.cors.allow-origin: "*"
 - node.master: true
 - node.data: true
 - 然后去掉
 - network.host: 192.168.0.1的注釋并改為network.host: 0.0.0.0,
 - 去掉cluster.name;node.name;http.port的注釋(也就是去掉#)
 - 第二步:雙擊elasticsearch.bat重啟Elasticsearch
 - 第三步:在https://github.com/mobz/elasticsearch-head中下載head插件,選擇下載zip
 - 第四步:解壓到指定文件夾下,D:\environment\elasticsearch-head-master 進入該文件夾,修改D:\environment\elasticsearch-head-master\Gruntfile.js 在對應(yīng)的位置加上hostname:’*’。
 - connect: {
 - server: {
 - options: {
 - hostname:'*',
 - port: 9100,
 - base: '.',
 - keepalive: true
 - }
 - }
 - }
 - 第五步:
 - 打開cmd命令行窗口 ,在D:\environment\elasticsearch-head-master 下執(zhí)行npm install 安裝
 - 完成后執(zhí)行g(shù)runt server 或者npm run start 運行head插件,如果運行不成功建議重新安裝grunt。
 
「安裝完成:」
- 打開瀏覽器訪問:http://127.0.0.1:9100
 

「安裝lk分詞器:」
- ik分詞器ip:http://www.oschina.net/news/2660
 - ElasticSearch默認(rèn)采用的分詞器,是單個字分詞,效果很差,所以我們需要安裝一個更實用的分詞器,這里采用IK分詞器
 
- 下載
 - 注意:你的Elasticsearch和IK分詞器必須版本統(tǒng)一
 - 源碼下載地址:https://github.com/medcl/elasticsearch-analysis-ik/tree/6.2.x
 - jar包下載地址:https://github.com/medcl/elasticsearch-analysis-ik/releases
 - 安裝
 - 無需安裝,解壓即可使用
 - 我們將其改名為ik,并復(fù)制到Elasticsearch的解壓目錄下的plugins下面
 - 重啟elasticSearch即可
 
7、SpringBoot整合ElasticSearch
「構(gòu)建SpringBoot工程,并導(dǎo)入依賴:」
- <dependency>
 - <groupId>org.springframework.boot</groupId>
 - <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
 - </dependency>
 
「編寫實體類,對應(yīng)ElasticSearch中的document:」
- // 表示此類對應(yīng)es中的一條數(shù)據(jù)
 - type:相當(dāng)于mysql中的表
 - indexName:相當(dāng)于mysql中的數(shù)據(jù)庫
 - @Document(type = "docs",indexName = "yx")
 - public class User implements Serializable {
 - @Id //主鍵映射
 - private int userId;
 - @Field(type = FieldType.Text) //成員映射,type:表示數(shù)據(jù)類型
 - private String userName;
 - @Field
 - private double price;
 
「測試(前提ElasticSearch客戶端以及服務(wù)器全部安裝完備):」
- 1、測試類中對應(yīng)操作es的對象是ElasticsearchTemplate
 - 使用詳見https://blog.csdn.net/chen_2890/article/details/83895646
 - 2、工程化測試
 - 2.1新建service以及serviceimpl
 - 2.3聲明接口extends ElasticsearchRepository<User,Integer>,第一個參數(shù)表示實體類(document),第二個參數(shù)表示實體對象主鍵的包裝類
 - 2.4新建controll
 - 2.5啟動服務(wù)器訪問地址
 
「ElasticSearch常見方法使用:」
- //根據(jù)價格區(qū)間查詢
 - @Test
 - public void queryByPrice(){
 - // List<User> users = userRepository.findByPriceBetween(12.3,13);
 - // for (int i = 0; i < users.size(); i++) {
 - // System.out.println(users.get(i));
 - // }
 - //查詢12.3之前的
 - // List<User> users = userRepository.findByPriceBefore(12.3);
 - // System.out.println(users);
 - List<User> users = userService.findByPriceBetween(12.3,0);
 - for (User u :users) {
 - System.out.println(u);
 - }
 - }
 - //自定義查詢之分頁查詢
 - @Test
 - public void queryByPages(){
 - //創(chuàng)建構(gòu)建器
 - NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
 - //添加基本分詞查詢,fuzzyQuery模糊查詢
 - queryBuilder.withQuery(QueryBuilders.fuzzyQuery("userName", "羽"));
 - // 分頁:
 - int page = 1;
 - int size = 2;
 - queryBuilder.withPageable(PageRequest.of(page,size));
 - Page<User> users = userRepository.search(queryBuilder.build());
 - System.out.println("總條數(shù)是:"+users.getTotalElements());
 - System.out.println("總頁數(shù)是:"+users.getTotalPages());
 - System.out.println("當(dāng)前頁是:"+users.getNumber());
 - System.out.println("每一頁的數(shù)量是"+users.getSize());
 - for (User user:users) {
 - System.out.println(user);
 - }
 - }
 - //查詢排序
 - @Test
 - public void searchAndSort(){
 - //構(gòu)建查詢
 - NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
 - //模糊查詢
 - queryBuilder.withQuery(QueryBuilders.fuzzyQuery("userName", "羽"));
 - //構(gòu)建排序
 - queryBuilder.withSort(SortBuilders.fieldSort("price").order(SortOrder.DESC));
 - Page<User> users = userRepository.search(queryBuilder.build());
 - for (User user:users) {
 - System.out.println(user);
 - }
 - }
 
結(jié)語
本篇關(guān)于ElasticSearch的介紹就先到這里結(jié)束了,后續(xù)會出更多關(guān)于ElasticSearch系列更多文章,謝謝大家支持!
 
2009-06-24 16:30:21
 
 
 















 
 











 