python使用elasticserch进行混合搜索构建知识库

python使用elasticserch进行混合搜索

  • 基于python使用elasticserch
    • 安装elasticsearch
    • 连接elasticsearch
    • 创建索引
    • 写入数据
    • 搜索数据
      • 关键字搜索
      • KNN搜索
      • 向量搜索
      • 混合搜索

基于python使用elasticserch

安装elasticsearch

pip install elasticsearch

连接elasticsearch

es_username = "elastic"
es_password = "123456"
es = Elasticsearch(['https://0.0.0.0:9200'],basic_auth=(es_username, es_password),verify_certs=False)

创建索引

#settings: 定义了索引的设置,包括了主分片数量和副本数量。一个主分片和0副本。
#id类型为 keyword,意味着它是一个精确值字段,不会被分词。
#title 和 content: 表示标题和内容的字段,类型为 text,使用了中文分词器(ik_smart 和 ik_max_word)进行分析,并且都被配置为存储。
#title_vec 和 vectors.features: 表示向量字段的字段,类型为 dense_vector,意味着它们存储了稠密向量。这些向量字段还指定了维度(dims),相似度度量方式(similarity,这里是余弦相似度),以及是否被索引(index,设置为 True)。
#vectors.segment: 表示文档中的某一段落的字段,类型为 text,使用了中文分词器,并且被配置为存储。
index_name = "zft_lnn"
index_settings = {'settings': {'number_of_shards': 1,'number_of_replicas': 0},'mappings': {"properties": {"id": {"store": True,"type": "keyword"},  "title": {"search_analyzer": "ik_smart","analyzer": "ik_max_word","store": True,"type": "text"},"content": {"search_analyzer": "ik_smart","analyzer": "ik_max_word","store": True,"type": "text"},"title_vec": {"dims": 768,"similarity": "cosine","index": True,"type": "dense_vector"},"vectors": {"type": "nested","properties": {"features": {"dims": 768,"similarity": "cosine","index": True,"type": "dense_vector"},"segment": {"search_analyzer": "ik_smart","analyzer": "ik_max_word","store": True,"type": "text"}}}}}
}
es.indices.create(index=index_name, body=index_settings)

写入数据

待写入数据存储在json文件中,里面是query和answer的对子。

import json# 读取JSON文件
with open('answer.json', 'r', encoding='utf-8') as file:data = json.load(file)count = 1
for item in data:title = item["query"]content  = item["answer"]index_name = "zft_bge"title_vec = vector_model.encode(title)content_vec = vector_model.encode(content)id = str(count)count += 1datas = {}datas["id"] = iddatas["title"] = titledatas["content"] = contentdatas["title_vec"] = title_vecdatas["content_vec"] = content_vecdocument = {"id": datas["id"],"title": datas["title"],"title_vec":datas["title_vec"],"content":datas["content"],"content_vec":datas["content_vec"]}response = es.index(index=index_name,id=datas["id"], body=document)

搜索数据

关键字搜索

IK 分词器可以将中文文本切分成一个个有意义的词语,并计算这些词语的词频(term frequency,TF),用于构建倒排索引。在搜索时,Elasticsearch 会根据查询词的词频和文档中各个词语的词频来计算文档的相关性得分,从而排序返回搜索结果。

boostqu = {"match": {"title": {"query": qa,"boost": 1.5}}}
query = {"query": {"function_score": {"query": {"bool": {"should": boostqu}},"functions": [{"script_score": {"script": {"source": "Math.sqrt(_score)/2","lang": "painless",}}}],"boost_mode": "replace"}},
}results = es.search(index=index_name, body=query)
hits = results["hits"]["hits"]
for h in hits:print(h["_source"]["title"],h['_score'])

KNN搜索

在 Elasticsearch 中,KNN 搜索通常用于基于向量的相似性搜索,例如基于词嵌入向量或其他类型的向量来查找最相似的文档或项。

query_vector = vector_model.encode(qa)
query = {"query": {"bool": {"should": [{"knn": {"field": "title_vec","query_vector": query_vector,"num_candidates": 10,"boost": 1.0}}]}}
}
results = es.search(index=index_name, body=query)
hits = results["hits"]["hits"]
for h in hits:print(h["_source"]["title"],h['_score'])

向量搜索

