1. 程式人生 > >Elastic App Search 快速構建 ES 應用

Elastic App Search 快速構建 ES 應用

> **公號:碼農充電站pro** > **主頁:** [App Search](https://www.elastic.co/cn/app-search/) 是 Elastic 家族中的一個產品,它可以幫助我們(基於 ES)快速高效的構建搜尋應用。 ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20210203153515918.png) **App Search** 的官方文件可參考[這裡](https://www.elastic.co/guide/en/app-search/current/index.html)。 ### 1,安裝 App Search 首先確保當前機器已安裝 **Java8** 或 **Java11** 環境,並且需要有對應版本的 **ElasticSearch**。 #### 1.1,下載 App Search 和 ES 在[這裡](https://www.elastic.co/cn/downloads/enterprise-search)下載 App Search,根據自己的系統,選擇相應的版本。 ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20210203160517406.png) 然後需要下載相應版本的 ES,我這裡下載的都是 `Linux 7.10.2` 版的壓縮包: ```shell elasticsearch-7.10.2-linux-x86_64.tar.gz enterprise-search-7.10.2.tar.gz ``` 下載好之後將壓縮包解壓。 #### 1.2,執行 ES ES 要在安全模式執行,在 ES 的配置檔案 `config/elasticsearch.yml` 中加入下面兩行配置: ```shell xpack.security.enabled: true xpack.security.authc.api_key.enabled: true ``` 使用下面命令執行 ES: ```shell bin/elasticsearch ``` 可以通過訪問地址 `http://localhost:9200/` 檢視 ES 是否啟動成功。 使用下面命令為 ES 的預設使用者生成隨機密碼: ```shell bin/elasticsearch-setup-passwords auto ``` 密碼如下(要記錄下來,以後需要使用): ```shell Changed password for user apm_system PASSWORD apm_system = XkF0dLKfcs3Yww4p4r3l Changed password for user kibana_system PASSWORD kibana_system = NqAuVK8UA21Iit7nzEpn Changed password for user kibana PASSWORD kibana = NqAuVK8UA21Iit7nzEpn Changed password for user logstash_system PASSWORD logstash_system = nq6hwgzGXwrwnrZPTW5a Changed password for user beats_system PASSWORD beats_system = BhT671Xf0PWGrbqly5R3 Changed password for user remote_monitoring_user PASSWORD remote_monitoring_user = SJ9j9KMZeT4WMQiOwLtG Changed password for user elastic PASSWORD elastic = 7RiVeroRF273yvqJdhlR ``` #### 1.3,執行 App Search 在 App Search 的配置檔案 `config/enterprise-search.yml` 中加入下面配置: ```shell ent_search.auth.source: standard elasticsearch.username: elastic elasticsearch.password: 7RiVeroRF273yvqJdhlR allow_es_settings_modification: true ``` 注意 `username` 和 `password` 是在上面步驟生成的。 使用命令執行 App Search: ```shell bin/enterprise-search ``` 第一次會啟動失敗,並且輸出如下內容: ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20210204101032183.png) 將 `encryption_keys` 寫入配置檔案 `config/enterprise-search.yml`: ```shell secret_management.encryption_keys: [34e51dd1111fbeeffce290bdf75755db90af3350849b4ded59fc46c3c97f2f13] ``` 再次啟動 App Search,會輸出一對使用者名稱和密碼(**只會輸出一次,注意記錄**): ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20210204101548251.png) 該使用者名稱密碼用於登入 `App Search`: ```shell username: enterprise_search password: 6ucyhwfhsmx98miv ``` 另外還會輸出 `secret_session_key`: ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20210204101901971.png) 需要將 `secret_session_key` 寫入配置檔案,然後**再次重啟** App Search。 ```shell secret_session_key: 0af3170d00384c24fa61f3ac5a6561d251aecf7fef8194c3627613f0fcc8d4469531fc044de815a7b5e1ff47b737f69cf5a5d606d2d43e678a70a647f57b8f76 ``` #### 1.4,訪問 App Search App Search 啟動成功後,會在 **3002** 埠監聽服務。 用瀏覽器訪問地址 `http://localhost:3002/`,並使用上面步驟生成的使用者名稱和密碼登入系統: ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20210203180417119.png) 到此為止,App Search 就可以使用了。 下面使用 App Search 構建一個**電影搜尋應用**。 ### 2,準備電影資料 我在[這裡](https://github.com/codeshellme/codeshellme.github.io/blob/master/somecode/es/movies.txt)準備了200 多條電影資料,每條電影資料包含多個欄位,比如: ```shell { "publish_time": "1994-09-10", "movie_time": "142", "other_name": "月黑高飛(港) / 刺激1995(臺) / 地獄諾言 / 鐵窗歲月 / 消香克的救贖", "year": "1994", "classifications": "劇情/犯罪", "score": "9.7", "language": "英語", "title": "肖申克的救贖 / The Shawshank Redemption / 月黑高飛(港) / 刺激1995(臺)", "introduction": "一場謀殺案使銀行家安迪(蒂姆•羅賓斯 Tim Robbins 飾)蒙冤入獄,謀殺妻子及其情人的指控將囚禁他終生。在肖申克監獄的首次現身就讓監獄“大哥”瑞德(摩根•弗里曼 Morgan Freeman 飾)對他另眼相看。瑞德幫助他搞到一把石錘和一幅女明星海報,兩人漸成患難 之交。很快,安迪在監獄裡大顯其才,擔當監獄圖書管理員,並利用自己的金融知識幫助監獄官避稅,引起了典獄長的注意,被招致麾下幫助典獄長洗黑錢。偶然一次,他得知一名新入獄的小偷能夠作證幫他洗脫謀殺罪。燃起一絲希望的安迪找到了典獄長,希望他能幫自己翻案。陰險偽善的獄長假裝答應安迪,背後卻派人殺死小偷,讓他唯一能合法出獄的希望泯滅。沮喪的安迪並沒有絕望,在一個電閃雷鳴的風雨夜,一場暗藏幾十年的越獄計劃讓他自我救贖,重獲自由!老朋友瑞德在他的鼓舞和幫助下,也勇敢地奔向自由。本片獲得1995年奧...", "country": "美國", "directors": "弗蘭克·德拉邦特", "writers": "弗蘭克·德拉邦特 / 斯蒂芬·金", "actors": "蒂姆·羅賓斯 / 摩根·弗里曼 / 鮑勃·岡頓 / 威廉姆·賽德勒 / 克蘭西·布朗 / 吉爾·貝羅斯 / 馬克·羅斯頓 / 詹姆斯·惠特摩 / 傑弗裡·德曼 / 拉里·布蘭登伯格 / 尼爾·吉恩託利 / 布賴恩·利比 / 大衛·普羅瓦爾 / 約瑟夫·勞格諾 / 祖德·塞克利拉 / 保羅·麥克蘭尼 / 芮妮·布萊恩 / 阿方索·弗里曼 / V·J·福斯特 / 弗蘭克·梅德拉諾 / 馬克·邁爾斯 / 尼爾·薩默斯 / 耐德·巴拉米 / 布賴恩·戴拉特 / 唐·麥克馬納斯", "img_url": "https://img2.doubanio.com/view/photo/s_ratio_poster/public/p480747492.webp" } ``` 每個欄位的含義如下: | 欄位名稱 | 含義 | 欄位名稱 | 含義 | |--|--|--|--| | publish_time | 釋出時間 | title | 電影名稱 | | movie_time | 電影時長 | introduction | 電影簡介 | | other_name | 電影別名 | country | 發行國家 | | year | 釋出年份 | directors | 導演 | | classifications | 電影分類 | writers | 編劇 | | score | 電影評分 | actors | 主演 | | language | 語言 | img_url | 封面地址 | 其中的欄位 `other_name`、`classifications`、`title`、`writers`、`actors` 都是用斜槓分割。 ### 3,建立 movies_db 專案 登入 App Search 後會進入如下頁面: ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20210222143135912.png) App Search 中的專案叫做 `Engine`,點選 `Luanch App Search`,建立一個搜尋專案。 填寫引擎名稱和支援的語言,然後點選 `Create Engine`,建立引擎: ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20210223164230217.png) 訪問地址 `http://localhost:3002/as#/engines/` 可以看到所有的專案: ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20210223164717209.png) 點選引擎名稱,可進入引擎的管理介面: ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20210223165443444.png) ### 4,匯入電影資料 從上圖中可看到,匯入資料有三種方式: - **Paste JSON** - **Upload a JSON file** - **使用 API 匯入資料** 使用 API 匯入資料,需要用到祕鑰,可通過點選 `Credentials` 檢視祕鑰: ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20210223170126824.png) 將 `private-key` 複製下來,用於寫入電影資料。 ```shell Bearer private-98q3arch6n9we5wm96tc9s3a ``` 下面是使用 API 寫入資料的請求格式: ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20210223170400466.png) #### 4.1,使用 Python 寫入資料 下面編寫 Python 程式碼寫入電影資料,程式碼如下: ```python #!/usr/bin/env python # coding=utf-8 import sys import json import requests reload(sys) sys.setdefaultencoding('utf-8') def read_file(file_name): f = open(file_name) lines = f.readlines() for line in lines: try: line = json.loads(line) except Exception, e: continue print 'movie_name:', line['title'] yield line def transform_data(data): other_name = data['other_name'] classifications = data['classifications'] title = data['title'] writers = data['writers'] actors = data['actors'] # 轉成陣列 other_name = [i.strip() for i in other_name.split('/')] classifications = [i.strip() for i in classifications.split('/')] title = [i.strip() for i in title.split('/')] writers = [i.strip() for i in writers.split('/')] actors = [i.strip() for i in actors.split('/')] data['other_name'] = other_name data['classifications'] = classifications data['title'] = title data['writers'] = writers data['actors'] = actors def import_doc(engine, authorization, doc): url = 'http://localhost:3002/api/as/v1/engines/%s/documents' % engine headers = { "content-type" : "application/json", "Authorization": authorization, } content=[doc] try: resp = requests.post(url, headers = headers, data = json.dumps(content)) print 'response:', resp except Exception, e: print e if __name__== "__main__": engine = 'movies-db' authorization = 'Bearer private-98q3arch6n9we5wm96tc9s3a' n = 0 for data in read_file('./movies.txt'): transform_data(data) import_doc(engine, authorization, data) n += 1 print 'count:', n ``` ### 5,管理資料 App Search 提供了一些功能,來幫助我們管理 ES 資料。 ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20210223175234210.png) ### 6,改變欄位型別 通過 `Schema` 可以修改欄位的資料型別: ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20210223181822832.png) 通過上圖可以看到,ES 預設將資料的所有欄位都處理成了 **text** 型別。 下面修改幾個欄位的資料型別: ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20210223183416546.png) 修改欄位的資料型別會**重建索引**。 ### 7,生成 UI 介面 點選 `Reference UI`(基於[search-ui](https://github.com/elastic/search-ui) ): ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20210223183855900.png) 點選生成後,會跳轉到如下頁面: ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20210223184622991.png) 如果覺得沒有問題,可下載 UI 壓縮包。 ```shell movies-db-react-demo-ui.zip ``` #### 7.1,使用壓縮包 下載好壓縮包後,將其解壓。 使用 `Reference UI` 創建出來的介面是基於 **nodejs** 的,要保證其版本在 10 以上。 ```shell $ node -v --------------- v12.16.3 ``` 使用如下命令安裝 UI: ```shell npm install ``` 啟動 UI: ```shell npm start ``` 啟動成功後,通過 3000 埠`http://localhost:3000` 訪問介面。 **其它 UI 工具**: - [Reactive Search](https://opensource.appbase.io/reactivesearch/) - 案例:[Airbeds](https://github.com/appbaseio-apps/airbeds) (本節完。) --- **推薦閱讀:** [ElasticSearch 中的 Mapping](https://www.cnblogs.com/codeshell/p/14445420.html) [ElasticSearch 資料建模](https://www.cnblogs.com/codeshell/p/14445450.html) [ElasticSearch 分散式叢集](https://www.cnblogs.com/codeshell/p/14462888.html) [ElasticSearch 叢集安全](https://www.cnblogs.com/codeshell/p/14467692.html) [ElasticSearch 叢集的規劃部署與運維](https://www.cnblogs.com/codeshell/p/14472651.html) --- *歡迎關注作者公眾號,獲取更多技術乾貨。* ![碼農充電站pro](https://img-blog.csdnimg.cn/20200505082843773.png?#pic_center)