Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【搜索引擎】Apache Solr 神经搜索

【搜索引擎】Apache Solr 神经搜索

作者头像
架构师研究会
发布于 2022-06-08 07:47:01
发布于 2022-06-08 07:47:01
1.1K00
代码可运行
举报
文章被收录于专栏:超级架构师超级架构师
运行总次数:0
代码可运行

Sease[1] 与 Alessandro Benedetti(Apache Lucene/Solr PMC 成员和提交者)和 Elia Porciani(Sease 研发软件工程师)共同为开源社区贡献了 Apache Solr 中神经搜索的第一个里程碑。

它依赖于 Apache Lucene 实现 [2] 进行 K-最近邻搜索。 特别感谢 Christine Poerschke、Cassandra Targett、Michael Gibney 和所有其他在贡献的最后阶段提供了很大帮助的审稿人。即使是一条评论也受到了高度赞赏,如果我们取得进展,总是要感谢社区。

让我们从简短的介绍开始,介绍神经方法如何改进搜索。

我们可以将搜索概括为四个主要领域:

  • 生成指定信息需求的查询表示
  • 生成捕获包含的信息的文档的表示
  • 匹配来自信息语料库的查询和文档表示
  • 为每个匹配的文档分配一个分数,以便根据结果中的相关性建立一个有意义的文档排名

神经搜索是神经信息检索[3] 学术领域的行业衍生产品,它专注于使用基于神经网络的技术改进这些领域中的任何一个。

人工智能、深度学习和向量表示

我们越来越频繁地听到人工智能(从现在开始是人工智能)如何渗透到我们生活的许多方面。

当我们谈论人工智能时,我们指的是一组使机器能够学习和显示与人类相似的智能的技术。

随着最近计算机能力的强劲和稳定发展,人工智能已经复苏,现在它被用于许多领域,包括软件工程和信息检索(管理搜索引擎和类似系统的科学)。

特别是,深度学习 [4] 的出现引入了使用深度神经网络来解决对经典算法非常具有挑战性的复杂问题。

就这篇博文而言,只要知道深度学习可用于在信息语料库中生成查询和文档的向量表示就足够了。

密集向量表示

可以认为传统的倒排索引将文本建模为“稀疏”向量,其中语料库中的每个词项对应一个向量维度。在这样的模型中(另见词袋方法),维数对应于术语字典基数,并且任何给定文档的向量大部分包含零(因此它被称为稀疏,因为只有少数术语存在于整个字典中将出现在任何给定的文档中)。

密集向量表示与基于术语的稀疏向量表示形成对比,因为它将近似语义意义提取为固定(和有限)数量的维度。

这种方法的维数通常远低于稀疏情况,并且任何给定文档的向量都是密集的,因为它的大部分维数都由非零值填充。

与稀疏方法(标记器用于直接从文本输入生成稀疏向量)相比,生成向量的任务必须在 Apache Solr 外部的应用程序逻辑中处理。

BERT[5] 等各种深度学习模型能够将文本信息编码为密集向量,用于密集检索策略。

有关更多信息,您可以参考我们的这篇博文。

近似最近邻

给定一个对信息需求进行建模的密集向量 v,提供密集向量检索的最简单方法是计算 v 与代表信息语料库中文档的每个向量 d 之间的距离(欧几里得、点积等)。

这种方法非常昂贵,因此目前正在积极研究许多近似策略。

近似最近邻搜索算法返回结果,其与查询向量的距离最多为从查询向量到其最近向量的距离的 c 倍。 这种方法的好处是,在大多数情况下,近似最近邻几乎与精确最近邻一样好。 特别是,如果距离测量准确地捕捉到用户质量的概念,那么距离的微小差异应该无关紧要[6]

分层导航小图

在 Apache Lucene 中实现并由 Apache Solr 使用的策略基于 Navigable Small-world 图。

它为高维向量提供了一种有效的近似最近邻搜索[7][8][9][10]。

