如何在 Python 中构建搜索引擎:分步教程
通过这份详细的分步教程,了解如何在 Python 中轻松构建搜索引擎。

您可以使用数据结构、算法和库的组合在 Python 中构建搜索引擎,以便根据您的搜索查询输入来索引、排名和检索信息。
一个 Python 搜索引擎的构建基于以下关键步骤:
- 数据收集与预处理
- 文档创建和索引
- 添加搜索系统
- 结果排名。
使用 Python 构建的搜索引擎可供选择开源解决方案的中小型和大型企业使用,这些解决方案提供可扩展性和灵活性。
由于其易于定制的特性,这些搜索引擎可应用于许多场景,例如电子商务、研究、市场、企业搜索等。
让我们更详细地探讨使用 Python 从头开始构建一个简单搜索引擎的不同步骤。
1. 数据收集与预处理
数据收集可以通过多种方式完成。您可能需要使用诸如 beautifulsoup
等包从 HTML 网页抓取内容,或者直接使用 gspread
将您的脚本连接到 Google Sheets。
也许您已经拥有一个数据库,只需使用 PostgreSQL Python 连接器来访问并查询数据。
数据收集的 Python 代码因您的需求而异,但这里有一个使用 Beautiful Soup 进行网页抓取的示例。首先,您需要安装该包
pip install beautifulsoup4
代码示例如下:
import requests from bs4 import BeautifulSoup url = "https://example.com" response = requests.get(url) soup = BeautifulSoup(response.text, 'html.parser') # Extract data for item in soup.select('.item', limit=5): title = item.find('h2').text link = item.find('a')['href'] print(f"{title}: {link}")
数据收集后,需要进行预处理。此步骤可以在文档索引之前和之后进行。可能需要进行多次预处理尝试,以确保数据集正确索引并为最佳检索做好准备。
例如,包含表情符号、电子邮件和源链接的文本源可以预先清洗,以避免向系统添加不必要的信息。
在段落中,可以去除标点符号和停用词,并将句子转换为小写。
使用 Python,可以利用多个包进行数据解析、清洗和预处理。让我们来看看 NLTK 库,并用它来删除表情符号、电子邮件和标点符号
首先,安装该包
pip install nltk
现在您可以尝试以下脚本
import re import string from nltk.tokenize import word_tokenize # Sample text with punctuation, emojis, and emails text = """ Hello! 😊 This is a test [email protected]. Can you remove this? 👍 Also, check [email protected]! """ def clean_text(text): # Step 1: Remove emails text = re.sub(r'S+@S+', '', text) # Step 2: Remove emojis and symbols emoji_pattern = re.compile( "[" "U0001F600-U0001F64F" # Emoticons "U0001F300-U0001F5FF" # Symbols & pictographs "U0001F680-U0001F6FF" # Transport & map symbols "U0001F700-U0001F77F" # Alchemical symbols "U0001F780-U0001F7FF" # Geometric Shapes Extended "U0001F800-U0001F8FF" # Supplemental Arrows-C "U0001F900-U0001F9FF" # Supplemental Symbols and Pictographs "U0001FA00-U0001FA6F" # Chess Symbols "U0001FA70-U0001FAFF" # Symbols and Pictographs Extended-A "U00002702-U000027B0" # Dingbats "U000024C2-U0001F251" "]+", flags=re.UNICODE ) text = emoji_pattern.sub('', text) # Step 3: Remove punctuation text = text.translate(str.maketrans('', '', string.punctuation)) # Step 4: Tokenize and rejoin (optional, removes extra whitespace) tokens = word_tokenize(text) cleaned_text = ' '.join(tokens) return cleaned_text # Clean the text and make it lowercase cleaned_text = clean_text(text).lower() print("Original Text: ", text) print(" Cleaned Text: ", cleaned_text)
在某些情况下,可能需要自然语言处理 (NLP)。例如,公司列表中的“Impossible Foods”和“Impossible Foods Co.”都是同一家公司,因此您可以使用 NLP 将单词向量化,并根据它们的余弦相似度将结果统一为一个术语。
有时,过度的预处理可能会导致信息丢失。因此,最好的方法是先从简单的步骤开始。
一旦文档被索引,就可以用新的预处理信息进行更新。
2. 文档创建和索引
文档是信息单位(例如,文本、JSON、图像或结构化/非结构化数据),它们在索引上进行处理和存储。
此步骤涉及收集您希望在向量数据库中索引的数据源,并将其转换为文档。
例如,如果您使用 JSON 格式作为输入,您可以使用 LangChain Python 框架将其直接转换为文档列表。
首先,您需要在系统中安装 LangChain 包
pip install langchain
其次,您需要导入 JSONLoader 类并应用以下脚本
from langchain_community.document_loaders import JSONLoader loader = JSONLoader( file_path='./my_data.json', jq_schema='.messages[].content', text_content=False) data = loader.load()
输出应为一个文档列表,类似如下:
[Document(page_content='Bye!', 'seq_num': 1}), Document(page_content='Hello', 'seq_num': 2}), Document(page_content='See you later', 'seq_num': 3})]
文档创建后,可以将其添加到向量数据库中,例如 Chroma db。
Meilisearch 的 Python SDK 简化了流程,无需将您的源数据转换为文档或寻找数据库解决方案。您可以直接将 JSON 或 CSV 文件添加到 Meilisearch 向量数据库的索引中。
与 LangChain 类似,您首先需要在您的机器上安装 Meilisearch 包
pip install meilisearch
然后,您需要使用这个简单的命令创建一个索引
client.create_index('books', {'primaryKey': 'id'})
要将文档添加到索引中,您可以使用 JSON 格式,如下所示
client.index('movies').add_documents([{ 'id': 287947, 'title': 'Super Gut', 'author': 'Dr. William Davis', }])
使用同一个包,您还可以通过简单地更改函数来更新文档、应用筛选和删除文档
# apply filter client.index('books').update_filterable_attributes(['author']) # update documents client.index('books').update_documents(<list_of_documents>) # delete documents client.index('books').delete_all_documents()
使用 Meilisearch 的 Python SDK,可以添加多个索引,并且所有功能都易于理解和实现。
我们的 GitHub 仓库上提供了一些示例;另外,您也可以查阅 API 文档获取更多信息。
3. 添加搜索系统
如果您使用 LangChain 方法结合自定义向量数据库,则必须使用深度学习 (DL) 算法嵌入文档。这会创建数据的向量表示,从而实现向量搜索、混合搜索、语义搜索等。
Hugging Face 和 OpenAI API 提供了多种嵌入模型。
例如,让我们使用 OpenAI 嵌入模型与 LangChain 和 Chroma 作为向量数据库。您首先需要安装这些包
pip install langchain-chroma
pip install langchain-openai
导出您的 OpenAI 密钥并添加以下内容
from langchain_chroma import Chroma from langchain_openai import OpenAIEmbeddings db = Chroma.from_documents(documents, OpenAIEmbeddings())
上述命令使用 OpenAIEmbeddings 类嵌入文档,并在 Chroma 数据库中创建一个索引。现在您可以查询 db
实例了
query = "Find a book about Nutrition" docs = db.similarity_search(query) print(docs[0].page_content)
以上所有步骤都可以通过 Meilisearch 的 Python SDK 简化为一个步骤。
无需添加嵌入或为您的向量数据库寻找包。您只需使用以下函数直接在之前创建的索引上进行搜索即可
client.index('books').search('Find a book about Nutrition')
但这不止于此,您还可以像这样添加筛选器
client.index('books').search('nutrition', { 'filter': ['author = "Dr. William Davis"'] })
或者创建一个 分面搜索
client.index('movie_ratings').search('nutrition', { 'facets': ['authors', 'rating']})
您可以使用其他搜索选项来试验 API,例如指定要检索的文档数量、按语言环境查询,或实现混合搜索。
4. 结果排名
结果排名可能涉及复杂的机器学习 (ML) 算法,这些算法通常集成在 Python 库中,因此好消息是您无需从头开始创建它们。
例如,Chroma 使用一种称为分层可导航小世界 (HNSH) 的近似最近邻 (ANN) 算法来查找相似文档。
如果您想获取它们的分数并进行排序,您可以运行以下命令
results = docs.similarity_search_with_score(query="Find a book about Nutrition") for doc, score in results: print(f"{score}: {doc.page_content}"}
然而,这份文档在结果排名方面相当有限。更好的方法是使用 Meilisearch 排名规则,它们更直接。
默认情况下,可以调整的排名规则如下:
- “words”(单词): 按匹配查询词数量的降序对结果进行排序
- “typo”(拼写错误): 按拼写错误数量的升序对结果进行排序
- “proximity”(邻近度): 按匹配查询词之间距离的升序对结果进行排序
- “attribute”(属性): 根据属性排名顺序对结果进行排序
- “sort”(排序): 根据查询时确定的参数对结果进行排序
- “exactness”(精确度): 根据匹配词与查询词的相似性对结果进行排序。
我们可以看到,排名机制不仅仅是简单的相似性。要对结果进行排名,您只需根据需要更改查询中这些术语的顺序
client.index('movies').update_ranking_rules([ 'typo', 'words', 'sort', 'proximity', 'attribute', 'exactness', 'release_date:asc', 'rank:desc' ])
您现在可以搜索特定数量的结果(限制),其相关性将基于更新后的排名顺序。
此功能更易于实现,并考虑了许多其他规则。Meilisearch 简化了排名过程,无需探索多个库或从头创建排名算法。
我可以在 Python 中免费构建搜索引擎吗?
您可以使用 Python 框架,例如 LangChain,并搭配 Chroma 等开源向量数据库。然而,这种策略存在局限性,例如排名机制有限,并且需要额外的步骤和预处理。
为了便于实施、更多自定义和快速文档检索,最好的方法是使用自托管 Meilisearch。您可以使用自己的机器或 VPS,这需要支付费用。
您还可以通过14 天免费试用来免费访问 Meilisearch Cloud。
适用于 Python 的最佳开源搜索引擎有哪些?
最好的开源搜索引擎拥有全面的文档和庞大的开发者社区,他们分享问题和成果。
开源搜索引擎工具也应该易于设置,并为社区提供示例。以下是支持 Python 的三个主要开源平台:
Meilisearch
Meilisearch 是一款开源、极速的搜索引擎,专为希望通过其 RESTful API 将直观、可扩展的搜索体验嵌入到应用程序中的开发者和企业设计。
它专注于简洁和性能,提供高级功能,例如容错和分面搜索。
文档清晰、易于理解,并附有示例。还有一个 Discord 群组供开发者分享工作或寻找解决方案,以及一个结构良好的 GitHub 仓库。
Qdrant
Qdrant 是一个用 Rust 构建的开源向量数据库和向量搜索引擎。它能高效处理高维向量上的相似性搜索,非常适合推荐系统、语义搜索和异常检测等任务。
Qdrant 的 RESTful API 支持多种语言,包括 Python。其文档非常庞大,当您需要找到构建 Python 搜索引擎的正确步骤时可能会感到不知所措。但是,它也提供了代码示例、一个 GitHub 仓库和一个 Discord 社区。
Elasticsearch
Elasticsearch 是一个开源的分布式搜索和分析引擎,拥有可扩展的数据存储和向量数据库,适用于各种用例。
Elasticsearch 的 Python 客户端文档完善,并提供了正确的教程,可无缝开始构建搜索引擎。
他们有一个 GitHub 仓库,您可以在其中找到示例、更多关于 Python SDK 的信息,以及一个在 GitHub 上的工单系统来解决问题。
Elasticsearch 还提供了一个 Python DSL 模块,旨在帮助以更方便、更地道的方式编写和运行针对 Elasticsearch 的查询。
除了 Python,还有哪些编程语言可以用于构建搜索引擎?
Python 并不是唯一可以构建 AI 驱动的搜索引擎的编程语言。一些常用的编程语言包括:
-
JavaScript: 了解如何在 JavaScript 中构建搜索引擎。
-
PHP: 了解如何在 PHP 中构建搜索引擎。
-
Golang: 了解如何使用 Golang 构建搜索引擎。
使用 Meilisearch 构建高性能 Python 搜索引擎
在设置 Python 搜索引擎时,我们意识到拥有一个集成向量数据库、能够无缝嵌入文档并提供方便的筛选和排名工具的统一包的重要性。
使用多个库和 Python 框架可能会让人感到不知所措,导致问题多于解决方案。这些框架在您能做的事情上可能有限制,这可能迫使您切换到另一个框架或从头开始构建,这两种情况都可能耗费时间和资源。
清晰性、良好的文档和易用性是构建高性能 Python 搜索引擎的关键。您无需掌握多个框架、库,也无需在无数论坛和 YouTube 视频中寻找信息。