query_vector = vector_model.encode(qa)
query = {"query": {# 通过 script score 来自定义查询的分值计算"script_score": {"query": {# 此处可以结合其他约束条件"match_all": {}},# 稠密向量查询的重点在此处,通过 script 的方式指定具体的计算方式# 此处是计算余弦相似度,也可以替换其他的相似度"script": {# 余弦相似度计算需要两个参数:本次待查询的向量 queryVector 和索引中的字段 entity_name_embedding"source": "cosineSimilarity(params.queryVector, 'title_vec')","lang": "painless",# 此处将本次待查询的向量传入,注意“params”中 queryVector 和 “source”中的书写要保持一致。"params": {# 768 维的待查询向量"queryVector": query_vector}},"boost": 1.0,}},
}
results = es.search(index=index_name, body=query)
hits = results["hits"]["hits"]
for h in hits:print(h["_source"]["title"],h['_score'])

混合搜索

在混合搜索中,可以在不同方式的搜索加入权重,进行去权重的相加,从而得到一个更好的结果,这个权重参数更多的需要结合实际场景进行设置。

#混合搜索
def multiserch(es,vector_model,qa):query_vector = vector_model.encode(qa)key_boostqu = [{"match": {"title": {"query": qa, "boost": 1.2}}},{"match": {"content": {"query": qa, "boost": 0.8}}},]query = {"query": {"bool": {"should": [{"function_score": {"query": {"bool": {"should": key_boostqu}},"functions": [{"script_score": {"script": {"source": "Math.sqrt(_score)/2","lang": "painless"}}}],"boost_mode": "replace"}},{"script_score": {"query": {"match_all": {}},"script": {"source": "cosineSimilarity(params.queryVector, 'title_vec')","lang": "painless","params": {"queryVector": query_vector}},"boost": 1.0}}]}},"knn": {"field": "title_vec","query_vector": query_vector,"k": 1,"num_candidates": 10,"boost": 0.5},"knn": {"field": "content_vec","query_vector": query_vector,"k": 1,"num_candidates": 10,"boost": 0.5},"size": 3}results = es.search(index=index_name, body=query)hits = results["hits"]["hits"]for h in hits:print(h["_source"]["title"],h['_score'])print(h["_source"]["content"])content = hits[0]["_source"]["content"]return content

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/835992.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

神经网络复习--神经网络算法模型及BP算法

文章目录 神经网络模型的构成BP神经网络 神经网络模型的构成 三种表示方式: 神经网络的三要素: 具有突触或连接,用权重表示神经元的连接强度具有时空整合功能的输入信号累加器激励函数用于限制神经网络的输出 感知神经网络 BP神经网络 …

解释Java中的泛型通配符和泛型方法

泛型通配符(Wildcard) Java 中的泛型通配符 ? 使用在泛型类型的声明中,表示未知的类型参数。通配符通常用在参数、字段、局部变量或者返回类型上,为泛型带来了更高的灵活性。泛型通配符主要分为三种形式: 无界通配符…

GO: json 处理

需要引入"encoding/json"包 json解析到map jsonStr : "{\"a\":\"test\",\"b\":\"testb\"}" var dat map[string]string err : json.Unmarshal([]byte(jsonStr), &dat) if err nil {fmt.Println(dat) }结果…

内容检索(2024.05.12)

随着创作数量的增加,博客文章所涉及的内容越来越庞杂,为了更为方便地阅读,后续更新发布的文章将陆续在此汇总并附上原文链接,感兴趣的小伙伴们可持续关注文章发布动态! 本期更新内容: 1. 信号仿真类话题-…

webpack5基础和配置

初步体验webpack打包 webpack是一个静态资源打包工具。 它会以一个或多个文件作为打包的入口,将我们整个项目所有文件编译组合成一个或多个文件输出出去。 输出的文件就是编译好的文件,就可以在浏览器段运行了。 1.初始化最简单的一个目录文件&#xff…

JavaSE——集合框架一(1/7)-集合体系概述(集合体系结构,Collection集合体系)、Collection的常用方法(介绍,实例演示,代码)

目录 集合体系概述 集合体系结构 Collection集合体系 Collection的常用方法 介绍 实例演示 完整代码 集合体系概述 集合体系结构 集合是一种容器,用来装数据的,类似于数组,但集合的大小可变,开发中也非常常用。 为了满足…

element-ui 中 如何在el-upload的移除文件列表事件 on-remove 中调用后端进行数据库的删除。

问题描述: 刚开始的时候我设置的是实时上传: auto-upload"true", :http-request"uploadResource"绑定的这个方法就去后端进行实时上传附件了,这个时候就已经保存到数据库。 那么问题来了: :on-remove"…

flask+layui显示监控视频

1、flask简介 flask是python中的一个轻量级web框架。 2、layui简介 Layui 是一套开源免费的 Web UI 组件库,采用自身轻量级模块化规范,遵循原生态的 HTML/CSS/JavaScript 开发模式,非常适合网页界面的快速构建。Layui 区别于一众主流的前端…

# ERROR: node with name “rabbit“ already running on “MS-ITALIJUXHAMJ“ 解决方案

ERROR: node with name “rabbit” already running on “MS-ITALIJUXHAMJ” 解决方案 一、问题描述: 1、启动 rabbitmq-server.bat 服务时,出错 Error 2、查询 rabbitmqctl status 状态时,出错 Error 3、停止 rabbitmqctl stop 服务时&a…

Rust 语言的“命名空间” —— mod

在Rust中,虽然没有像C中的namespace这样的显式关键字,但是Rust通过模块(mod)系统提供了一种类似命名空间的功能。模块允许你将相关的代码组织在一起,并可以通过pub关键字来控制哪些项(如函数、结构体、枚举…

软考 系统架构设计师系列知识点之杂项集萃(3)

接前一篇文章:软考 系统架构设计师系列知识点之杂项集萃(2) 第4题 软件架构贯穿于软件的整个生命周期,但在不同阶段对软件架构的关注力度并不相同,在( )阶段,对软件架构的关注最多。…

clickhouse卸载与安装

ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS),来自于俄罗斯本土搜索引擎企业Yandex公司。它是为处理大规模数据集而设计的,并提供高性能和低延迟的查询支持。 注意:此教程的运…

关于画图-一次性搞定各类高级论文作图及配色

关于画图-一次性搞定各类高级论文作图及配色 图(Figure)可以让各类论文的结果更加直观,有时候一张图片比一大段文字更有说服力。 但许多新手作者可能会有一连串的疑惑:数据这么多,什么时候该做什么类型的图&#xff…

LabVIEW开发MOOG控制系统数据处理软件

LabVIEW开发MOOG控制系统数据处理软件 在现代航空领域,飞机结构的静强度试验是保证飞机安全运行的关键环节。MOOG加载控制系统作为试验中的关键设备,其数据输出的直观性和易处理性对于提高试验效率具有重要意义。设计了一种基于LabVIEW的MOOG控制系统数…

redis并发之跳表

简介 跳表(Skip List)是一种用于实现有序集合(Sorted Set)的数据结构,在 Redis 中被广泛应用。跳表的设计旨在提供高效的有序集合操作,可以将跳表理解为基于二分查找的索引结构。跳表通过构建多层索引&…

Minio 纠删码及分布式Minio集群环境搭建

系列文章目录 第二章 Minio 纠删码及分布式Minio集群环境搭建 Minio 纠删码及分布式Minio集群环境搭建 系列文章目录纠删码什么是纠删码?为什么纠删码有用?什么是位衰减bit rot保护? 纠错码单机模式环境搭建分布式MinIO分布式存储可靠性常用方法冗余校验 分布式M…

Pikachu 靶场 File Inclusion 通关解析

前言 Pikachu靶场是一种常见的网络安全训练平台,用于模拟真实世界中的网络攻击和防御场景。它提供了一系列的实验室环境,供安全专业人士、学生和爱好者练习和测试他们的技能。 Pikachu靶场的目的是帮助用户了解和掌握网络攻击的原理和技术,…

Android面试题之kotlin热流和channel

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点 于冷流不同,在垃圾回收之前,flow里的值都是存在内存之中,并且处于活跃状态 StateFlow StateFlow是一个状态容…

【Python】items()方法的介绍和使用方式

相关链接:【Python】顺序字典(OrderedDict)的定义和使用方式 相关链接:【Python】普通字典的定义和使用方式 相关链接:【Python】get()方法的介绍和使用方式 在 Python 中,字典(dict&#xff0…

DSA理解理解蓝桥杯例题signature

一、历史 1991年8月,NIST(Nation Institute of Standards and Technology,美国国家标准技术研究所)提出了数字签名算法(DSA)用于他们的数字签名标准(DSS)中。 DSA是算法&#xff0c…