· 更多精彩内容,请下载阅读全本《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/
参考文档
- Enterprise Search Guide [7.12]:https://www.elastic.co/guide/en/enterprise-search/current/index.html
- Workplace Search Guide [7.12]:https://www.elastic.co/guide/en/workplace-search/current/index.html
- App Search Guide [7.12].:https://www.elastic.co/guide/en/app-search/current/index.html
创作人简介:
朱永生,现任上海闪马智能科技有限公司运维总监,拥有超过十五年技术运维经验,曾
服务于多家上市公司和初创企业,负责网络游戏、广告、在线教育、金融科技等业务的
全线运维工作和运维团队,擅长数据库和运维系统架构优化、运维自动化平台建设及
DevOps 相关的文化理念流程和技术系统。
博客:https://blog.csdn.net/yongsheng0550