大數據

企業搜索-Elastic Stack 實戰手冊

作者:朱永生

什麼是企業搜索

企業搜索,顧名思義,就是企業使用的搜索服務或者說是企業提供的搜索服務。具體可以是企業的客戶,使用企業提供的搜索服務,搜索企業提供的產品、服務等信;比如電商企業提供搜索服務供客戶搜索商品信息、應用市場提供搜素服務供用戶查找 APP 等;也可能是企業內部各個部門成員,使用企業內部的搜索服務,搜索企業內的各種信息,比如項目信息、代碼信息、文檔信息等等。

企業搜索的特點

企業搜索因為不同的使用場景,具有其自己的特點。相較於大家熟悉和常用的百度、谷歌等互聯網搜素,企業搜索有如下不同:

數據來源不同

眾所周知,百度、谷歌等互聯網搜索引擎,主要通過網絡爬蟲抓取互聯網上的數據;而企業搜索的數據主要來源於企業自身,由企業自己的數據源提供。

數據內容不同

互聯網搜索引擎抓取的數據,主要是各個網站公開的各種網頁、圖片、音頻、視頻、文檔等;而企業搜素處理的數據主要是企業內部提供的私有信息,如產品信息、項目信息、內部文檔、辦公軟件、郵件、數據庫等等。同時,企業搜索也可以包括公開的各種數據。

數據更新頻率不同

互聯網搜索抓取數據是爬蟲被動執行的,抓取到新的數據需要一定的時間,數據更新頻率由於各種因素存在不確定性,數據更新可能並不及時;而企業搜索的數據源是企業自主可控的,數據往往是企業主動生成的,數據更新基本是實時的。

數據完整性不同

互聯網搜索抓取數據,因為各種因素,比如網站列表無法做到完整、網站 Robots 禁止抓取、法律政策等,無法做到抓取和顯示所有數據,用戶搜索不到需要的數據是正常現象;而企業搜索的數據都是企業預先設定的,用戶搜索的結果應按照設計進行展現,搜索不到本該展示的數據是不可接受的。

面向的用戶和需求不同

互聯網搜索面向的是大眾普通用戶,搜素方式方法和搜索結果,一般都不會因個別用戶或部分用戶的需求而改變;企業搜索面向的是企業內部用戶或是企業某項業務的客戶,在搜索方式上要盡力貼近用戶習慣,在搜索結果上要足夠完整和準確,能確切表達業務訴求。

搜索結果的可控性不同

使用互聯網搜索的用戶,搜索出來的結果不會因用戶的不同而不同,搜索結果均以 PageRank 算法為基礎進行排序展示,所有用戶可搜到的結果基本是一致的;而企業搜索的結果需要根據用戶的權限進行控制,不同權限的用戶搜索到的結果是不同的,不該對用戶顯示的結果不能顯示;同時,企業搜索的結果需要能夠進行顯式控制,比如通過排序策略、權重策略等,甚至需要直接處理搜索結果從而控制搜索結果。

Elastic 企業搜索能力介紹

Elasticsearch 是基於 Apache Lucene 的分佈式搜索引擎,本身就具有全文檢索、多用戶、近實時,可用於搜索各種文檔的能力。而 Elastic 秉承讓產品更易於使用的理念,在 Elastic Stack 7.2 中引入了 Elastic App Search,在 Elastic Stack 7.7 中推出 Elastic Workspace Search 正式版,並將 Elastic App Search 、 Elastic Workspace Search,Site Search 打包成了單獨的解決方案,其名稱就叫 Elastic Enterprise Search,也就是 Elastic 企業搜索。App Search 、Workspace Search、Site Search 基本覆蓋了企業的所有搜索應用場景。

App Search 針對企業產品應用搜索場景,在 Elasticserach 強大的存儲和分析功能之上,提供經過優化的 API、直觀的儀表板、易用可調的相關控件以及可快速集成的客戶端。

App Search 系統架構圖

Workspace Search 針對企業內部辦公搜索場景,提供無縫連接辦公協作效率工具嚮導和 API,藉助 Elasticsearch 構建集中信息源,對分散在各個辦公軟件中的信息和文檔,設置自動同步並進行再組織和定製,解決團隊協同辦公過程中的信息孤島問題。常見的辦公軟件如Salesforce,Dropbox, Google docs, Sharepoint, Jira, Confluence 等都提供了友好的接入嚮導,當然也可以使用自定義源接入其他的系統。Workspace Search 可針對每名團隊成員進行權限控制、相關性配置、個性化結果定製等,在安全可控的範圍內,幫助團隊提高獲取信息的速度、完整性並提高信息利用率。