Hierarchical Navigable Small World Graph (HNSW) 是一种基于邻近邻域图概念的方法: 与信息语料库相关联的向量空间中的每个向量都唯一地与一个

vertex

in the graph

.

顶点基于它们的接近度通过边缘连接,更近的(根据距离函数)连接。

构建图受超参数的影响,这些超参数调节每层要构建多少个连接以及要构建多少层。

在查询时,邻居结构被导航以找到离目标最近的向量,从种子节点开始,随着我们越来越接近目标而迭代。

我发现这个博客对于深入研究该主题非常有用。

Apache Lucene 实现

首先要注意的是当前的 Lucene 实现不是分层的。 所以图中只有一层,请参阅原始 Jira 问题中的最新评论,跟踪开发进度[11]。 主要原因是为了在 Apache Lucene 生态系统中为这种简化的实现找到更容易的设计、开发和集成过程。 一致认为,引入分层分层结构将在低维向量管理和查询时间(减少候选节点遍历)方面带来好处。 该实施正在进行中[12]。

那么,与 Navigable Small World Graph 和 K-Nearest Neighbors 功能相关的 Apache Lucene 组件有哪些? 让我们探索代码:

注:如果您对 Lucene 内部结构和编解码器不感兴趣,可以跳过这一段

org.apache.lucene.document.KnnVectorField 是入口点: 它在索引时需要向量维度和相似度函数(构建 NSW 图时使用的向量距离函数)。 这些是通过 #setVectorDimensionsAndSimilarityFunction 方法在 org.apache.lucene.document.FieldType 中设置的。

更新文档字段架构 org.apache.lucene.index.IndexingChain#updateDocFieldSchema 时,信息从 FieldType 中提取并保存在 org.apache.lucene.index.IndexingChain.FieldSchema 中。

并且从 FieldSchema KnnVectorField 配置最终到达 org.apache.lucene.index.IndexingChain#initializeFieldInfo 中的 org.apache.lucene.index.FieldInfo。

现在,Lucene 编解码器具有构建 NSW 图形所需的所有特定于字段的配置。 让我们看看如何:

首先,从 org.apache.lucene.codecs.lucene90.Lucene90Codec#Lucene90Codec 你可以看到 KNN 向量的默认格式是 org.apache.lucene.codecs.lucene90.Lucene90HnswVectorsFormat。

关联的索引编写器是 org.apache.lucene.codecs.lucene90.Lucene90HnswVectorsWriter。 该组件可以访问之前在将字段写入 org.apache.lucene.codecs.lucene90.Lucene90HnswVectorsWriter#writeField 中的索引时初始化的 FieldInfo。 在编写 KnnVectorField 时,涉及到 org.apache.lucene.util.hnsw.HnswGraphBuilder,最后是 org.apache.lucene.util.hnsw.HnswGraph 已构建。

Apache Solr 实现

可从 Apache Solr 9.0 获得

预计 2022 年第一季度

这第一个贡献允许索引单值密集向量场并使用近似距离函数搜索 K-最近邻。

当前特点:

  • DenseVectorField 类型
  • Knn 查询解析器

密集向量场(DenseVectorField)

密集向量字段提供了索引和搜索浮点元素的密集向量的可能性。

例如

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[1.0, 2.5, 3.7, 4.1]

以下是 DenseVectorField 应如何在模式中配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<fieldType name="knn_vector" class="solr.DenseVectorField" 
vectorDimension="4" similarityFunction="cosine"/>
<field name="vector" type="knn_vector" indexed="true" stored="true"/>

-----------------------------------------------------------------------------------------------------

|Parameter Name | Required | Default | Description |Accepted values|

----------------------------------------------------------------------------------------------------- |vectorDimension | True | |The dimension of the dense

vector to pass in. |Integer < = 1024|

————————————————————————————————————————— |similarityFunction | False | euclidean |Vector similarity function;

