公號:碼農充電站pro
主頁:https://codeshellme.github.io
App Search 是 Elastic 家族中的一個產品,它可以幫助我們(基於 ES)快速高效的構建搜尋應用。
App Search 的官方文件可參考這裡。
1,安裝 App Search
首先確保當前機器已安裝 Java8 或 Java11 環境,並且需要有對應版本的 ElasticSearch。
1.1,下載 App Search 和 ES
在這裡下載 App Search,根據自己的系統,選擇相應的版本。
然後需要下載相應版本的 ES,我這裡下載的都是 Linux 7.10.2
版的壓縮包:
elasticsearch-7.10.2-linux-x86_64.tar.gz
enterprise-search-7.10.2.tar.gz
下載好之後將壓縮包解壓。
1.2,執行 ES
ES 要在安全模式執行,在 ES 的配置檔案 config/elasticsearch.yml
中加入下面兩行配置:
xpack.security.enabled: true
xpack.security.authc.api_key.enabled: true
使用下面命令執行 ES:
bin/elasticsearch
可以通過訪問地址 http://localhost:9200/
檢視 ES 是否啟動成功。
使用下面命令為 ES 的預設使用者生成隨機密碼:
bin/elasticsearch-setup-passwords auto
密碼如下(要記錄下來,以後需要使用):
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
中加入下面配置:
ent_search.auth.source: standard
elasticsearch.username: elastic
elasticsearch.password: 7RiVeroRF273yvqJdhlR
allow_es_settings_modification: true
注意 username
和 password
是在上面步驟生成的。
使用命令執行 App Search:
bin/enterprise-search
第一次會啟動失敗,並且輸出如下內容:
將 encryption_keys
寫入配置檔案 config/enterprise-search.yml
:
secret_management.encryption_keys: [34e51dd1111fbeeffce290bdf75755db90af3350849b4ded59fc46c3c97f2f13]
再次啟動 App Search,會輸出一對使用者名稱和密碼(只會輸出一次,注意記錄):
該使用者名稱密碼用於登入 App Search
:
username: enterprise_search
password: 6ucyhwfhsmx98miv
另外還會輸出 secret_session_key
:
需要將 secret_session_key
寫入配置檔案,然後再次重啟 App Search。
secret_session_key: 0af3170d00384c24fa61f3ac5a6561d251aecf7fef8194c3627613f0fcc8d4469531fc044de815a7b5e1ff47b737f69cf5a5d606d2d43e678a70a647f57b8f76
1.4,訪問 App Search
App Search 啟動成功後,會在 3002 埠監聽服務。
用瀏覽器訪問地址 http://localhost:3002/
,並使用上面步驟生成的使用者名稱和密碼登入系統:
到此為止,App Search 就可以使用了。
下面使用 App Search 構建一個電影搜尋應用。
2,準備電影資料
我在這裡準備了200 多條電影資料,每條電影資料包含多個欄位,比如:
{
"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 後會進入如下頁面:
App Search 中的專案叫做 Engine
,點選 Luanch App Search
,建立一個搜尋專案。
填寫引擎名稱和支援的語言,然後點選 Create Engine
,建立引擎:
訪問地址 http://localhost:3002/as#/engines/
可以看到所有的專案:
點選引擎名稱,可進入引擎的管理介面:
4,匯入電影資料
從上圖中可看到,匯入資料有三種方式:
- Paste JSON
- Upload a JSON file
- 使用 API 匯入資料
使用 API 匯入資料,需要用到祕鑰,可通過點選 Credentials
檢視祕鑰:
將 private-key
複製下來,用於寫入電影資料。
Bearer private-98q3arch6n9we5wm96tc9s3a
下面是使用 API 寫入資料的請求格式:
4.1,使用 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 資料。
6,改變欄位型別
通過 Schema
可以修改欄位的資料型別:
通過上圖可以看到,ES 預設將資料的所有欄位都處理成了 text 型別。
下面修改幾個欄位的資料型別:
修改欄位的資料型別會重建索引。
7,生成 UI 介面
點選 Reference UI
(基於search-ui ):
點選生成後,會跳轉到如下頁面:
如果覺得沒有問題,可下載 UI 壓縮包。
movies-db-react-demo-ui.zip
7.1,使用壓縮包
下載好壓縮包後,將其解壓。
使用 Reference UI
建立出來的介面是基於 nodejs 的,要保證其版本在 10 以上。
$ node -v
---------------
v12.16.3
使用如下命令安裝 UI:
npm install
啟動 UI:
npm start
啟動成功後,通過 3000 埠http://localhost:3000
訪問介面。
其它 UI 工具:
(本節完。)
推薦閱讀:
歡迎關注作者公眾號,獲取更多技術乾貨。