semantic 直接使用自然语言写入和查询,相比 knn 查询体验更加简单。我们只需要指定基于机器学习节点或者 Inference 创建的推理服务,即可轻松完成读写,无需创建 Ingest Pipeline 和关注底层模型与推理细节(例如维度、m、ef 等)。
创建推理端点
PUT _inference/text_embedding/bge-base-zh-service{"service": "elasticsearch","service_settings": {"model_id": "bge-base-zh","num_allocations": 1,"num_threads": 1}}
创建索引
semantic 字段默认用 Elastic 自带的.elser-2-elastic 推理端点(EIS 服务),这是一个稀疏向量嵌入模型,我们可以显式地指定为自己创建的推理端点:
PUT semantic_search_index{"mappings":{"properties": {"content_vector":{"type":"semantic_text","inference_id":"bge-base-zh-service", // 指定写入和查询的推理端点},"content":{"type":"text","copy_to":"content_vector"}}}}
写入数据
写入的同时,自动调用模型生成向量数据:
PUT semantic_search_index/_doc/1{"content":"使用semantic search,可以简化数据入库语句"}PUT semantic_search_index/_doc/2{"content":"使用semantic search,可以简化数据查询语句"}
执行语义搜索
执行 match 搜索,查询内容采用自然语言,如下是一个示例:
GET semantic_search_index/_search{"query": {"match": {"content_vector": {"query": "What is semantic search ?"}}}}