使用 PostgreSQL 和 Python 实现全文搜索

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: 【10月更文挑战第2天】使用 PostgreSQL 和 Python 实现全文搜索

引言

在当今互联网时代,搜索引擎已经成为人们获取信息的主要途径之一。而在企业级应用中,高效而精准的搜索功能也是提升用户体验的关键因素之一。PostgreSQL 作为一个强大的关系型数据库管理系统,不仅提供了传统的 SQL 查询功能,还支持全文搜索功能,使得在数据库内部进行高效文本检索成为可能。本文将介绍如何使用 PostgreSQL 的全文搜索功能,并结合 Python 来实现一个简单的全文搜索应用。

环境准备

为了进行全文搜索功能的开发,我们需要准备以下环境:

  1. PostgreSQL 数据库:确保你已经安装了 PostgreSQL 数据库服务器,并且拥有创建数据库及表的权限。
  2. Python 开发环境:安装 Python 及其相关库,如 psycopg2,用于连接 PostgreSQL 数据库。

创建数据库和表

首先,我们需要在 PostgreSQL 中创建一个数据库,并在其中创建一个表来存储文章数据。

CREATE DATABASE search_db;

\c search_db

CREATE TABLE articles (
    id SERIAL PRIMARY KEY,
    title TEXT NOT NULL,
    content TEXT NOT NULL
);

插入示例数据

为了让全文搜索功能更加直观,我们向表中插入一些示例数据:

INSERT INTO articles (title, content) VALUES
('PostgreSQL 全文搜索', 'PostgreSQL 支持全文搜索,这是一种高效检索文本的方法。'),
('Python 教程', 'Python 是一种广泛使用的高级编程语言,以其代码的清晰性和简洁性著称。'),
('SQL 基础', 'SQL 是一种用于管理关系型数据库的标准语言,它提供了创建、查询和维护数据库的功能。');

使用全文索引

为了加速全文搜索的速度,我们可以为 content 字段创建一个全文索引:

CREATE INDEX idx_fts_content ON articles USING gin(to_tsvector('english', content));

这里使用了 to_tsvector 函数将 content 转换为一个文本向量,并使用 gin 索引来存储这些向量。

实现全文搜索

接下来,我们可以在 Python 中编写代码来查询数据库中的全文索引:

import psycopg2
from psycopg2.extras import register_hstore

conn = psycopg2.connect(database="search_db", user="your_username", password="your_password", host="localhost", port="5432")
register_hstore(conn)
cursor = conn.cursor()

query = "SELECT * FROM articles WHERE to_tsvector('english', content) @@ to_tsquery('english', %s);"
keyword = "全文搜索"

cursor.execute(query, (keyword,))
rows = cursor.fetchall()

for row in rows:
    print(row)

cursor.close()
conn.close()

这段代码首先连接到了 PostgreSQL 数据库,并使用 to_tsvectorto_tsquery 函数来匹配包含关键词 "全文搜索" 的记录。

提高搜索质量

为了提高搜索结果的相关性,PostgreSQL 还提供了配置权重的能力,可以根据文本的不同位置赋予不同的权重。例如,标题中的关键词比正文中的更具有代表性,因此可以给予更高的权重:

SELECT * FROM articles 
WHERE to_tsvector('english', title) @@ to_tsquery('english', 'Python') 
OR to_tsvector('english', content) @@ to_tsquery('english', 'Python');

结论

