Elasticsearch 通过独立但互补的机制支持向量搜索和全文搜索。对于全文搜索,它依赖倒排索引和评分算法;而向量搜索则使用密集向量表示和相似性度量。这些方法解决了不同的用例,例如基于关键词的查询和语义相似性匹配,并且可以结合使用以实现混合搜索场景。
对于全文搜索,Elasticsearch 构建倒排索引以实现快速的文本查询。文档被索引时,其文本字段会被分析——分割成词元(tokens)、规范化,并存储在将词语映射到包含这些词语的文档的结构中。例如,包含“quick brown fox”的字段可能会被词元化为 ["quick", "brown", “fox”] 并带有位置信息。match
或 term
等查询利用这些索引查找包含特定词语的文档。Elasticsearch 使用 BM25 算法根据词频和文档长度对结果进行排名,优先显示搜索词突出出现的文档。过滤器(Filters)和聚合(aggregations)可以进一步细化结果。这种方法适用于精确匹配、短语搜索或带有容错能力的模糊查询。
Elasticsearch 通过 dense_vector
字段类型支持向量搜索,该字段类型存储表示嵌入向量(例如,来自机器学习模型)的浮点数数组。为了执行相似性搜索,Elasticsearch 提供了 knn
(k 近邻)查询,该查询使用余弦相似度等度量指标将查询向量与存储的向量进行比较。例如,表示“犬类伙伴”的向量可以与编码为向量的产品描述进行比较,以查找语义相关的项目。在内部,Elasticsearch 使用 HNSW 算法进行近似最近邻搜索,平衡了速度和准确性。向量可以通过可选参数进行索引,例如 dimensions
(例如,BERT 嵌入的 768)和 similarity
(例如,cosine
)。这使得图像相似性搜索或关键词匹配不足的自然语言查询等用例成为可能。
Elasticsearch 允许在单个查询中结合使用向量搜索和全文搜索。例如,您可以使用 match
查询过滤包含特定关键词的文档,然后应用 knn
查询根据语义相似性对结果进行重新排名。hybrid
评分方法或自定义 script_score
函数可以混合来自两种方法的文档相关性分数。这对于电子商务等应用非常有用,例如搜索“无线耳机”时,可以优先显示与关键词精确匹配的产品,同时也能展示与“蓝牙耳塞”语义相关的商品。开发人员可以调整向量和文本分数之间的权重以优化结果。这两种搜索类型都受益于 Elasticsearch 的分布式架构,能够在大型数据集上实现可扩展性。