You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于ElasticSearch 8.4.2实现语义搜索?求可用代码示例

ElasticSearch语义搜索实现示例

一、什么是语义搜索?

语义搜索能够理解搜索用词的上下文含义,打破传统关键词匹配的局限,返回与搜索意图更贴合的结果。

二、语义搜索实现逻辑

语义搜索实现流程

三、ES语义搜索集成示例

ES语义搜索集成示例

四、实操代码片段

1. 文本向量生成(基于Sentence-BERT)

通过预训练模型将文本转换为数值向量:

from sentence_transformers import SentenceTransformer

# 加载轻量预训练模型
model = SentenceTransformer('all-MiniLM-L6-v2')

# 对目标文本生成向量
sample_text = "如何在ElasticSearch中实现语义搜索?"
text_vector = model.encode(sample_text)

2. 创建ES索引(定义向量字段)

在ES中创建支持向量存储的索引:

PUT /semantic_docs
{
  "mappings": {
    "properties": {
      "doc_content": {
        "type": "text",
        "analyzer": "ik_max_word"  # 中文场景使用IK分词器
      },
      "content_vector": {
        "type": "dense_vector",
        "dims": 384  # 与Sentence-BERT模型输出维度一致
      }
    }
  }
}

3. 插入带向量的文档

将文本和对应向量写入ES索引:

from elasticsearch import Elasticsearch

# 连接ES实例
es_client = Elasticsearch("http://localhost:9200")

# 待插入文档
document = {
    "doc_content": "ElasticSearch语义搜索可通过向量匹配实现上下文理解",
    "content_vector": text_vector.tolist()
}

# 插入索引
es_client.index(index="semantic_docs", document=document)

4. 执行语义搜索查询

通过余弦相似度匹配实现语义检索:

POST /semantic_docs/_search
{
  "query": {
    "script_score": {
      "query": {
        "match_all": {}
      },
      "script": {
        "source": "cosineSimilarity(params.query_vec, 'content_vector') + 1.0",
        "params": {
          "query_vec": [0.05, 0.12, ...]  # 搜索文本生成的向量
        }
      }
    }
  },
  "_source": ["doc_content"]  # 仅返回文本内容
}

内容的提问来源于stack exchange,提问作者Tom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 17:45:38