Elasticsearch:相关性工作台 - BM25 及 ELSER 的相关性比较

我们知道 Elastics Learned Sparse EncoderR (ELSER) 可以被用来做语义搜索。它是一个 out-of-domain 的语义搜索模型。无需训练,我们就可以得到很好的相关性。有关 ELSER 的更多知识,请参考文章 "Elastic Learned Sparse Encoder 简介:Elastic 用于语义搜索的 AI 模型"。在传统的 BM25 搜索中,我们可以对所需要搜索的文字进行分词。它也可以得到很好的召回率。那么,他们在实际的使用中,有什么区别呢?在今天的文章中,我们将通过一个实际的例子来进行展示。我们针对同样一段文字,同时使用 BM25 及 ELSER 来对它们进行搜索,我们可以看看他们的相关性如何。

在本展示中,我们将使用最新的 Elastic Stack 8.11 来进行展示。你将需要部署 Elasticsearch (> 8.11) 并部署 ELSER 模型。

安装

安装 Elasticsearch 及 Kibana

如果你还没有安装好自己的 Elasticsearch 及 Kibana,那么请参考一下的文章来进行安装:

在安装的时候,请选择 Elastic Stack 8.x 进行安装

为了能够正确使用 ELSER,我们必须订阅白金版或试用:

部署 ELSER

我们可以参考文章 "Elasticsearch:部署 ELSER - Elastic Learned Sparse EncoderR" 来部署 ELSER。

我们可以参考文章 "Enterprise:使用 MySQL connector 同步 MySQL 数据到 Elasticsearch" 来安装 Enterprise Search。这里就不再累述了。

装载数据

最好的方法是使用企业搜索创建新索引并配置摄取管道以丰富数据。从 Kibana 的登录页面导航至 "Search"。

创建索引

在上面我们创建一个叫做 search-movies 的索引。

配置 ingest pipeline

在索引配置屏幕上,导航到 "Pipelines" 选项卡,然后单击 "Copy and customize"。

运行脚本来摄入数据

转到文件夹 data 并运行 python 脚本 index-data.py 以提取电影数据集。

为了将其连接到正确的 Elasticsearch 实例,我们需要需要把相应的 Elasticsearch 证书拷贝到当前的目录中。

bash 复制代码
1.  $ pwd
2.  /Users/liuxg/python/elasticsearch-labs/example-apps/relevance-workbench/data
3.  $ cp ~/elastic/elasticsearch-8.11.0/config/certs/http_ca.crt .
4.  $ ls
5.  http_ca.crt           movies-sample.json.gz requirements.txt
6.  index-data.py         movies.json.gz

我们按照如下的步骤来运行脚本:

markdown 复制代码
1.  python3 -m venv .venv
2.  source .venv/bin/activate
3.  pip install -r requirements.txt

接下来,我们使用如下的命令来写入数据:

csharp 复制代码
 python3 index-data.py --es_password=o6G_pvRL=8P*7on+o6XH --es_url=https://localhost:9200
kotlin 复制代码
1.  $ python3 index-data.py --es_password=o6G_pvRL=8P*7on+o6XH --es_url=https://localhost:9200
2.  Init Elasticsearch client
3.  {'name': 'liuxgm.local', 'cluster_name': 'elasticsearch', 'cluster_uuid': 'n1BjmRPcR2GObT6ZMbJ9xA', 'version': {'number': '8.11.0', 'build_flavor': 'default', 'build_type': 'tar', 'build_hash': 'd9ec3fa628c7b0ba3d25692e277ba26814820b20', 'build_date': '2023-11-04T10:04:57.184859352Z', 'build_snapshot': False, 'lucene_version': '9.8.0', 'minimum_wire_compatibility_version': '7.17.0', 'minimum_index_compatibility_version': '7.0.0'}, 'tagline': 'You Know, for Search'}
4.  Indexing movies data, this might take a while...
5.  100%|█████████████████████████████████████████████████████████████████████████████████████████████| 100/100 [00:12<00:00,  8.19documents/s, success=100]
6.  Indexing completed! Success percentage: 100.0%
7.  Done indexing movies data

你需要根据自己的 Elasticsearch 密码进行相应的修改。请注意,这里的密码默认的是超级用户 elastic 的密码。

请注意,默认情况下,仅对数据集的子集(100 部电影)建立索引。 如果你有兴趣对整个数据(7918 部电影)建立索引,可以通过在命令行中添加选项 --gzip_file=movies.json.gz 来选择 movie.json.gz 文件。 请注意,索引完整数据集可能需要长达 1 小时的时间。

等写入完数据,我们可以在 Kibana 中进行查看:

运行应用

一旦数据成功建立索引,你就可以运行应用程序来开始比较相关性模型。