通过本文,我们学习了如何在 PostgreSQL 中实现全文搜索功能,并且通过 Python 脚本来执行全文搜索查询。全文搜索不仅能够提高用户的搜索体验,还能为开发人员提供一个强大而灵活的工具来处理文本数据。未来还可以进一步优化搜索逻辑,比如使用自定义词典、同义词替换等高级特性来进一步增强搜索能力。

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
1月前
|
SQL 关系型数据库 数据库
使用 PostgreSQL 和 Python 实现数据库操作
【10月更文挑战第2天】使用 PostgreSQL 和 Python 实现数据库操作
|
5月前
|
SQL 关系型数据库 数据库
Python执行PostgreSQL数据库查询语句,并打印查询结果
本文介绍了如何使用Python连接和查询PostgreSQL数据库。首先,确保安装了`psycopg2`库,然后创建数据库连接函数。接着,展示如何编写SQL查询并执行,例如从`employees`表中选取所有记录。此外,还讨论了处理查询结果、格式化输出和异常处理的方法。最后,提到了参数化查询和事务处理以增强安全性及确保数据一致性。
Python执行PostgreSQL数据库查询语句,并打印查询结果
|
4月前
|
JSON 关系型数据库 API
Python 使用 FastAPI 和 PostgreSQL 构建简单 API
最近一年公司也在卷 LLM 的应用项目,所以我们也从 goper => Pythoner。 这一年使用最多的就是 Python 的 FastAPI 框架。下面一个简易项目让你快速玩转 Python API Web。 API代表应用程序编程接口,是软件开发中最重要的概念之一。它允许程序通过发送和接收数据与其他服务进行交互。API Web 通信最广泛使用的标准之一是 REST,它依赖于JSON 格式或键值对,类似于 Python 的字典。 如果想用 Python 构建一个,那么可以从几个框架中选择。Flask -RESTful、Django Rest Framework 和 FastAPI 是最受
|
5月前
|
SQL 关系型数据库 数据库
Python查询PostgreSQL数据库
木头左教你如何用Python连接PostgreSQL数据库:安装`psycopg2`库,建立连接,执行SQL脚本如创建表、插入数据,同时掌握错误处理和事务管理。别忘了性能优化,利用索引、批量操作提升效率。下期更精彩!💡 csvfile
Python查询PostgreSQL数据库
|
关系型数据库 测试技术 数据库
【全文搜索】全文搜索 PostgreSQL 或 ElasticSearch
【全文搜索】全文搜索 PostgreSQL 或 ElasticSearch
|
自然语言处理 关系型数据库 PostgreSQL
PostgreSQL 10.1 手册_部分 II. SQL 语言_第 12 章 全文搜索
第 12 章 全文搜索 目录 12.1. 介绍 12.1.1. 什么是一个文档? 12.1.2. 基本文本匹配 12.1.3. 配置 12.2. 表和索引 12.2.1. 搜索一个表 12.2.
1239 0
|
SQL 关系型数据库 PostgreSQL
PostgreSQL 10.1 手册_部分 II. SQL 语言_第 12 章 全文搜索_12.11. 限制
12.11. 限制 PostgreSQL的文本搜索特性的当前限制是: 每一个词位的长度必须小于 2K 字节 一个tsvector(词位 + 位置)的长度必须小于 1 兆字节 词位的数量必须小于 264 tsvector中的位置值必须大于 0 并且小于 16,383 <N>(.
1132 0
|
SQL 关系型数据库 PostgreSQL
PostgreSQL 10.1 手册_部分 II. SQL 语言_第 12 章 全文搜索_12.10. psql支持
12.10. psql支持 关于文本搜索配置对象的信息可以在psql中使用一组命令获得: \dF{d,p,t}[+] [PATTERN] 可选的+能产生更多细节。 可选参数PATTERN可以是一个文本搜索对象的名称,可以是模式限定的。
1150 0
|
存储 SQL 关系型数据库
PostgreSQL 10.1 手册_部分 II. SQL 语言_第 12 章 全文搜索_12.9. GIN 和 GiST 索引类型
12.9. GIN 和 GiST 索引类型 有两种索引可以被用来加速全文搜索。注意全文搜索并非一定需要索引,但是在一个定期会被搜索的列上,通常需要有一个索引。 CREATE INDEX name ON table USING GIN(column); 创建一个基于 GIN(通用倒排索引)的索引。
1624 0
|
SQL 自然语言处理 关系型数据库
PostgreSQL 10.1 手册_部分 II. SQL 语言_第 12 章 全文搜索_12.8. 测试和调试文本搜索
12.8. 测试和调试文本搜索 12.8.1. 配置测试 12.8.2. 解析器测试 12.8.3. 词典测试 一个自定义文本搜索配置的行为很容易变得混乱。本节中描述的函数对于测试文本搜索对象有用。
1185 0