ES開發(fā)指南|如何快速上手ElasticSearch
前言
ElasticSearch不只是全文檢索引擎的領(lǐng)頭羊,現(xiàn)在也是各個(gè)大廠標(biāo)配的大數(shù)據(jù)平臺(tái)之一,被廣泛用于搜索加速,用戶標(biāo)簽、畫像系統(tǒng)、向量搜索等領(lǐng)域,它不是傳統(tǒng)的關(guān)系型數(shù)據(jù)庫,但這個(gè)信息爆炸,數(shù)據(jù)堆積的時(shí)代,我們獲取知識(shí)的方式已經(jīng)極大的改變,搜索、提問成了獲取知識(shí)的第一手段。對(duì)ElasticSearch工程師的要求已經(jīng)不亞于甚至超過了對(duì)DBA的要求。那么,要如何才能成為一個(gè)被認(rèn)可的ElasticSearch工程師?希望這篇文章能夠從一個(gè)開發(fā)工程師的角度,給大家?guī)韼椭?/p>
1、全文檢索
「Lucence的簡(jiǎn)單入門:」
- 在此之前我們先談?wù)凩ucence,它是apache軟件基金會(huì)發(fā)布的一個(gè)開放源代碼的全文檢索引擎工具包,由資深全文檢索專家Doug Cutting所撰寫,它是一個(gè)全文檢索引擎的架構(gòu),提供了完整的創(chuàng)建索引和查詢索引,以及部分文本分析的引擎。
- Lucence的目的是為軟件開發(fā)人員提供一個(gè)簡(jiǎn)單易用的工具包,以方便在目標(biāo)系統(tǒng)中實(shí)現(xiàn)全文檢索的功能,或者是以此為基礎(chǔ)建立起完整的全文檢索引擎,Lucence在全文檢索領(lǐng)域是一個(gè)經(jīng)典的祖先,現(xiàn)在很多檢索引擎都在其基礎(chǔ)上創(chuàng)建的,思想是相通的。
- Lucence是根據(jù)關(guān)鍵字來搜索的文本搜索工具,只能在某個(gè)網(wǎng)站內(nèi)容搜索文本內(nèi)容,不能跨網(wǎng)站搜索。
- 想進(jìn)一步了解Lucence的可以下面博客查閱
https://www.cnblogs.com/ysdrzp/p/10009660.html
2、ElasticSearch是什么?
「倒排索引原理:」
- 倒排索引是目前搜索引擎公司對(duì)搜索引擎最常用的存儲(chǔ)方式,也是搜索引擎的核心內(nèi)容,在搜索引擎的實(shí)際應(yīng)用中,有時(shí)需要按照關(guān)鍵字的某些值查找記錄,所以是按照關(guān)鍵字建立索引,這個(gè)索引就是倒排索引
「ElasticSearch概念:」
- ElasticSearch是一個(gè)基于Lucence的全文搜索服務(wù)器,java語言編寫,提供了分布式的搜索引擎,安裝方便,使用簡(jiǎn)單
3、ElasticSearch能干什么?
「主要用途:」
- 分布式下首頁搜索,如百度,淘寶,京東...
- 基于索引數(shù)據(jù)存儲(chǔ)
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無需安裝,解壓即用
「運(yùn)行:」
- 進(jìn)入elasticsearch/bin目錄,雙擊可執(zhí)行文件elasticsearch.bat
- 可以看到綁定了兩個(gè)端口:
- 9300:Java程序訪問的端口
- 9200:瀏覽器、postman訪問的端口
- 我們?cè)跒g覽器中訪問:http://127.0.0.1:9200,出現(xiàn)json數(shù)據(jù)字符串,說明安裝成功。
6、安裝Head插件
「什么是Head:」
- ElasticSearch只是后端提供各種API,那么怎么直觀的使用它呢?ElasticSearch-head將是一款專門針對(duì)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進(jìn)入安裝目錄執(zhí)行 node -v可查看版本號(hào)
- 能看到版本號(hào)說明node安裝成功
- 第三步:執(zhí)行 npm install -g grunt-cli 安裝grunt ,安裝完成后執(zhí)行g(shù)runt - version查看是否安裝成功,會(huì)顯示安裝的版本號(hào)
「配置運(yùn)行:」
- 第一步:進(jìn)入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 進(jìn)入該文件夾,修改D:\environment\elasticsearch-head-master\Gruntfile.js 在對(duì)應(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 運(yùn)行head插件,如果運(yùn)行不成功建議重新安裝grunt。
「安裝完成:」
- 打開瀏覽器訪問:http://127.0.0.1:9100

「安裝lk分詞器:」
- ik分詞器ip:http://www.oschina.net/news/2660
- ElasticSearch默認(rèn)采用的分詞器,是單個(gè)字分詞,效果很差,所以我們需要安裝一個(gè)更實(shí)用的分詞器,這里采用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>
「編寫實(shí)體類,對(duì)應(yīng)ElasticSearch中的document:」
- // 表示此類對(duì)應(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;
「測(cè)試(前提ElasticSearch客戶端以及服務(wù)器全部安裝完備):」
- 1、測(cè)試類中對(duì)應(yīng)操作es的對(duì)象是ElasticsearchTemplate
- 使用詳見https://blog.csdn.net/chen_2890/article/details/83895646
- 2、工程化測(cè)試
- 2.1新建service以及serviceimpl
- 2.3聲明接口extends ElasticsearchRepository<User,Integer>,第一個(gè)參數(shù)表示實(shí)體類(document),第二個(gè)參數(shù)表示實(shí)體對(duì)象主鍵的包裝類
- 2.4新建controll
- 2.5啟動(dòng)服務(wù)器訪問地址
「ElasticSearch常見方法使用:」
- //根據(jù)價(jià)格區(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ù)會(huì)出更多關(guān)于ElasticSearch系列更多文章,謝謝大家支持!


2009-06-24 16:30:21




