如何基于ElasticSearch 8.4.2实现语义搜索?求可用代码示例
ElasticSearch语义搜索实现示例
一、什么是语义搜索?
语义搜索能够理解搜索用词的上下文含义,打破传统关键词匹配的局限,返回与搜索意图更贴合的结果。
二、语义搜索实现逻辑

三、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
相关产品推荐
相关产品推荐

