Elasticsearch:构建 AI 驱动的搜索体验

Elasticsearch 介绍

当你开始使用 Elastic 时,你将使用 Elasticsearch Relevance Engine™(ESRE),它专为 AI 搜索应用程序提供支持。借助 ESRE,你可以利用一整套开发者工具,包括 Elastic 的文本搜索、向量数据库以及我们专有的用于语义搜索的 Transformer 模型。

Elastic 提供多种搜索技术,首先是 BM25,它是行业标准的文本搜索方法。BM25 可精准匹配特定搜索,找到精确的关键词,并且可以通过调优提升效果。

在开始向量搜索时,需要了解向量搜索有两种形式:“dense - 密集”(即 kNN 向量搜索)和 “sparse - 稀疏”。

Elastic 还提供开箱即用的 Learned Sparse Encoder 模型,用于语义搜索。该模型在多个数据集(如金融数据、天气记录、问答对等)上的表现优异。该模型无需额外的微调,即可在各个领域提供高相关性的搜索结果。

查看这个交互式演示,看看当 Elastic 的 Learned Sparse Encoder 模型与 Elastic 的 BM25 文字搜索算法对比时,搜索结果如何变得更加相关。

此外,Elastic 还支持密集向量,以实现对文本之外的非结构化数据(如视频、图像和音频)的相似性搜索。

语义搜索和向量搜索的优势在于,它们允许用户使用直观的语言进行搜索查询。例如,如果你想查找关于第二收入的职场指南,你可以搜索 “side hustle”(side hustle),即使这一术语在正式的 HR 文件中并不常见。

在本指南中,我们将演示如何创建 Elasticsearch,使用 Elastic 网页爬虫摄取数据,并通过简单几步实现语义搜索。

安装

Elasticsearch 及 Kibana

我们首先需要安装 Elasticsearch 及 Kibana。我们可以参考如下的文章来进行安装:

  • 如何在 Linux,MacOS 及 Windows 上进行安装 Elasticsearch

  • Kibana:如何在 Linux,MacOS 及 Windows 上安装 Elastic 栈中的 Kibana

当我们安装的时候,选择 Elastic Stack 8.x 的文章来进行安装。在本展示中,我们将使用 Elastic Stack 8.17.2 来进行展示。当我们首次运行 Elasticsearch 时,我们可以看到如下的界面:

请记下上面的 elastic 超级用户的密码,以备在下面进行使用。你还需要记下上面的 fingerprint 的值,以配置下面的 crawler。如果不记得上面的画面,那么你可以在 Kibana 的配置文件 config/kibana.yml 文件中找到。

启动白金试用

创建 API key

我们可以按照如下的步骤来创建一个 API key 供下面的步骤来进行使用:

我们可以拷贝上面的 API key 以供下面的配置进行使用:

安装 ELSER 模型

如果你还没有下载 ELSER 模型的话,请参考文章 “Elasticsearch:部署 ELSER - Elastic Learned Sparse EncoderR” 来进行安装。安装完毕后,我们可以看到如下的画面:

如上所示,我们已经成功地安装了 .elser_model_2 模型。

创建 ELSER 端点

我们使用如下的命令来创建一个叫做 my-elser-model 的端点:

PUT _inference/sparse_embedding/my-elser-model
{"service": "elasticsearch","service_settings": {"adaptive_allocations": { "enabled": true,"min_number_of_allocations": 1,"max_number_of_allocations": 10},"num_threads": 1,"model_id": ".elser_model_2" }
}

这个端点在下面的配置中进行使用。

创建 Elasticsearch 索引

我们首先打开 Kibana,并创建一个叫做 elasticsearch-labs-blog 的索引:

上面表明我们已经成功地创建了一个叫做 elasticsearch-labs-blog 的索引。

我们可以通过 Kibana Dev Toosl 来进行检查:

接下来,添加一个 Semantic Text 类型的字段,我们给它取个非常有创意的名字:semantic_text

