
你可以使用数据结构、算法和库的组合,用 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 使用一种称为分层可导航小世界 (HNSW) 的近似最近邻 (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 视频中寻找信息。