used in search to return top K most similar vectors to a target vector.

| euclidean, dot_product or cosine.

———————————————————————————————————————

  • 欧几里得:欧几里得距离
  • dot_product:点积。注意:这种相似性旨在作为执行余弦相似性的优化方式。为了使用它,所有向量必须是单位长度的,包括文档向量和查询向量。对非单位长度的向量使用点积可能会导致错误或搜索结果不佳。
  • 余弦:余弦相似度。注意:执行余弦相似度的首选方法是将所有向量归一化为单位长度,而不是使用 DOT_PRODUCT。只有在需要保留原始向量且无法提前对其进行归一化时,才应使用此函数。

DenseVectorField 支持属性:索引、存储。

注:目前不支持多值

自定义索引编解码器

要使用以下自定义编解码器格式的高级参数和 HNSW 算法的超参数,请确保在 solrconfig.xml 中设置此配置:

<codecFactory class="solr.SchemaCodecFactory"/> ... 以下是如何使用高级编解码器超参数配置 DenseVectorField: <fieldType name="knn_vector" class="solr.DenseVectorField" vectorDimension="4"similarityFunction="cosine" codecFormat="Lucene90HnswVectorsFormat" hnswMaxConnections="10" hnswBeamWidth="40"/> <field name="vector" type="knn_vector" indexed="true" stored="true"/>

Parameter Name

Required

Default

Description

Accepted values

codecFormat

False

Lucene90HnswVectorsFormat

Specifies the knn codec implementation to use

Lucene90HnswVectorsFormat

hnswMaxConnections

False

16

Lucene90HnswVectorsFormat only:Controls how many of the nearest neighbor candidates are connected to the new node.It has the same meaning as M from the paper[8].

Integer

hnswBeamWidth

False

100

Lucene90HnswVectorsFormat only: It is the number of nearest neighbor candidates to track while searching the graph for each newly inserted node.It has the same meaning as efConstruction from the paper[8].

Integer

请注意,codecFormat 接受的值可能会在未来版本中更改。

注意 Lucene 索引向后兼容仅支持默认编解码器。如果您选择在架构中自定义 codecFormat,升级到 Solr 的未来版本可能需要您切换回默认编解码器并优化索引以在升级之前将其重写为默认编解码器,或者重新构建整个索引升级后从头开始。 对于 HNSW 实现的超参数,详见[8]。

如何索引向量

下面是 DenseVectorField 应该如何被索引:

JSON

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[{ "id": "1",
"vector": [1.0, 2.5, 3.7, 4.1]
},
{ "id": "2",
"vector": [1.5, 5.5, 6.7, 65.1]
}
]

XML

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<field name="id">1
<field name="vector">1.0
<field name="vector">2.5
<field name="vector">3.7
<field name="vector">4.1

<field name="id">2
<field name="vector">1.5
<field name="vector">5.5
<field name="vector">6.7
<field name="vector">65.1

Java – SolrJ

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
final SolrClient client = getSolrClient();

final SolrInputDocument d1 = new SolrInputDocument();
d1.setField("id", "1");
d1.setField("vector", Arrays.asList(1.0f, 2.5f, 3.7f, 4.1f));

final SolrInputDocument d2 = new SolrInputDocument();
d2.setField("id", "2");
d2.setField("vector", Arrays.asList(1.5f, 5.5f, 6.7f, 65.1f));

client.add(Arrays.asList(d1, d2));

knn 查询解析器

knn K-Nearest Neighbors 查询解析器允许根据给定字段中的索引密集向量查找与目标向量最近的 k 文档。

它采用以下参数:

Parameter Name

Required

Default

Description

f

True

The DenseVectorField to search in.

topK

False

10

How many k-nearest results to return.

以下是运行 KNN 搜索的方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
&q={!knn f=vector topK=10}[1.0, 2.0, 3.0, 4.0]

