【AI大模型】Elasticsearch9 + 通义大模型实现语义检索操作详解

目录

一、前言

[二、Elasticsearch9 语义检索介绍](#二、Elasticsearch9 语义检索介绍)

[2.1 ES9 语义检索核心特性](#2.1 ES9 语义检索核心特性)

[2.2 semantic_text 字段类型说明](#2.2 semantic_text 字段类型说明)

[2.3 ES9 语义检索原理](#2.3 ES9 语义检索原理)

[2.4 ES9 语义检索优势与使用场景](#2.4 ES9 语义检索优势与使用场景)

[三、 Elasticsearch9 搭建过程](#三、 Elasticsearch9 搭建过程)

[3.1 环境说明](#3.1 环境说明)

[3.2 部署方式一](#3.2 部署方式一)

[3.2.1 创建docker网络](#3.2.1 创建docker网络)

[3.2.2 获取es9镜像](#3.2.2 获取es9镜像)

[3.2.3 启动 es容器](#3.2.3 启动 es容器)

[3.2.4 启动kibana容器](#3.2.4 启动kibana容器)

[3.2.5 创建es访问账户和密码](#3.2.5 创建es访问账户和密码)

[3.2.6 为kibana创建访问es 的token令牌](#3.2.6 为kibana创建访问es 的token令牌)

[3.2.6 生成访问kibana的验证码](#3.2.6 生成访问kibana的验证码)

[3.2.7 访问kibana](#3.2.7 访问kibana)

[3.3 部署方式二](#3.3 部署方式二)

[3.3.1 初次启动es容器](#3.3.1 初次启动es容器)

[3.3.2 拷贝容器内部的文件](#3.3.2 拷贝容器内部的文件)

[3.3.3 文件授权](#3.3.3 文件授权)

[3.3.4 移除镜像](#3.3.4 移除镜像)

[3.3.5 重启es容器](#3.3.5 重启es容器)

[3.3.6 修改es配置参数](#3.3.6 修改es配置参数)

[3.3.7 启动kibana容器](#3.3.7 启动kibana容器)

[3.3.8 拷贝容器内的文件](#3.3.8 拷贝容器内的文件)

[3.3.9 文件目录授权](#3.3.9 文件目录授权)

[3.3.10 创建kibana账户](#3.3.10 创建kibana账户)

[3.3.11 修改容器外挂载目录中的kibana.yml](#3.3.11 修改容器外挂载目录中的kibana.yml)

[3.3.12 重启kibana容器](#3.3.12 重启kibana容器)

[四、ES9 英文语义检索操作过程](#四、ES9 英文语义检索操作过程)

[4.1 英文语义检索操作案例](#4.1 英文语义检索操作案例)

[4.1.1 创建索引](#4.1.1 创建索引)

[4.1.2 索引添加数据](#4.1.2 索引添加数据)

[4.1.3 执行语义搜索](#4.1.3 执行语义搜索)

[五、ES9 中文语义检索操作过程](#五、ES9 中文语义检索操作过程)

[5.1 配置向量模型](#5.1 配置向量模型)

[5.1.1 获取向量模型和apikey](#5.1.1 获取向量模型和apikey)

[5.1.2 注册推理API访问入口](#5.1.2 注册推理API访问入口)

[5.2 创建索引并增加数据](#5.2 创建索引并增加数据)

[5.2.1 添加索引](#5.2.1 添加索引)

[5.2.2 增加几条数据](#5.2.2 增加几条数据)

[5.3 语义检索效果模拟](#5.3 语义检索效果模拟)

六、写在文末


一、前言

语义检索是指能够理解查询意图和文档含义的搜索技术,而不仅仅是关键词匹配。它通过自然语言处理(NLP)和机器学习技术理解查询和文档的语义上下文。ES9(Elasticsearch 9)是 Elasticsearch 搜索引擎的一个重要版本,它在语义检索(Semantic Search)方面引入了多项重要改进,使搜索更加智能化和语义化。本文将详细介绍 Elasticsearch 9 的语义检索特性、工作原理,并通过实际测试示例展示如何使用这些新功能。

二、Elasticsearch9 语义检索介绍

Elasticsearch 9.0 在语义搜索领域带来了重大升级,通过原生支持 semantic_text 字段类型、改进的查询方式以及与向量搜索的深度整合,为用户提供了更强大、更灵活的语义检索能力。

2.1 ES9 语义检索核心特性

ES9 语义检索具有如下核心特性:

  • 原生向量搜索支持

    • 内置向量数据库功能,无需额外插件

    • 支持高效的近似最近邻(ANN)搜索

    • 与传统的倒排索引无缝集成

  • 改进文本嵌入集成

    • 简化了嵌入模型(如BERT、GPT等)的集成流程

    • 支持实时嵌入计算和索引

    • 提供预训练模型的管理功能

  • 混合检索模式

    • 结合关键词搜索(BM25)和向量搜索的优势

    • 可配置的混合评分机制

    • 支持结果重排序(reranking)

  • 增强NLP处理

    • 内置更先进的文本分词和分析器

    • 改进的同义词和语义扩展功能

    • 更好的多语言支持

  • 查询方式扩展

    • 原生 semantic 查询:专为语义搜索设计的简洁查询语法

    • match 查询支持:现在 match 查询也可用于 semantic_text 字段,提供更熟悉的查询体验

    • knn 查询支持:可直接对 semantic_text 字段执行近似最近邻搜索

    • sparse_vector 查询:支持稀疏向量搜索技术

2.2 semantic_text 字段类型说明

ES 9 引入了 semantic_text 字段类型,这是一种专为语义搜索设计的字段类型,能够自动处理文本的向量化表示。与传统的 text 字段不同,semantic_text 字段在索引时会自动通过配置的推理模型将文本转换为向量表示,而无需用户手动处理向量转换过程。其关键优势如下:

  • 开箱即用:

    • 只需配置推理端点,无需手动管理向量转换过程
  • 透明处理:

    • 自动处理文本扩展和向量化,对用户完全透明
  • 混合搜索:

    • 可与传统关键词搜索(BM25)结合使用,提升搜索结果相关性

2.3 ES9 语义检索原理

ES9 语义搜索基于文本扩展(text expansion)技术,其核心工作流程如下:

  • 数据存储向量化:将写入索引的数据进行向量化存储

  • 查询扩展:将用户查询输入通过推理模型扩展为包含相关术语的扩展查询

  • 向量转换:将扩展后的查询转换为向量表示(密集或稀疏向量)

  • 相似度计算:计算查询向量与文档向量的相似度

  • 结果排序:根据相似度得分对结果进行排序

与传统基于关键词搜索相比,语义搜索能够理解查询的意图和上下文,而不仅是匹配字面词汇。例如,搜索"自新媒体运营"可以匹配到包含与新媒体语义相近的的文档,即使文档中没有出现新媒体这个词。

2.4 ES9 语义检索优势与使用场景

语义检索在实际应用中是独具优势的,具体来说:

  1. 更精准的搜索结果:理解用户查询的真实意图

  2. 自然语言查询:支持问答式搜索和复杂查询

  3. 推荐系统:基于内容相似性的推荐

  4. 跨语言搜索:不同语言间的语义匹配

ES9的语义检索功能特别适用于需要理解内容语义的场景,如知识库搜索、电子商务产品搜索、内容推荐系统等。结合大模型,可以让语义检索发挥更强的作用。

三、 Elasticsearch9 搭建过程

为了后面使用和验证Elasticsearch9的语义检索特性,需要搭建Es9,接下来介绍2种基于docker安装Elasticsearch9的方式。

3.1 环境说明

请提前准备下面的环境

  • 云服务器或虚拟机,至少2C4G;
  • docker环境,版本不要太低;

3.2 部署方式一

3.2.1 创建docker网络

使用下面的命令创建一个docker 网络

bash 复制代码
docker network create elastic

3.2.2 获取es9镜像

使用下面的命令拉取es9镜像

bash 复制代码
docker pull elasticsearch:9.0.1

3.2.3 启动 es容器

使用下面的命令启动一个es容器

  • 注意,如果你的服务器内存不足,建议启动容器的时候在参数中限制一下容器占用的内存大小
bash 复制代码
docker run -d \
--name es9 \
--network elastic \
-p 9200:9200 \
-p 9300:9300 \
--privileged \
-e "discovery.type=single-node" \
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
elasticsearch:9.0.1

容器启动成功后,使用docker ps 命令检查一下

3.2.4 启动kibana容器

为了后续操作es索引数据方便,这里使用es的可视化操作工具kibana,下面使用下面的命令启动kibana容器

bash 复制代码
docker run -d \
--name kibana_09 \
--network elastic \
-p 5601:5601 \
--privileged \
kibana:9.0.1

使用docker ps命令检查是否启动成功

3.2.5 创建es访问账户和密码

为了确保es的数据安全,默认情况下,es开启了数据安全访问测试,在yml配置文件中可以看到

使用下面的命令创建一个账户和密码,输入命令之后,在最后会随机生成一个密码,注意妥善保管

bash 复制代码
docker exec -it es9 /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic

3.2.6 为kibana创建访问es 的token令牌

还记得在使用kibana操作es的时候,在kibana中需要设置连接es的IP,端口等信息,在这里需要为kibana设置一个访问的token令牌,参考下面的命令

bash 复制代码
docker exec -it es9 /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana

执行之后稍等一会,就会生成一长串token字符串,后续在kibana访问的时候会用到,请注意妥善保管

3.2.6 生成访问kibana的验证码

这么做的目的还是为了访问数据的安全考虑,执行下面的命令,生成验证码

bash 复制代码
docker exec kibana_09 /usr/share/kibana/bin/kibana-verification-code

3.2.7 访问kibana

输入 IP:5601 ,访问kibana控制台

将前面生成的token粘贴到输入框,跳转到下面的界面后,再将生成的验证码输入进去

验证成功后,跳转到下面的页面进行初始化相关的设置

初始化完成后跳转到下面的登录界面,输入前面设置的账户和密码进行登录

登录成功后,就来到下面熟悉的界面了

点击左侧的Dev Tools菜单,就到了熟悉的界面,在这个界面就可以操作ES相关的命令了

3.3 部署方式二

下面介绍第二种部署方式

3.3.1 初次启动es容器

使用下面的命令启动容器

bash 复制代码
docker run -d \
--name es9 \
--network elastic \
-p 9200:9200 \
-p 9300:9300 \
--privileged \
-e "discovery.type=single-node" \
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
elasticsearch:9.0.1

3.3.2 拷贝容器内部的文件

将容器内部的文件拷贝出来后面使用

bash 复制代码
docker cp es9:/usr/share/elasticsearch/data  /usr/local/soft/es
docker cp es9:/usr/share/elasticsearch/plugins /usr/local/soft/es
docker cp es9:/usr/share/elasticsearch/config /usr/local/soft/es

3.3.3 文件授权

后续会用到

bash 复制代码
chmod 777 -R config/ data/ plugins/

3.3.4 移除镜像

使用下面的命令移除镜像

bash 复制代码
docker stop es9 && docker rm es9

3.3.5 重启es容器

执行下面的命令重启es

bash 复制代码
docker run -d \
--name es9 \
--network elastic \
-p 9200:9200 \
-p 9300:9300 \
--privileged \
-v /usr/local/soft/es/data:/usr/share/elasticsearch/data \
-v /usr/local/soft/es/plugins:/usr/share/elasticsearch/plugins \
-v /usr/local/soft/es/config:/usr/share/elasticsearch/config \
-e "discovery.type=single-node" \
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
elasticsearch:9.0.1

3.3.6 修改es配置参数

在挂载目录中修改yml配置,调整下面的参数,调整完毕后注意重启es容器

3.3.7 启动kibana容器

使用下面的命令启动kibana容器

bash 复制代码
docker run -d \
--name kibana \
--network elastic \
-p 5601:5601 \
--privileged \
-e ELASTICSEARCH_HOSTS=http://elasticsearch:9200 \
kibana:9.0.1

3.3.8 拷贝容器内的文件

将容器内的文件拷贝出来

3.3.9 文件目录授权

为确保后续访问权限,给文件做下授权

然后移除容器

bash 复制代码
docker stop kibana && docker rm kibana

3.3.10 创建kibana账户

创建为kibana创建新账户,用于访问elasticsearch,容器内 /usr/share/elasticsearch/bin 目录下

对账户授权(123456)

3.3.11 修改容器外挂载目录中的kibana.yml

在yml中新增下面的配置

bash 复制代码
xpack.screenshotting.browser.chromium.disableSandbox: true
elasticsearch.username: admin
elasticsearch.password: 123456

3.3.12 重启kibana容器

使用下面的命令重启容器

bash 复制代码
docker run -d \
--name kibana \
--network elastic \
-p 5601:5601 \
--privileged \
-v /usr/local/soft/kibana/data:/usr/share/kibana/data \
-v /usr/local/soft/kibana/config:/usr/share/kibana/config \
-e ELASTICSEARCH_HOSTS=http://elasticsearch:9200 \
kibana:9.0.1

四、ES9 英文语义检索操作过程

Elasticsearch 提供了开箱即用的 ELSER(Elastic Learned Sparse Encoder)模型,适合英文语义搜索。对于中文,可以使用阿里云的稀疏向量模型。

4.1 英文语义检索操作案例

4.1.1 创建索引

执行下面的命令创建一个索引

java 复制代码
PUT index-songs-semantic
{
  "mappings": {
    "properties": {
      "song_title": {
        "type": "text"
      },
      "artist": {
        "type": "keyword"
      },
      "lyric": {
        "type": "semantic_text",
        "inference_id": ".multilingual-e5-small-elasticsearch" 
      }
    }
  }
}

看到右侧的执行成功说明索引已创建

如果后续待检索的文档中有中文,可以使用阿里云的大模型,参考下面的命令设置

  • 需要提前配置好与阿里云向量模型的授权,后文中会有说明
bash 复制代码
PUT alibaba_sparse
{
  "mappings": {
    "properties": {
      "content": {
        "type": "semantic_text",
        "inference_id": "alibabacloud_ai_search_sparse"
      }
    }
  }
}

4.1.2 索引添加数据

为上述创建的索引增加几条数据

bash 复制代码
POST index-songs-semantic/_doc/1
{
  "song_title": "...Baby One More Time",
  "artist": "Britney Spears",
  "lyric": "When I'm with you, I lose my mind, give me a sign"
}

POST index-songs-semantic/_doc/2
{
  "song_title": "Crazy",
  "artist": "Britney Spears",
  "lyric": "You drive me crazy, I just can't sleep, I'm so excited, I'm in too deep"
}

POST index-songs-semantic/_doc/3
{
  "song_title": "We wil rock you",
  "artist": "Britney Spears",
  "lyric": "Shouting in the street, gonna take on the world someday"
}

依次点击将3条数据添加进去

注意,如果在为索引添加数据过程中出现403的license错误,请执行下面的命令

bash 复制代码
POST /_license/start_trial?acknowledge=true

请注意,acknowledge=true 参数是必需的,因为它确认了你理解此许可证将在30天后到期。此外,每个主要版本只能激活一次试用期。如果您的集群已经激活过试用期,则需要等到新的主要版本发布或者通过官方渠道申请延长试用期。

4.1.3 执行语义搜索

使用 semantic 查询:

  • 简单来说,语义搜索就是,你输入一个与文档中的意思差不多的文本,能够给你搜索出来
bash 复制代码
GET index-songs-semantic/_search
{
  "query": {
    "semantic": {
      "field": "lyric",
      "query": "song lyrics about love"
    }
  }
}

使用上面的语句在kibana中执行,可以看到,能够按照评分高低将符合条件的文档检索出来

match 查询(9.0新特性):

  • 简单来说,使用es9的语义检索功能,像之前那样使用es的查询语法即可

五、ES9 中文语义检索操作过程

接下来通过案例操作演示下ES9的中文语义检索完整的操作过程。

5.1 配置向量模型

在文章开头谈到ES9的语义检索原理时,其中一个非常重要的点就是数据存储在es的时候,其内部有一个数据向量化的过程,即向量化后的数据才能在后续的检索中,借助语义检索查出来,因此在这里,我们先选择阿里云的文本向量大模型,结合es9一起来完成对于中文语义检索的过程。

5.1.1 获取向量模型和apikey

进入阿里云平台获取文本向量模型,并获取apikey,平台访问入口:智能开放搜索 OpenSearch 控制台

1)找到文本向量模型

如下,在服务广场找到下面的文本向量化模型,后续将会使用这个模型

点击查看详情,可以看到里面提供针对实际业务中多种场景下的具体服务信息,在后文的配置中使用哪一个,只需要拷贝对应的服务ID即可。

2)创建apikey

初次进来需要手动创建一个apikey

5.1.2 注册推理API访问入口

如何才能让后续写入es的索引数据与AI大模型进行联动呢?首先需要通过es的API进行服务注册,即打通ES与AI大模型交互,在kibana中执行下面的命令

bash 复制代码
PUT _inference/text_embedding/text_embedding_v1
{
        "service":"alibabacloud-ai-search",
        "service_settings":{
                "api_key":"你的apikey",
                "service_id":"ops-text-embedding-001",
                "host":"default-8xf9.platform-cn-shanghai.opensearch.aliyuncs.com",
                "workspace":"default"
        }
}

看到下面的界面创建成功

5.2 创建索引并增加数据

5.2.1 添加索引

使用下面的语句创建一个索引

bash 复制代码
PUT poetry
{
  "mappings": {
    "properties": {
      "author": {
        "type": "keyword"
      },
      "title": {
        "type": "text"
      },
      "content": {
        "type": "semantic_text",
        "inference_id": "text_embedding_v1" 
      }
    }
  }
}

5.2.2 增加几条数据

使用下面的语句增加几条数据

bash 复制代码
POST poetry/_doc/1
{
  "author": "杜甫",
  "title": "春望",
  "content": "国破山河在,城春草木深。感时花溅泪,恨别鸟惊心。"
}

POST poetry/_doc/2
{
  "author": "李白",
  "title": "静夜思",
  "content": "床前明月光,疑是地上霜。举头望明月,低头思故乡。"
}

POST poetry/_doc/3
{
  "author": "王维",
  "title": "相思",
  "content": "红豆生南国,春来发几枝。愿君多采撷,此物最相思。"
}

es的语义检索在数据进行存储的时候,看到的是为索引增加了一些数据,其实底层还增加了数据向量化的操作过程

5.3 语义检索效果模拟

通过上一步操作之后,数据不仅存储到索引,而且也被向量化了,实际在进行检索的时候,仍然是使用es常规的检索语法即可,首先进行正常的检索,我们使用关键字检索

bash 复制代码
GET poetry/_search
{
  "query": {
    "match": {
      "content": "明月光"
    }
  }
}

通过检索的结果,可以看到能够按照预期将相似度最高的排在最前面

然后在使用下面的语句,这一句是根据文档中的第一条数据推断出来的近似语句

  • 细心的同学可以发现,这里直接使用了es大家熟悉的match语法
bash 复制代码
GET poetry/_search
{
  "query": {
    "match": {
      "content": "描述家国大义诗句有哪些"
    }
  }
}

点击查询之后,神奇的现象出现了,能够正确的将语义最相似的第一条诗句返回

更近一步,使用es进行多条件查询时候,语义检索仍然有效,比如在下面的组合条件查询中,我们限定了两个条件,通过查询结果来看,语义检索仍然可以得到正确的返回结果

bash 复制代码
POST poetry/_search
{
  "size": 20,
  "query": {
    "bool": {
        "must": [
          {
            "match": {
              "content": {
                "query":"查找与思乡相关的诗句"
              }
            }
          },
          {
            "term": {
              "author": {
                "value": "李白"
              }
            }
          }
        ]
    }
  }
}

检索结果如下

六、写在文末

本文通过较大的篇幅详细介绍了es9的语义检索功能,搭配向量大模型,可以在实际业务中发挥很重要的作用,有兴趣的同学可以基于此继续深入研究,本篇到此结束,感谢观看。