Elastic App Search 快速構建 ES 應用

碼農充電站 發表於 2021-03-04

公號:碼農充電站pro
主頁:https://codeshellme.github.io

App Search 是 Elastic 家族中的一個產品,它可以幫助我們(基於 ES)快速高效的構建搜尋應用。

在這裡插入圖片描述

App Search 的官方文件可參考這裡

首先確保當前機器已安裝 Java8Java11 環境,並且需要有對應版本的 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

在 App Search 的配置檔案 config/enterprise-search.yml 中加入下面配置:

ent_search.auth.source: standard
elasticsearch.username: elastic
elasticsearch.password: 7RiVeroRF273yvqJdhlR 
allow_es_settings_modification: true

注意 usernamepassword 是在上面步驟生成的。

使用命令執行 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

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_nameclassificationstitlewritersactors 都是用斜槓分割。

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 工具

(本節完。)


推薦閱讀:

ElasticSearch 中的 Mapping

ElasticSearch 資料建模

ElasticSearch 分散式叢集

ElasticSearch 叢集安全

ElasticSearch 叢集的規劃部署與運維


歡迎關注作者公眾號,獲取更多技術乾貨。

碼農充電站pro