elasticsearch安装与使用(2)-基于term匹配的简单搜索引擎搭建

ops/2024/10/17 22:13:03/

把一篇pdf论文解析后,放入es数据库中,建立倒排索引表,并实现简单搜索。

1、pdf论文解析(英文)

安装pdf解析包

pip install pdfminer.six
python">def extract_text_from_pdf(filename, page_numbers=None, min_line_length=1):'''从pdf文件中提取文字:param filename: pdf文件:param page_numbers: 指定页码,list:param min_line_length: 文本最小分隔长度:return:'''paragraphs = []buffer = ''full_text = ''# 提取全部文本for i, page_layout in enumerate(extract_pages(filename)):if page_numbers is not None and i not in page_numbers:continuefor element in page_layout:if isinstance(element, LTTextContainer):full_text += element.get_text() + '\n'# 按空行分隔,将文本重新组织成段落lines = full_text.split('\n')for text in lines:if len(text) >= min_line_length:buffer += (' ' + text) if not text.endswith('-') else text.strip('-')elif buffer:paragraphs.append(buffer)buffer = ''if buffer:paragraphs.append(buffer)return paragraphs

2、关键字提取

nltk安装见nltk安装与使用

python">import re
from nltk.stem import PorterStemmer
from nltk.tokenize import word_tokenize
from nltk.corpus import stopwordsdef keywords(text):'''提取文本关键字(简化版):param text: 一段字符串:return:'''# 提取所有字母数字,并替换所有非字母数字的字符为空格no_symbols = re.sub(r'[^a-zA-Z0-9\s]', ' ', text)# 分词word_tokens = word_tokenize(no_symbols)# 去停用词stop_words = set(stopwords.words('english'))filtered_words = [w for w in word_tokens if not w.lower() in stop_words]# 取词根ps = PorterStemmer()key_words = [ps.stem(w) for w in filtered_words]return ' '.join(key_words)

3、创建Elasticsearch连接,注意添加证书

Elasticsearch安装见elasticsearch安装与使用(1)-使用docker安装Elasticsearch

python">from elasticsearch import Elasticsearch, helpers
# 创建Elasticsearch连接
es = Elasticsearch(hosts=['https://localhost:9200'],  # 服务地址与端口basic_auth=("elastic", "N-sf6R*O0Ur344otTfzc"),  # 用户名,密码ca_certs="/Users/sunwenjun/data/elastic8/http_ca.crt"  # 证书
)

4、建立倒排索引库

python">def add_data_to_es(index_name="test_index", text_list=["text1","text2"]):'''建立索引,并往索引里添加数据:param index_name: 定义索引名称param paragraphs: 需要检索的文本列表  :return:'''# 如果索引已存在,删除它if es.indices.exists(index=index_name):es.indices.delete(index=index_name)# 创建索引es.indices.create(index=index_name)# 灌库指令actions = []for text in text_list:action = {"_index": index_name,"_source": {"keywords": keywords(text),"text": text}}actions.append(action)# 文本灌库res = helpers.bulk(es, actions)return res# 往es里添加数据
index_name = "index_test"
add_data_to_es(index_name, paragraphs)

索引库可视化见elasticsearch安装与使用(3)-索引库可视化

5、实现搜索

python">def search(index_name, query, top_n=3):'''查询:param index_name::param query::param top_n::return:'''search_query = {"match":{"keywords": keywords(query)}}search_res = es.search(index=index_name, query=search_query, size=top_n)results = [hit["_source"]["text"] for hit in search_res["hits"]["hits"]]return resultsquery = "retrieval "
results = search(index_name, query, 5)
for res in results:print(res)

5、完整代码

esdemo-01

参考

无需重新学习,使用 Kibana 查询/可视化 SLS 数据


http://www.ppmy.cn/ops/48057.html

相关文章

【Java刷题】二叉树

相同的树 public boolean isSameTree(TreeNode p, TreeNode q) {if(p null && q null) {return true;} else if(p ! null && q ! null) {if(p.val ! q.val) {return false;} else {return isSameTree(p.left, q.left) && isSameTree(p.right, q.rig…

设计模式-工厂方法(创建型)

创建型-工厂方法 简单工厂 将被创建的对象称为“产品”,将生产“产品”对象称为“工厂”;如果创建的产品不多,且不需要生产新的产品,那么只需要一个工厂就可以,这种模式叫做“简单工厂”,它不属于23中设计…

Java线程死锁

在Java中,线程死锁通常发生在两个或更多个线程相互等待对方释放资源的情况下。以下是一个简单的Java示例,展示了如何创建线程死锁: public class DeadlockDemo {// 定义两个资源private static Object resource1 new Object();private stat…

The Israeli-Palestinian conflict

目录 历史背景现代冲突的起源关键战争和事件巴勒斯坦内战和平进程和持续的冲突近年的局势 历史背景 古代历史:以色列和巴勒斯坦地区的历史可以追溯到几千年前。古代以色列王国和犹太人以及其他民族都在这片土地上生活过。 奥斯曼帝国:从16世纪到20世纪初…

51 单片机[6]:矩阵键盘及密码锁

一、认识矩阵键盘 在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式 采用逐行或逐列的“扫描”,就可以读出任何位置按键的状态 扫描的概念 数码管扫描(输出扫描) 原理:显示第1位→显…

ON DUPLICATE KEY UPDATE 子句

ON DUPLICATE KEY UPDATE 是 MySQL 中的一个 SQL 语句中的子句,主要用于在执行 INSERT 操作时处理可能出现的重复键值冲突。当尝试插入的记录导致唯一索引或主键约束冲突时(即试图插入的记录的键值已经存在于表中),此子句会触发一…

QuanTA: 一种新的高秩高效微调范式

QuanTA方法的核心是利用张量操作来模拟量子电路中的门操作。这些张量被设计为仅在特定的轴上应用,类似于量子电路中的单量子比特或双量子比特门。通过这种方式,QuanTA能够以高秩参数化来适应LLMs的权重矩阵。 网址:QuanTA: 一种新的高秩高效微…

系统架构设计师【论文-2016年 试题4】: 论微服务架构及其应用(包括写作要点和经典范文)

论微服务架构及其应用(2016年 试题4) 近年来,随着互联网行业的迅猛发展,公司或组织业务的不断扩张,需求的快速变化以及用户量的不断增加,传统的单块(Monolithic)软件架构面临着越来越多的挑战,…