脚本之家

电脑版
提示:原网页已由神马搜索转码, 内容由www.jb51.net提供.
您的位置:首页脚本专栏python→ Python Oracle文本检索系统

Python使用Oracle向量数据库实现文本检索系统

  更新时间:2024年07月04日 10:39:21  作者:engchina 
在本文中,我们将深入分析一个使用Oracle向量数据库实现文本检索系统的Python代码,并基于相同的技术生成一个新的示例,这个系统允许我们存储文档及其嵌入向量,并执行相似性搜索,感兴趣的朋友可以参考下

代码分析

让我们逐步分析原始代码的主要组件和功能:

  1. 导入必要的库:

    • 使用oracledb连接Oracle数据库
    • 使用numpy处理向量
    • 使用pydantic进行配置验证
    • 使用flaskredis进行Web应用程序集成
  2. 定义OracleVectorConfig类:

    • 使用Pydantic模型验证Oracle连接配置
  3. 创建OracleVector类:

    • 实现向量数据库的核心功能
    • 使用contextmanager管理数据库连接
    • 实现CRUD操作和向量搜索
  4. 实现OracleVectorFactory类:

    • 用于初始化向量数据库实例

现在,让我们基于相同的技术创建一个新的示例代码:

import array
import json
import uuid
from contextlib import contextmanager
from typing import List, Dict, Any
import numpy as np
import oracledb
from pydantic import BaseModel, validator
class OracleConfig(BaseModel):
host: str
port: int
user: str
password: str
database: str
@validator('host', 'user', 'password', 'database')
def check_not_empty(cls, v):
if not v:
raise ValueError("Field cannot be empty")
return v
class TextEmbeddingStore:
def __init__(self, config: OracleConfig):
self.pool = self._create_connection_pool(config)
self.table_name = "text_embeddings"
self._create_table()
def _create_connection_pool(self, config: OracleConfig):
return oracledb.create_pool(
user=config.user,
password=config.password,
dsn=f"{config.host}:{config.port}/{config.database}",
min=1,
max=5,
increment=1
)
@contextmanager
def _get_cursor(self):
conn = self.pool.acquire()
conn.inputtypehandler = self._input_type_handler
conn.outputtypehandler = self._output_type_handler
cur = conn.cursor()
try:
yield cur
finally:
cur.close()
conn.commit()
conn.close()
def _input_type_handler(self, cursor, value, arraysize):
if isinstance(value, np.ndarray):
return cursor.var(
oracledb.DB_TYPE_VECTOR,
arraysize=arraysize,
inconverter=self._numpy_to_array
)
def _output_type_handler(self, cursor, metadata):
if metadata.type_code is oracledb.DB_TYPE_VECTOR:
return cursor.var(
metadata.type_code,
arraysize=cursor.arraysize,
outconverter=self._array_to_numpy
)
def _numpy_to_array(self, value):
return array.array('f', value)
def _array_to_numpy(self, value):
return np.array(value, dtype=np.float32)
def _create_table(self):
with self._get_cursor() as cur:
cur.execute(f"""
CREATE TABLE IF NOT EXISTS {self.table_name} (
id VARCHAR2(100) PRIMARY KEY,
text CLOB NOT NULL,
metadata JSON,
embedding VECTOR NOT NULL
)
""")
def add_texts(self, texts: List[str], embeddings: List[List[float]], metadata: List[Dict] = None):
if metadata is None:
metadata = [{} for _ in texts]

values = [
(str(uuid.uuid4()), text, json.dumps(meta), np.array(emb, dtype=np.float32))
for text, emb, meta in zip(texts, embeddings, metadata)
]
with self._get_cursor() as cur:
cur.executemany(
f"INSERT INTO {self.table_name} (id, text, metadata, embedding) VALUES (:1, :2, :3, :4)",
values
)
def search_similar(self, query_vector: List[float], top_k: int = 5) -> List[Dict[str, Any]]:
query_vector = np.array(query_vector, dtype=np.float32)
with self._get_cursor() as cur:
cur.execute(
f"""
SELECT id, text, metadata, vector_distance(embedding, :1) AS distance
FROM {self.table_name}
ORDER BY distance
FETCH FIRST :2 ROWS ONLY
""",
[query_vector, top_k]
)
results = []
for id, text, metadata, distance in cur:
results.append({
"id": id,
"text": text,
"metadata": json.loads(metadata),
"distance": distance,
"similarity": 1 - distance
})
return results
# 使用示例
if __name__ == "__main__":
config = OracleConfig(
host="localhost",
port=1521,
user="your_username",
password="your_password",
database="your_database"
)

store = TextEmbeddingStore(config)

# 添加文本和嵌入
texts = ["Hello world", "Python programming", "Vector database"]
embeddings = [[0.1, 0.2, 0.3], [0.4, 0.5, 0.6], [0.7, 0.8, 0.9]]
store.add_texts(texts, embeddings)

# 搜索相似文本
query_vector = [0.2, 0.3, 0.4]
results = store.search_similar(query_vector, top_k=2)

for result in results:
print(f"Text: {result['text']}")
print(f"Similarity: {result['similarity']:.4f}")
print("---")

这个新的示例代码实现了一个简化版的文本嵌入存储系统,使用Oracle向量数据库。它包含以下主要功能:

  1. 使用Pydantic进行配置验证
  2. 创建和管理Oracle连接池
  3. 使用上下文管理器处理数据库连接
  4. 处理numpy数组和Oracle向量类型之间的转换
  5. 实现添加文本和嵌入的方法
  6. 实现基于向量相似度的搜索方法

这个示例展示了如何使用Oracle向量数据库来存储和检索文本嵌入,可以作为构建更复杂的文本检索或推荐系统的基础。

在实际应用中,你可能需要添加错误处理、日志记录、性能优化等功能。

到此这篇关于Python使用Oracle向量数据库实现文本检索系统的文章就介绍到这了,更多相关Python Oracle文本检索系统内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

    • 这篇文章主要介绍了Python实现的读写json文件功能,结合实例形式分析了Python针对json文件进行读写的常见操作技巧与注意事项,需要的朋友可以参考下
      2018-06-06
    • 这篇文章主要介绍了如何将一个CSV格式的文件分割成两个CSV文件,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
      2022-07-07
    • 本文将会讲述一系列如何使用一行代码解析 nmap 扫描结果,其中会在 Python 环境中使用到 libnmap 里的 NmapParser 库,这个库可以很容易的帮助我们解析 nmap 的扫描结果
      2016-08-08
    • 这篇文章主要介绍了多线程Django程序耗尽数据库连接的问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
      2018-10-10
    • 这篇文章主要介绍了python 系统调用的实例详解的相关资料,需要的朋友可以参考下
      2017-07-07
    • 这篇文章主要给大家介绍了关于Python报错:NameError: name ‘xxx‘ is not defined的解决办法,文中通过代码介绍的非常详细,对大家的学习或者工作具有一定的参考借鉴价值,需要的朋友可以参考下
      2024-06-06
    • 这篇文章主要介绍了探究Python中isalnum()方法的使用,是Python入门学习中的基础知识,需要的朋友可以参考下
      2015-05-05
    • 这篇文章主要介绍了Python按指定列的空值删除行的操作代码,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
      2024-01-01
    • 这篇文章主要介绍了Python使用turtle库绘制小猪佩奇,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
      2020-01-01
    • 这篇文章主要介绍了Python获取浏览器窗口句柄过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
      2020-07-07

    最新评论