我们同样来通过 Dev Tools 来进行查看:

我们可以看到上面有一个已经生成的 semantic_text 的字段。

写入数据

配置 Elastic Open Web Crawler

你需要 Docker 来使用 Open Web Crawler

下面是一个简单的配置文件,它指示爬虫读取 Elasticsearch Labs 博客,并将数据写入 elasticsearch-labs-blog 索引,使用 elasticsearch.host 作为主机,并通过 elasticsearch.api_key 进行身份验证。

将以下内容复制到一个文件中,并将其命名为 crawler-config-blog.yml,然后根据需要更改 hostapi_key

$ cd demos/
$ ls
azure         deepseek      vector_search
$ mkdir -p crawler-elser/config
$ cd crawler-elser/config
$ vi crawler-config-blog.yml

crawler-config-blog.yml

domains:- url: https://www.elastic.coseed_urls:- https://www.elastic.co/search-labs/blogcrawl_rules:- policy: allowtype: beginspattern: /search-labs/blog- policy: denytype: regexpattern: .*output_sink: elasticsearch
output_index: elasticsearch-labs-blog elasticsearch:host: https://192.168.101.142port: 9200api_key: MjhVbXhwVUJDMkt6RFJJSTJ1RlM6eGFZZ2dpX3pTMTJZNXRJVnJCazljZw==ca_fingerprint: 1deb6039c6b542724612dd267f6f1bc53f40add6350ca865a9948cc977eee545bulk_api.max_items: 5pipeline_enabled: false

:你需要根据自己的配置修改上面的 api_key 及 elasticsearch.ca_fingerprint 值。我们可以参考链接来进行配置。你可以使用 ifconfig 来获取当前电脑上的私有 IP 地址。

现在创建一个 docker-compose.yml 文件。

docker-compose.yml

services:crawler:image: docker.elastic.co/integrations/crawler:latestvolumes:- ./config:/app/configstdin_open: truetty: true
$ pwd
/Users/liuxg/demos/crawler-elser
$ tree -L 2
.
├── config
│   └── crawler-config-blog.yml
└── docker-compose.yml

并使用以下命令启动服务:

docker-compose up -d

我们使用如下的命令来进行查看:

docker ps
$ docker ps
CONTAINER ID   IMAGE                                           COMMAND       CREATED              STATUS              PORTS     NAMES
a061113bb26f   docker.elastic.co/integrations/crawler:latest   "/bin/bash"   About a minute ago   Up About a minute             crawler-elser-crawler-1

现在你准备好开始爬取过程了:

docker-compose exec -it crawler bin/crawler crawl /app/config/crawler-config-blog.yml

几分钟后,你应该已经将整个 Elasticsearch labs 博客索引完成。

我们通过如下的命令来进行查看:

GET elasticsearch-labs-blog/_search

另外一种运行 crawler 的方式是通过阅读文章 “Elasticsearch:使用 Open Crawler 和 semantic text 进行语义搜索”。

发生了什么?

博客内容被索引到 body 字段,然后这些内容被转换为语义文本字段中的稀疏向量。这个转换包括两个主要步骤。首先,内容被划分成较小的、可管理的块,以确保文本被拆分成有意义的片段,这样可以更有效地处理和搜索。接下来,每个文本块使用文本扩展技术被转换成稀疏向量表示。这个步骤利用 ELSER(Elastic Search Engine for Relevance)将文本转换成捕捉语义含义的格式,从而实现更准确和相关的搜索结果。

通过将文本字段和 semantic_text 字段都索引到 Elasticsearch,这个过程结合了传统的关键词搜索和先进的语义搜索的优势。这个混合搜索提供了全面的搜索功能,确保用户可以基于原始文本和其潜在意义找到相关信息。

使用 Elasticsearch 来进行搜索

测试搜索查询 现在是时候搜索你想要的信息了。如果你是一个实现搜索的开发者(例如,为你的网页应用程序实现搜索),你应该使用 Console/Dev Tools 来测试和优化你索引数据的搜索结果。