Workspace Search 自帶搜索界面展示圖

Site Search 的核心是網頁爬蟲,是一套幫助企業快速構建網站搜索功能的工具。只要輸入網址,爬蟲就可以自動採集內容並自行定期更新,也支持用戶手動對特定頁面或者整個網站重新索引。Site Search可以通過自動更正、雙連詞匹配、詞幹提取、同義詞等功能,提供複雜查詢的支撐;也可以通過直觀的界面快速調整頁面排名、增減權重和同義詞等。

雖然 App Search 、Workspace Search、Site Search 針對的應用場景有所不同,但都是企業搜索場景,並且相關支撐能力也是通用的或者類似的。下面我們就通過了解 Elastic Enterprise Search 解決方案來理解Elastic企業搜索能力。

快速部署能力

Elastic Enterprise Search 支持四種部署方式,分別是 Elastic 雲實例、Elastic 雲上 Kubernetes 集群部署、Linux/MacOS 包部署和 Docker 容器鏡像部署。四種部署方式都非常簡單快速,相對來說,Elastic 雲實例門檻最低而功能最豐富,支持14天免費試用,適合快速學習瞭解產品功能;而 Linux/MacOS 包部署相對複雜一些,適合熟悉操作系統和想了解安裝部署細節配置的用戶;如果不想使用雲服務也不想一步步下載和配置安裝包,那麼使用 Docker 部署是一個好的選擇。

統一認證能力

Elastic App Search 和 Elastic Workspace Search 支持標準的用戶名密碼模式、Elasticsearch 本地域模式和 Elasticsearch SAML 第三方統一認證模式進行登陸認證和角色授權。其中標準用戶名密碼模式,由管理員在 Elastic App Search 或 Elastic Workspace Search 的面板上對用戶進行管理;Elasticsearch 本地域模式 Elasticsearch Native Realm 由 Elasticsearch 直接管理和存儲用戶信息;Elasticsearch SAML 模式是 Elasticsearch 使用第三方統一認證進行用戶的登陸認證,而 Elastic App Search 和 Elastic Workspace Search 直接繼承了 Elasticearch 中的 SAML 配置。

角色授權能力

不管使用哪種登陸認證模式,Elastic 企業搜索均支持按角色授權,不過針對每種認證模式,授權的方式略有區別。在標準的用戶名密碼認證模式下,Elastic App Search 使用基於角色的訪問控制 (Role Based Access Control) 對用戶進行授權,可授權的角色有:Owner、Admin、Dev、Editor、Analyst 等;而 Elastic Workspace 是基於數據內容權限、用戶所在部門等因素對用戶進行分組,然後對分組進行授權,是基於用戶組的訪問控制對用戶進行授權。在 Elasticsearch Native Realm 和 Elasticsearch SAML 認證模式下,Elastic App Search 和 Elastic Workspace Search 都使用角色映射對用戶進行授權,先在 Elasticsearch 中創建角色,然後在 Elastic App Search 和 Elastic Workspace Search 中對 Elasticsearch 中創建的角色進行映射。Elastic App Search 中可映射的角色有:Owner、Admin、Dev、Editor、Analyst等,Elastic Workspace Search 中可映射的角色有:Admin、User。

支持不同級別的內容源

Workspace Search 可以採集各種來源的數據內容,支持使用自定義 API 接入,同時針對GitHub、Jira、Confluence、Google Driver、OneDriver、SharePoint Online、Gmail、Slack 等十幾種常見辦公應用,提供了方便進行接入的數據採集嚮導。另外,Workspace Search 支持 Organization Content Sources 組織內容源和 Private Content Sources 私有內容源,也支持 Standard Content Sources 標準內容源和 Standard Content Sources 遠程內容源。組織內容源一般由管理員配置,供整個組織使用;而私有內容源可由個別用戶自己配置並僅供自己使用。標準內容源中的所有源數據都將被進行採集並存儲;而遠程內容源僅採集部分信息,依賴數據源的搜索端點進行數據檢索。因為標準內容源採集的是全量數據,如果有多個用戶對同一個內容源建立了多個數據連接,那麼數據就會被採集並存儲多份,對 Elasticsearch 的存儲容量影響很大;而遠程數據源因為採集的數據非常少,在相同情況下,對 Elasticsearch 的影響非常小。當然,建立可檢索的遠程內容源有個前提條件,就是遠程內容源本身是有檢索端點的。