检索到的搜索结果是输入 [1.0, 2.0, 3.0, 4.0] 中与向量最近的 K-nearest,由在索引时配置的similarityFunction 排序。

与过滤查询一起使用

knn 查询解析器可用于过滤查询:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
&q=id:(1 2 3)&fq={!knn f=vector topK=10}[1.0, 2.0, 3.0, 4.0]

knn 查询解析器可以与过滤查询一起使用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
&q={!knn f=vector topK=10}[1.0, 2.0, 3.0, 4.0]&fq=id:(1 2 3)

重要:

在这些场景中使用 knn 时,请确保您清楚地了解过滤器查询在 Apache Solr 中的工作方式: 由主查询 q 产生的文档 ID 排名列表与从每个过滤器查询派生的文档 ID 集合相交 fq.egRanked List from q=[ID1, ID4, ID2, ID10] Set from fq={ID3, ID2 , ID9, ID4} = [ID4,ID2]

用作重新排序查询

knn 查询解析器可用于重新排列第一遍查询结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
&q=id:(3 4 9 2)&rq={!rerank reRankQuery=$rqq reRankDocs=4 reRankWeight=1}
&rqq={!knn f=vector topK=10}[1.0, 2.0, 3.0, 4.0]

重要:

在重新排序中使用 knn 时,请注意 topK 参数。 仅当来自第一遍的文档 d 在要搜索的目标向量的 K 最近邻(在整个索引中)内时,才计算第二遍分数(从 knn 派生)。 这意味着无论如何都会在整个索引上执行第二遍 knn,这是当前的限制。 最终排序的结果列表将第一次通过分数(主查询 q)加上第二次通过分数(到要搜索的目标向量的近似相似度函数距离)乘以乘法因子(reRankWeight)。 因此,如果文档 d 不存在于 knn 结果中,即使与目标查询向量的距离向量计算不为零,您对原始分数的贡献也为零 有关使用 ReRank 查询解析器的详细信息,请参阅 Apache Solr Wiki[13] 部分。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-06-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 首席架构师智库 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
使用 Elasticsearch 进行大规模向量搜索的设计原则
在设计向量搜索体验时,可供选择的方案众多,可能让人感到不知所措。最初管理少量向量相对简单,但随着应用规模的扩大,这很快会成为瓶颈。
点火三周
2024/07/03
7000
使用 Elasticsearch 进行大规模向量搜索的设计原则
Elasticsearch vs. OpenSearch: 向量搜索性能比较
TLDR: Elasticsearch 的速度高达 OpenSearch 的 12 倍 - 我们在 Elastic 收到了大量关于 Elasticsearch 和 OpenSearch 性能差异的询问,特别是在语义搜索/向量搜索方面。为了解决这个问题,我们进行了性能测试,以提供一个清晰的数据驱动比较。结果显示,Elasticsearch 的向量搜索速度高达 OpenSearch 的 12 倍,因此需要的计算资源更少。这反映了 Elastic 在巩固 Lucene 作为最佳向量数据库方面的专注,适用于搜索和检索用例。
点火三周
2024/07/05
7990
Elasticsearch vs. OpenSearch: 向量搜索性能比较
遗留和现代数据库中的向量搜索
向量数据库是一种将数据(包括文本、图像、音频和视频)存储为向量的数据库,向量是高维空间中对象或概念的数学表示。
大数据杂货铺
2024/05/27
1870
遗留和现代数据库中的向量搜索
全文搜索引擎技术详解之Apache Solr的使用
Solr Solr是一个可扩展的,可部署,搜索,存储引擎,优化搜索大量以文本为中心的数据库 Solr是开源搜索平台,用于构建搜索应用程序 建立在Lucene(全文搜索引擎)之上 Solr是企业级的,快速的和高度可扩展的,使用Solr构建的应用程序可以提供高性能,但是非常复杂 Solr可以和Hadoop一起使用:由于Hadoop处理大量数据,Solr可以从大的数据源中找到所需信息. Solr不仅限于搜索,也可以用于存储.和其它NoSQL数据库一样,是一种非关系数据存储和处理技术Apache Solr特点Sol
攻城狮Chova
2021/11/07
1.8K0
全文搜索引擎技术详解之Apache Solr的使用
全文搜索引擎Solr原理和实战教程
Solr它是一种开放源码的、基于 Lucene Java 的搜索服务器,易于加入到 Web 应用程序中。Solr 提供了层面搜索(就是统计)、命中醒目显示并且支持多种输出格式(包括XML/XSLT 和JSON等格式)。Solr是一个高性能,采用Java开发,
一个会写诗的程序员
2020/05/08
3.9K0
Apache solr(一).
概念:Apache Solr 是一个开源的搜索服务器。Solr 使用 Java 语言开发,主要基于 HTTP 和 Apache Lucene 实现。Apache Solr 中存储的资源是以 Document 为对象进行存储的。每个文档由一系列的 Field 构成,每个 Field 表示资源的一个属性。Solr 中的每个 Document 需要有能唯一标识其自身的属性,默认情况下这个属性的名字是 id,在 Schema 配置文件中使用:<uniqueKey>id</uniqueKey>进行描述。       
JMCui
2018/03/16
1.7K0
Apache solr(一).
Elasticsearch Relevance Engine---为AI变革提供高级搜索能力[ES向量搜索、常用配置参数、聚合功能等详解]
今天要介绍的 Elasticsearch Relevance Engine™ (ESRE™),提供了多项用于创建高度相关的 AI 搜索应用程序的新功能。ESRE 站在 Elastic 这个搜索领域的巨人肩膀之上,并基于两年多的 Machine Learning 研发成就构建而成。Elasticsearch Relevance Engine 将 AI 的最佳实践与 Elastic 的文本搜索进行了结合。ESRE 为开发人员提供了一整套成熟的检索算法,并能够与大型语言模型 (LLM) 集成。不仅如此,ESRE 还可通过已经得到 Elastic 社区信任的简单、统一的 API 访问,因此世界各地的开发人员都可以立即开始使用它来提升搜索相关性。
汀丶人工智能
2023/10/19
8180
Elasticsearch Relevance Engine---为AI变革提供高级搜索能力[ES向量搜索、常用配置参数、聚合功能等详解]
AI跑车引擎——向量数据库第二篇
在AI盛行的当下,Vector Search结合LLM的应用模式已经在应用领域逐渐成为主流,要想开好AI这辆跑车,那么首先需要有一款衬手的引擎,它就是向量数据库。这也是ChatGPT曝火后,很多向量数据库公司获得了数亿美元的融资的原因。
山行AI
2023/06/14
1.7K0
AI跑车引擎——向量数据库第二篇
全文搜索引擎选ElasticSearch还是Solr?
最近项目组安排了一个任务,项目中用到了基于 Solr 的全文搜索,但是该 Solr 搜索云项目不稳定,经常查询不出来数据,需要手动全量同步。
Rookie
2019/04/25
1.2K0
全文搜索引擎选ElasticSearch还是Solr?
向量检索(RAG)之向量数据库研究
研究内容主要包括:是否开源,支持的功能有哪些(是否支持暴力检索,支持哪些索引),是否有可视化界面,是否支持标量过滤。
码之有理
2025/03/05
8730
【搜索引擎】配置 Solr 以获得最佳性能
Apache Solr 是广泛使用的搜索引擎。有几个著名的平台使用 Solr;Netflix 和 Instagram 是其中的一些名称。我们在 tajawal 的应用程序中一直使用 Solr 和 ElasticSearch。在这篇文章中,我将为您提供一些关于如何编写优化的 Schema 文件的技巧。我们不会讨论 Solr 的基础知识,我希望您了解它的工作原理。 虽然您可以在 Schema 文件中定义字段和一些默认值,但您不会获得必要的性能提升。您必须注意某些关键配置。在这篇文章中,我将讨论这些配置,您可以使用它们在性能方面充分利用 Solr。 事不宜迟,让我们开始了解这些配置是什么。
架构师研究会
2022/05/25
1.7K0
【搜索引擎】配置 Solr 以获得最佳性能
Solr_全文检索引擎系统
Solr介绍: Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务。Solr可以独立运行在Jetty、Tomcat等这些Servlet容器中。 Solr的作用: solr是一个现成的全文检索引擎系统, 放入tomcat下可以独立运行, 对外通过http协议提供全文检索服务(就是对索引和文档的增删改查服务), 在代码中可以通过solrJ(solr的客户端的jar包)来调用solr服务。 Lucene和solr的区别: lucene是一个全文检索引擎工具包, 就是
赵小忠
2018/01/24
1.2K0
solr使用教程【面试+工作】
solr使用教程一【面试+工作】 Solr调研总结 开发类型全文检索相关开发 Solr版本4.2文件内容本文介绍solr的功能使用及相关注意事项;主要包括以下内容:环境搭建及调试;两个核心配置文件介绍;维护索引;查询索引,和在查询中可以应用的高亮显示、拼写检查、搜索建议、分组统计、拼音检索等功能的使用方法。版本作者/修改人日期V1.0gzk2013-06-04 1. Solr 是什么? Solr它是一种开放源码的、基于 Lucene Java 的搜索服务器,易于加入到 Web 应用程序中。Solr 提
Java帮帮
2018/04/17
8.4K0
solr使用教程【面试+工作】
了解Solr
采用Java开发,基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎。
HUC思梦
2020/09/03
1.6K0
了解Solr
HNSW 搜索的快速过滤模式
多年来,Apache Lucene 和 Elasticsearch 一直支持带有 kNN 查询的过滤搜索,允许用户检索符合特定元数据过滤条件的最近邻。然而,当处理半限制性过滤器时,性能一直较差。在 Apache Lucene 中,我们引入了一种 ACORN-1 的变体,这是一种新的过滤 kNN 搜索方法,在召回率几乎不下降的情况下,搜索速度提高了最多 5 倍。
点火三周
2025/03/05
1480
HNSW 搜索的快速过滤模式
在Elasticsearch中如何选择精确和近似的kNN搜索
语义搜索 是一个用于相关度排序的强大工具。它不仅使用关键词,还考虑文档和查询的实际含义。
点火三周
2024/05/26
6260
在Elasticsearch中如何选择精确和近似的kNN搜索
使用SolrJ(即java客户端)开发Solr。
1、什么是SolrJ呢?   答:Solrj是访问Solr服务的java客户端,提供索引和搜索的请求方法,SolrJ通常在嵌入在业务系统中,通过SolrJ的API接口操作Solr服务。开始配置schema.xml,/home/hadoop/soft/solr-4.10.3/example/solr/collection1/conf。添加IK中文分析器,然后定义定义自己的业务域。
别先生
2019/09/29
1.5K0
使用SolrJ(即java客户端)开发Solr。
Lucene&Solr框架之第二篇
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
海仔
2019/10/22
1.7K0
solr搭建和搜索功能实现
前言: solr与Lucene的区别 :Lucene是api 需要写代码开发 ,solr是服务器,是一套基于lucence开发的全文检索框架,用就完事了。
周杰伦本人
2023/10/12
3220
solr搭建和搜索功能实现
Elasticsearch:普通检索和向量检索的异同?
《Elasticsearch 向量搜索的工程化实战》文章一经发出,收到很多留言。读者对向量检索和普通检索的区别充满了好奇,所以就有了今天的文章。
铭毅天下
2022/02/09
4.9K0
相关推荐
使用 Elasticsearch 进行大规模向量搜索的设计原则
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验