我们从一个简单的 multi_match 查询开始,它将匹配 “title” 和 “body” 字段中的文本。由于这是一个经典的词汇搜索(还不是语义搜索),像 “how to implement multilingual search”这样的查询将匹配你提供的单词。

GET elasticsearch-labs-blog/_search
{"_source": ["title"],"query": {"multi_match": {"query": "how to implement multilingual search","fields": ["title","body"]}}
}
  "hits": {"total": {"value": 243,"relation": "eq"},"max_score": 10.187533,"hits": [{"_index": "elasticsearch-labs-blog","_id": "9d9385fd1d6e37586d1d05e08197a3e52d7e211d","_score": 10.187533,"_source": {"title": "How to implement image similarity search in Elasticsearch - Elasticsearch Labs"}},{"_index": "elasticsearch-labs-blog","_id": "9a81a1b071b31132ef425b81ac77682854397aa5","_score": 5.8747864,"_source": {"title": "Scalar quantization optimized for vector databases - Elasticsearch Labs"}},{"_index": "elasticsearch-labs-blog","_id": "8f2c911f8b9eb1301887e4a64d47e889d195d81d","_score": 5.803198,"_source": {"title": "Multilingual vector search with the E5 embedding model - Elasticsearch Labs"}},{"_index": "elasticsearch-labs-blog","_id": "787f3c1fe1192f92b6cd656c45afeb3b73dbcad0","_score": 5.469969,"_source": {"title": "Evaluating scalar quantization in Elasticsearch - Elasticsearch Labs"}},{"_index": "elasticsearch-labs-blog","_id": "cad40b1b9a5e3d410cc3193ab61c6303e6ff79c6","_score": 5.3935347,"_source": {"title": "Elasticsearch Open Inference API adds support for Jina AI Embeddings and Rerank Model - Elasticsearch Labs"}},{"_index": "elasticsearch-labs-blog","_id": "bba02bb478a478ebe0adddc748693307a64fd709","_score": 5.39243,"_source": {"title": "Building multilingual RAG with Elastic and Mistral - Elasticsearch Labs"}},

在这种情况下,前 5 个匹配结果还不错,但并不完美。

How to implement image similarity search in Elasticsearch - Elasticsearch Labs
Scalar quantization optimized for vector databases - Elasticsearch Labs
Multilingual vector search with the E5 embedding model - Elasticsearch Labs
Evaluating scalar quantization in Elasticsearch - Elasticsearch Labs
Elasticsearch Open Inference API adds support for Jina AI Embeddings and Rerank Model - Elasticsearch Labs

现在尝试使用语义查询,它会自动将文本 “how to implement multilingual search?” 转换为向量表示,并对 semantic_text 字段执行查询。

GET elasticsearch-labs-blog/_search
{"_source": ["title"],"query": {"semantic": {"field": "semantic_text","query": "how to implement multilingual search?"}}
}
 "hits": {"total": {"value": 243,"relation": "eq"},"max_score": 23.57368,"hits": [{"_index": "elasticsearch-labs-blog","_id": "8f2c911f8b9eb1301887e4a64d47e889d195d81d","_score": 23.57368,"_source": {"title": "Multilingual vector search with the E5 embedding model - Elasticsearch Labs"}},{"_index": "elasticsearch-labs-blog","_id": "bba02bb478a478ebe0adddc748693307a64fd709","_score": 22.532505,"_source": {"title": "Building multilingual RAG with Elastic and Mistral - Elasticsearch Labs"}},{"_index": "elasticsearch-labs-blog","_id": "9621418190a5fe3a472fbaa228676560d034566e","_score": 22.302826,"_ignored": ["meta_description.keyword"],"_source": {"title": "How to search languages with compound words - Elasticsearch Labs"}},{"_index": "elasticsearch-labs-blog","_id": "7a1464445379516bf694c5677b2835c96a1c13a6","_score": 21.983751,"_source": {"title": "Dataset translation with LangChain, Python & Vector Database for multilingual insights - Elasticsearch Labs"}},{"_index": "elasticsearch-labs-blog","_id": "626be320dfa0b30e915b59ce7355002692c54599","_score": 20.928116,"_source": {"title": "Agentic RAG with Elasticsearch & Langchain - Elasticsearch Labs"}},{"_index": "elasticsearch-labs-blog","_id": "9a81a1b071b31132ef425b81ac77682854397aa5","_score": 20.376408,"_source": {"title": "Scalar quantization optimized for vector databases - Elasticsearch Labs"}},

你从这个语义搜索中得到的前五个结果看起来好多了。

Multilingual vector search with the E5 embedding model - Elasticsearch Labs
Building multilingual RAG with Elastic and Mistral - Elasticsearch Labs
How to search languages with compound words - Elasticsearch Labs
Dataset translation with LangChain, Python & Vector Database for multilingual insights - Elasticsearch Labs
gentic RAG with Elasticsearch & Langchain - Elasticsearch Labs

为什么不同时使用两者呢?创建一个混合搜索查询

使用倒排排名融合(RRF)是混合检索系统中的一种技术,用于提高搜索结果的相关性。它将不同的检索方法(如词汇(传统)搜索和语义搜索)结合起来,以增强整体搜索性能。

通过利用 RRF,查询确保最终的文档列表是来自两种检索方法的最佳结果的平衡组合,从而提高搜索结果的整体相关性和多样性。这种融合技术弥补了单一检索方法的局限性,提供了更全面、更准确的结果集。

GET elasticsearch-labs-blog/_search
{"_source": ["title"],"retriever": {"rrf": {"retrievers": [{"standard": {"query": {"multi_match": {"fields": ["title","body"],"query": "how to implement multilingual search"}}}},{"standard": {"query": {"semantic": {"field": "semantic_text","query": "how to implement multilingual search"}}}}]}}
}
  "hits": {"total": {"value": 243,"relation": "eq"},"max_score": 0.03226646,"hits": [{"_index": "elasticsearch-labs-blog","_id": "8f2c911f8b9eb1301887e4a64d47e889d195d81d","_score": 0.03226646,"_source": {"title": "Multilingual vector search with the E5 embedding model - Elasticsearch Labs"}},{"_index": "elasticsearch-labs-blog","_id": "9a81a1b071b31132ef425b81ac77682854397aa5","_score": 0.031513646,"_source": {"title": "Scalar quantization optimized for vector databases - Elasticsearch Labs"}},{"_index": "elasticsearch-labs-blog","_id": "bba02bb478a478ebe0adddc748693307a64fd709","_score": 0.031280547,"_source": {"title": "Building multilingual RAG with Elastic and Mistral - Elasticsearch Labs"}},{"_index": "elasticsearch-labs-blog","_id": "9621418190a5fe3a472fbaa228676560d034566e","_score": 0.03079839,"_ignored": ["meta_description.keyword"],"_source": {"title": "How to search languages with compound words - Elasticsearch Labs"}},{"_index": "elasticsearch-labs-blog","_id": "787f3c1fe1192f92b6cd656c45afeb3b73dbcad0","_score": 0.030330881,"_source": {"title": "Evaluating scalar quantization in Elasticsearch - Elasticsearch Labs"}},{"_index": "elasticsearch-labs-blog","_id": "cad40b1b9a5e3d410cc3193ab61c6303e6ff79c6","_score": 0.029877368,"_source": {"title": "Elasticsearch Open Inference API adds support for Jina AI Embeddings and Rerank Model - Elasticsearch Labs"}},{"_index": "elasticsearch-labs-blog","_id": "9d9385fd1d6e37586d1d05e08197a3e52d7e211d","_score": 0.016393442,"_source": {"title": "How to implement image similarity search in Elasticsearch - Elasticsearch Labs"}},

混合搜索的前5个结果包含了非常好的结果,所有结果都与如何使用 Elasticsearch 实现多语言搜索高度相关:

Multilingual vector search with the E5 embedding model - Elasticsearch Labs
Scalar quantization optimized for vector databases - Elasticsearch Labs
Building multilingual RAG with Elastic and Mistral - Elasticsearch Labs
How to search languages with compound words - Elasticsearch Labs
Evaluating scalar quantization in Elasticsearch - Elasticsearch Labs

下一步

感谢你花时间自建 Elasticsearch 并为你的数据设置语义搜索。在你开始使用 Elastic 的旅程时,了解一些你在跨环境部署时作为用户应该管理的操作、安保和数据组件。

准备好开始了吗?在 Elastic Cloud 上启动免费的 14 天试用,或尝试这 15 分钟的动手学习,了解搜索 AI 101。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/73309.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙生态开发

鸿蒙生态开发概述 鸿蒙生态是华为基于开源鸿蒙(OpenHarmony)构建的分布式操作系统生态,旨在通过开放共享的模式连接智能终端设备、操作系统和应用服务,覆盖消费电子、工业物联网、智能家居等多个领域。以下从定义与架构、核心技术…

JVM如何处理Java中的精度转换: 从源码到字节码

你好,我是 shengjk1,多年大厂经验,努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注!你会有如下收益: 了解大厂经验拥有和大厂相匹配的技术等 希望看什么,评论或者私信告诉我! 文章目录 一…

vue-next-admin修改配置指南

官方文档地址:vue-next-admin 1.如何开启侧边栏logo 在scr-layout-navbars-topBar-setings.vue中添加 getThemeConfig.value.isShowLogo true; 设置为true即可默认打开 2.修改侧边栏顶部的logo与文字 先把想要的图标存到我的项目然后下载 然后把后面的几个文件拉…

gin学习

gin学习笔记,不仅包含了基本的增删查改外,还包括参数传递,上传下载,模版、session与中间件等,方便收藏自习可用 文章目录 获得个请求get打印字符串get请求xmlget请求跳转http方法路由可以通过Context的Param方法来获取…

Flutter运行错误:UG! exception in phase ‘semantic analysis‘

最近在Mac Mini M4上通过Android Studio导入Flutter项目并运行,结果一直跑不起来,错误日志如下: 执行命令查看版本信息: flutter doctor --verbose通过输出信息Java version OpenJDK Runtime Environment (build 21.0.41242208…

【计算机网络运输层详解】

文章目录 一、前言二、运输层的功能1. 端到端通信2. 复用与分用3. 差错检测4. 流量控制5. 拥塞控制 三、运输层协议:TCP 和 UDP1. TCP:面向连接的可靠传输协议2. UDP:无连接的传输协议 四、端口号与进程通信1. 端口号分类2. 端口通信模型 五、…

51单片机和STM32 入门分析

51单片机和STM32是嵌入式开发中两种主流的微控制器,它们在架构、性能、应用场景等方面存在显著差异。以下是两者的对比分析及选择建议: 1. 51单片机与STM32的定义与特点 51单片机 定义:基于Intel 8051内核的8位微控制器,结构简单…

开源视觉语言模型MiniMax-VL-01:动态分辨率+4M超长文本,性能比肩GPT-4o

在人工智能领域,构建能够像人类一样理解、思考和行动的智能体(AI Agent)一直是研究人员的终极目标之一。而实现这一目标的关键在于模型是否具备足够强大的感知能力、记忆能力和推理能力。近期,国内人工智能公司MiniMax重磅开源了其…

excel 列单元格合并(合并列相同行)

代码 首先自定义注解CellMerge,用于标记哪些属性需要合并,哪个是主键**(这里做了一个优化,可以标记多个主键)** import org.dromara.common.excel.core.CellMergeStrategy;import java.lang.annotation.*;/*** excel…

flowable适配达梦7 (2.1)

经过第一版的问题解决,后端项目可以启动,前端页面也集成进去。 前端在流程设计页面报错 之后发现主要是组件中modelerStore这个值没有 解决方法:在data增加对象 给component/process/designer.vue 中涉及到的每个子组件传入 :modelerStore“modeler…

Prometheus Exporter系列-Mysql_Exporter一键部署

新项目旧项目都需要给研发配置mysql监控,这里mysql监控对应aws 阿里云 腾讯云 华为云的云mysql产品或开源自建mysql。 exporter安装虽然简单,经常手动操作不免让人心烦,一键完成省去繁琐的常规操作。 配置信息对的情况下测试多次都可以正常安…

2025年移动端开发性能优化实践与趋势分析

启动速度优化 本质:缩短首次可见帧渲染时间。 方法: iOS:利用Core ML本地模型轻量化部署,减少云端等待。Android:强制启用SplashScreen API,通过setKeepOnScreenCondition控制动画时长。冷启动需将耗时操…

【MySQL篇】DEPENDENT SUBQUERY(依赖性子查询)优化:从百秒到秒级响应的四种优化办法

💫《博主介绍》:✨又是一天没白过,我是奈斯,从事IT领域✨ 💫《擅长领域》:✌️擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控;并对SQLserver、NoSQL(…

全文 - MLIR Toy Tutorial Chapter 1: Toy Language and AST

Toy 语言 本教程,将会借助一个玩具语言来讲解,这个语言我们称其为 Toy。Toy 是一个基于张量的语言,它允许你定义函数,执行一些数学计算,并且打印结果。做这样的设定,是因为我们希望让教程保持简明&#xff…

排序复习_代码纯享

头文件 #pragma once #include<iostream> #include<vector> #include<utility> using std::vector; using std::cout; using std::cin; using std::endl; using std::swap;//插入排序 //1、直接插入排序&#xff08;稳定&#xff09; void InsertSort(vecto…

CSS语言的双向链表

CSS语言的双向链表 引言 在计算机科学中&#xff0c;数据结构是一个极为重要的概念&#xff0c;而链表则是最常见的数据结构之一。链表可以分为单向链表和双向链表&#xff0c;其中双向链表因其灵活性和高效性而受到广泛应用。在前端开发的领域&#xff0c;尤其是CSS&#xf…

简单理解机器学习中top_k、top_p、temperature三个参数的作用

AI系列文章&#xff1a; AWS AI认证考试中经常提及几个重要的工具介绍 简单理解机器学习中top_k、top_p、temperature三个参数的作用 用Deepseek Kimi 快速生成高质量的ppt 在机器学习中&#xff0c;top_k、top_p 和 temperature 是用于控制生成模型&#xff08;如语言模型…

红宝书第十三讲:详解JavaScript核心对象:Array、Object、Date、RegExp

红宝书第十三讲&#xff1a;详解JavaScript核心对象&#xff1a;Array、Object、Date、RegExp 资料取自《JavaScript高级程序设计&#xff08;第5版&#xff09;》。 查看总目录&#xff1a;红宝书学习大纲 一、Object&#xff1a;万物皆对象的“盒子” Object是JavaScript中…

昆仑技术重构AI大模型落地范式,长期作“加法”迎来国产生态化“拐点”

作者 | 曾响铃 文 | 响铃说 DeepSeek的爆火&#xff0c;在业内迅速掀起了一场国产化的变革。“国产大模型国产算力”软硬协同的范式正在被重构&#xff0c;AI产业国产化的含金量持续提升&#xff0c;越来越多的企业在这一趋势下加速走上数智化转型路径。 其中&#xff0c;以…

原开源鸿蒙仓库停止更新

2月24日&#xff0c;gitee 上的开源鸿蒙组织&#xff0c;所有代码停止更新&#xff0c;查看代码仓显示已关闭&#xff0c;不少小伙伴以为停止更新了&#xff0c;发生了什么&#xff1f; 原因很简单&#xff0c;所有代码仓迁移至 Gitcode&#xff0c;至于为什么改用 Gitcode&…