Site Search 的網頁爬蟲,只要輸入網址,爬蟲就可以自動採集內容並自行定期更新,並且支持用戶手動對特定頁面或者整個網站重新索引。

支持文檔級別權限

Workspace Search 支持啟用源文檔權限同步,支持的應用包括:Jira Cloud、Confluence Cloud、Google Driver、OneDriver、SharePoint Online 等。其他自定義接入的內容源也可以使用 _allow_permissions 和 _deny_permissions fields 字段來配置文檔級別權限。如下代碼為文檔配置權限:

{
   "_allow_permissions":[
      "permission1"
   ],
   "_deny_permissions":[
      
   ],
   "id":1235,
   "title":"The Meaning of Sleep",
   "body":"Rest, recharge, and connect to the Ether.",
   "url":"https://example.com",
   "created_at":"2019-06-01T12:00:00+00:00",
   "type":"list"
}

如下代碼為用戶分配權限:

curl -X POST \
http://localhost:3002/api/ws/v1/sources/[CONTENT_SOURCE_ID]/permissions/[USER_NAME] \
-H "Authorization: Bearer [ACCESS_TOKEN]" \
-H 'Content-Type: application/json' \
    -d '{
   "permissions":[
      "permission1"
   ]
}'

支持 Meta Engine

App Search 支持 Meta Engine。Meta Engine 本身不存儲文檔,是將多個源文檔引擎進行結合,讓用戶可以通過搜索單個元引擎,搜索到多個源文檔引擎中的內容。

支持自定義搜索體驗

在 Workspace Search 搜索欄中輸入關鍵字即可搜索,也可以將 Workspace Search 加入到瀏覽器搜索引擎中,用戶在瀏覽器地址欄輸入關鍵字即可搜索,搜索體驗就像在瀏覽器中使用 Google 或者百度一樣。

用戶很容易查看可搜索的內容源、最新內容,也可以按日期檢索內容。

用戶可以按自己的需求,在搜索時設置搜索字段、結果字段、字段權重、字段值權重、過濾、排序、分頁、構面、高亮顯示等。

如下代碼設置返回第一頁,每頁一條內容:

curl -X POST http://localhost:3002/api/ws/v1/search \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"query": "denali",
"page": {
"size": 1,
"current": 1
}
}'

如下代碼設置按 square_km 逆序,date_established 順序排序:

curl -X POST http://localhost:3002/api/ws/v1/search \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"query": "denali",
"sort": [
{ "square_km": "desc" },
{ "date_established": "asc" }
]
}'

如下代碼設置在字段 Title 和 Description 中搜素,Title 的權重為10:

curl -X POST http://localhost:3002/api/ws/v1/search \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"query": "denali",
"search_fields": {
"title": {
"weight": 10
},
"description": {}
}
}'

如下代碼根據字段 world_heritage_site 的值設置權重,當字段值為 true 時權重為 10:

curl -X GET 'https://[instance id].ent-search.[region].[provider].cloud.es.io/api/as/v1/engines/national-parks-demo/search' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer search-soaewu2ye6uc45dr8mcd54v8' \
-d '{
"query": "old growth",
"boosts": {
    "world_heritage_site": [
    {
        "type": "value",
        "value": "true",
        "operation": "multiply",
        "factor": 10
    }
    ]
}
}

App Search 支持對查詢進行加 tag 並按 tag 進行過濾查詢:

curl -X GET 'https://[instance id].ent-search.[region].[provider].cloud.es.io/api/as/v1/engines/national-parks-demo/search' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer search-soaewu2ye6uc45dr8mcd54v8' \
-d '{
"query": "everglade",
"analytics": {
    "tags": [
    "i-am-a-tag"
    ]
}
}'
curl -X GET 'https://[instance id].ent-search.[region].[provider].cloud.es.io/api/as/v1/engines/national-parks-demo/analytics/queries' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer private-namt1hkv7ttsawuo452sxi6s' \
-d '{
"filters": { "tag": "i-am-a-tag" }
}'

