在这篇文章中,我们将手动构建一个语义相似性搜索引擎,该引擎将单个论文作为“查询”输入,并查找Top-K的最类似论文。主要包括以下内容:
1.搭建milvus矢量数据库
2.使用MILVUS矢量数据库搭建语义相似性搜索引擎
3.从Kaggle下载ARXIV数据,使用dask将数据加载到Python中,并构建一个论文搜索引擎
1. 搭建milvus矢量数据库
milvus数据库的安装比较简单,可以直接使用docker安装,建议安装2.1.x以上版本,功能更丰富,其分为标准版和集群版本,这里只安装标准版本。
① docker 在线安装:
https://milvus.io/docs/v2.1.x/install_standalone-docker.md
② docker 离线安装:若服务器存在网络限制,可使用离线安装策略,官方文档如下:
https://milvus.io/docs/v2.1.x/install_offline-docker.md
这里展示我自己参考官方离线安装文档,但有些不同的的安装方式,即自己手动下载容器,在手动上传至服务器:
(1)首先在这里下载docker-compose.yml,查看需要的容器:
http://$ wget https://github.com/milvus-io/milvus/releases/download/v2.1.1/milvus-standalone-docker-compose.yml -O docker-compose.yml
主要包括以下三个:
image: quay.io/coreos/etcd:v3.5.0
image: minio/minio:RELEASE.2022-03-17T06-34-49Z
image: milvusdb/milvus:v2.1.1
(2)在docker hub找到需要下载的容器:
https://hub.docker.com/
(3)复制pull命令到如下网址进行在线下载,并打包成tar:
https://pullimage.passerma.com/
这一步可参考博客:
在线下载Docker Hub镜像,打成tar包下载_passerma的博客-CSDN博客_dockerhub下载镜像
(4)后续步骤按照离线官方文档下这一步开始执行:
出现以下显示,并通过docker-compose ps查看容器状态,出现以下结果则安装成功:
2.使用MILVUS矢量数据库搭建语义相似性搜索引擎
参考官方文档:
https://github.com/milvus-io/bootcamp/tree/master/solutions/text_search_engine/quick_deploy
我这里由于服务器网络限制原因没有用第一种方案,如果使用第一种方案,前面的步骤1:搭建milvus矢量数据库,可直接跳过:
第二种方案:以源码部署
第一步安装milvus已经在步骤一完成,跳过:
第二步:使用docker安装mysql,离线安装和在线安装都可以,离线安装参照上面miluv安装步骤,下载mysql5.7.tar包,上传至服务器,然后加载容器:
docker load -i mysql:5.7.tar
开启mysql服务:
docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
后续步骤按照教程走即可。
注意事项:
这里的let endpoint 要填服务器地址加端口号。示例:http://12.88.8.104:8000
3.从Kaggle下载ARXIV数据,使用dask将数据加载到Python中,并构建一个论文搜索引擎
这个可参考文章:https://blog.csdn.net/deephub/article/details/126343422
我这里的改进如下:
可以直接将arxiv的json格式通过dask包读取后另存为csv格式,然后将数据通过serverapi上传即可:
papers_df = papers_db.to_dataframe(meta=schema)
在这后面加上一句:
papers_df.to_csv(path,single_file=True)
出现的问题:
1.加载arxiv.csv文件时由于其源码是使用pandas一次转化为一个list,一次上传,这样会导致内存暴:milvus docker 会出现 exit(137)错误
2.使用dask加载csv文件出现乱码的问题。
解决方法:
使用dask库加载:
dd_file = dask.dataframe.read_csv(file_dir,blocksize='10MB')blocksize表示一次加载的分片大小
for partition in tqdm(range(dd_file.npartitions)):
subset_df = dd_file.get_partition(partition)
if len(subset_df.index) !=0:
data = [subset_df[col].values.compute().tolist() for col in ['title','text']]
#若使用上述方法出现乱码,可使用下述方法:
#先使用pandas加载
pd_file = pd.read_csv(file)
dd_file = dask.dataframe.from_pandas(pd_file, npartitions=10)
for partition in tqdm(range(dd_file.npartitions)):
subset_df = dd_file.get_partition(partition)
if len(subset_df.index) !=0:
data = [subset_df[col].values.compute().tolist() for col in ['title','text']]
附dask官方文档:
https://docs.dask.org/en/latest/dataframe-create.html
3.在将数据进行上传时,出现mysql数据库 1366编码错误的问题:文章来源:https://www.toymoban.com/news/detail-488014.html
在mysql_helpers.py修改如下两个地方:文章来源地址https://www.toymoban.com/news/detail-488014.html
def __init__(self):
self.conn = pymysql.connect(host=MYSQL_HOST, user=MYSQL_USER, port=MYSQL_PORT,
password=MYSQL_PWD,
#1. 增加charset='utf8mb4'
charset='utf8mb4',
local_infile=True)
def create_mysql_table(self, table_name):
self.test_connection()
sql = "create table if not exists " + table_name +"(milvus_id TEXT, title TEXT, text TEXT);"
try:
self.cursor.execute(sql)
#使用sql语句改变表编码格式
self.cursor.execute("alter table "+table_name + " convert to charcter set utf8mb4;")
到了这里,关于从零开始构建基于milvus向量数据库的文本搜索引擎的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!