该应用程序由后端 Python API 和 React 前端组成。 你可以使用 Docker compose 在本地运行整个应用程序。

编辑 docker-compose.yml 文件以替换其值。 重复使用用于加载数据的相同信息。

为了能够使得 docker 能够针对自签名的 Elasticsearch 部署起作用,我们把证书拷贝到当前的目录中:

bash 复制代码
1.  (.venv) $ pwd
2.  /Users/liuxg/python/elasticsearch-labs/example-apps/relevance-workbench
3.  (.venv) $ cp ~/elastic/elasticsearch-8.11.0/config/certs/http_ca.crt .
4.  (.venv) $ ls
5.  LICENSE            app-api            data               http_ca.crt
6.  README.md          app-ui             docker-compose.yml images

在运行之前,我们必须确认你的 elaser id:

它必须和 app-api/app.py 里的 model_id 是一致的:

然后,我们需要使用如下的命令来启动应用:

复制代码
docker-compose up

我们使用的 docker-compose.yml 文件如下:

docker-compose.yml

yaml 复制代码
1.  version: '3.7'

3.  services:
4.    api:
5.      build:
6.        context: ./app-api
7.        dockerfile: Dockerfile
8.      volumes:
9.        - './app-api:/usr/src/app'
10.        - './http_ca.crt:/usr/share/certs/http_ca.crt:ro'
11.      ports:
12.        - 8000:8000
13.      environment:
14.        - CLOUD_ID=<cloud_id>
15.        - ELASTICSEARCH_USERNAME=elastic
16.        - ELASTICSEARCH_PASSWORD=o6G_pvRL=8P*7on+o6XH
17.        - ELASTICSEARCH_URL=https://192.168.0.3:9200

19.    client:
20.      build:
21.        context: ./app-ui
22.        dockerfile: Dockerfile
23.      volumes:
24.        - './app-ui:/usr/src/app'
25.      ports:
26.        - 3000:3000
27.      environment:
28.        - NEXT_API_URL=http://host.docker.internal:8000
29.      depends_on:
30.        - api

在上面,你需要根据自己的 Elasticsearch 配置来修改上面的环境变量。你需要传入相应的证书信息。

我们可以在浏览器中输入地址 localhost:3000:

一旦应用成功启动,我们可以看到有两个容器正在运行中。如果你只看到其中的一个,则表明你的运行是有问题的:

markdown 复制代码
1.  $ docker ps
2.  CONTAINER ID   IMAGE                        COMMAND                  CREATED          STATUS          PORTS                    NAMES
3.  ffda44fa148b   relevance-workbench-client   "./entrypoint.sh yar..."   59 seconds ago   Up 59 seconds   0.0.0.0:3000->3000/tcp   relevance-workbench-client-1
4.  6970577e8278   relevance-workbench-api      "python3 -m flask ru..."   59 seconds ago   Up 59 seconds   0.0.0.0:8000->8000/tcp   relevance-workbench-api-1
5.  $ 

搜索一下

我们搜索一下 super hero:

我们再搜索一下 animated movies:

我们发现 ELSER 可以得到更加满意的语义搜索结果。

相关推荐
SelectDB技术团队34 分钟前
Agent Trace 数据底座建设:宽表建模、全文检索与成本聚合的配置与验证步骤
大数据·python·clickhouse·elk·elasticsearch·全文检索·复杂查询
Zhu75843 分钟前
快速测试-ZLMediaKit
大数据·elasticsearch·搜索引擎
Elastic 中国社区官方博客1 小时前
使用 NVIDIA cuVS 在 Elasticsearch 中实现 GPU 加速的向量索引:在 10 分钟内处理 1.38 亿个向量
大数据·数据库·elasticsearch·搜索引擎·全文检索·安全威胁分析
liuhl091014 小时前
【无标题】
大数据·elasticsearch·搜索引擎
xbgRS15 小时前
Elasticsearch的查询
elasticsearch
Elasticsearch19 小时前
使用 Lucene 搜索你的 Bean —— Highlighting
elasticsearch
Elasticsearch19 小时前
使用 Lucene 搜索你的 Bean —— Elasticsearch
elasticsearch
Elasticsearch1 天前
最好的 LLM 只有 59% 的时间能写出正确的 Elasticsearch ES|QL。以下是另外 41% 出错的原因
elasticsearch
垚垚学技术_聚焦云原生1 天前
Ansible Role 生产环境标准目录结构与规范化实践
java·elasticsearch·ansible
小林ixn1 天前
从 MySQL 的 LIKE 到 ES 倒排索引:一次把全文检索和混合检索讲透
sql·elasticsearch·全文检索·agent·关键词