支持對查詢結果的控制

App Search 支持對查詢結果直接進行控制,如下圖,點擊星號或者直接拖動結果可重新對查詢結果進行排序,點擊眼睛圖標可隱藏查詢結果。當然,所有操作也都是可以使用 API 進行設定,詳情見 Curations API。

支持查詢優化

App Search 創建引擎時可選擇語言,App Search 會針對不同的語言自動進行優化,優化內容包括詞幹匹配、字符匹配、短語匹配、排版容忍度等。App Search 支持查詢關鍵字推薦/自動完成功能。當用戶輸入部分關鍵字時,App Search 可根據引擎中已有的數據,推薦關鍵詞,用戶通過選用更合適的關鍵字,獲取更精準的搜索結果。如下代碼根據文檔中 Title 和 States 字段內容提供 Car 關鍵詞的推薦關鍵詞:

curl -X POST 'https://[instance id].ent-search.[region].[provider].cloud.es.io/api/as/v1/engines/national-parks-demo/query_suggestion' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer search-7eud55t7ecdmqzcanjsc9cqu' \
-d '{
"query": "car",
"types": {
    "documents": {
        "fields": [
        "title",
        "states"
        ]
    }
},
"size": 3
}'

結果提供 3 個推薦關鍵詞為:carlsbad、carlsbad caverns、carolina

{
   "results":{
      "documents":[
         {
            "suggestion":"carlsbad"
         },
         {
            "suggestion":"carlsbad caverns"
         },
         {
            "suggestion":"carolina"
         }
      ]
   },
   "meta":{
      "request_id":"914f909793379ed5af9379b4401f19be"
   }
}

App Search 支持同義詞配置,可通過設置同義詞,使用同義詞查詢得到需要的結果。如下代碼將 summit、peak、cliff、moutain 設置為同義詞:

curl -X POST 'https://[instance id].ent-search.[region].[provider].cloud.es.io/api/as/v1/engines/national-parks-demo/synonyms' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer private-xxxxxxxxxxxxxxxxxxxx' \
-d '{
"synonyms": ["summit", "peak", "cliff", "mountain"]
}

Enterprise Search 支持記錄查詢分析日誌 API Log,方便對用戶搜索情況,如搜索結果、搜素性能、搜索異常等進行分析和優化,不斷改善用戶搜素體驗,形成正向反饋。

支持代碼集成

Enterprise Search 提供了 Enterprise Search Python Client 和 Enterprise Search Ruby Client,可比較方便的使用 Python 和 Ruby 代碼對 Enterprise Search 進行集成。

提供搜索框UI

Elastic 企業搜索提供了連接 App Search 的 React 用戶搜索交互界面,直接下載導入即可使用,省去了不少前端代碼工作量,對有搜索框需求,但無特別要求的前端應用來說也是一個不錯的選擇。Site Search則只需要用戶在自己的網站上實施幾行代碼即可添加好由 Elasticsearch 提供支持的搜索框。

總結

企業搜索的業務場景決定了企業搜索的特點和需求,Elastic 在 Elasticsearch 強大功能的基礎之上,構建了更加易用的企業搜索解決方案 Elastic Enterprise Search。Elastic Enterprise Search 針對企業搜索場景,提供了從自身部署到權限控制、從文檔接入到查詢優化、從前端 UI 到結果控制的全場景覆蓋的支持能力,雖然其相比自己構建一套企業搜索系統的門檻已非常低,易用性也非常好,但畢竟是一套接口完善、功能眾多、相對複雜的系統。以上內容僅簡單介紹其基本能力,如需將其應用於生產環境,還需結合實際業務需求,仔細閱讀相關文檔並進行深入研究和實踐。

注:本文中代碼片段及配圖來自 https://www.elastic.co/

參考文檔

  1. Enterprise Search Guide [7.12]:https://www.elastic.co/guide/en/enterprise-search/current/index.html
  2. Workplace Search Guide [7.12]:https://www.elastic.co/guide/en/workplace-search/current/index.html
  3. App Search Guide [7.12].:https://www.elastic.co/guide/en/app-search/current/index.html

Leave a Reply

Your email address will not be published. Required fields are marked *