当前位置: 首页 > news >正文

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

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

1、pdf论文解析(英文)

安装pdf解析包

pip install pdfminer.six
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安装与使用

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

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、建立倒排索引库

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、实现搜索

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 数据

相关文章:

  • debian常用命令
  • 一键开启:盲盒小程序里的梦幻奇遇
  • The 18th Northeast Collegiate Programming Contest(5/9/13)
  • 【ARM Cache 及 MMU 系列文章 6 -- Cache 寄存器 CTR | CLIDR | CCSIDR | CSSELR 使用详解 1】
  • 记忆化搜索汇总
  • JS逆向-B站评论数据w_rid参数和wts参数
  • 人机交互中的阴差阳错
  • pytorch数学操作
  • 嵌入式软件跳槽求指导?
  • 学习数据分析思维的共鸣
  • 1V1音视频实时互动直播系统
  • Linux系统编程学习笔记--第五章
  • 【C语言从入门到入土】第三章流程控制
  • PyTorch 相关知识介绍
  • Oracle创建索引的LOGGING | NOLOGGING区别
  • 【刷算法】求1+2+3+...+n
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • Docker 笔记(2):Dockerfile
  • egg(89)--egg之redis的发布和订阅
  • FineReport中如何实现自动滚屏效果
  • javascript从右向左截取指定位数字符的3种方法
  • JS函数式编程 数组部分风格 ES6版
  • Kibana配置logstash,报表一体化
  • mysql_config not found
  • MySQL的数据类型
  • Node项目之评分系统(二)- 数据库设计
  • React as a UI Runtime(五、列表)
  • XML已死 ?
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 理清楚Vue的结构
  • 前端之Sass/Scss实战笔记
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • ​一些不规范的GTID使用场景
  • #QT(串口助手-界面)
  • #数据结构 笔记一
  • ${ }的特别功能
  • (+4)2.2UML建模图
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (待修改)PyG安装步骤
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (规划)24届春招和25届暑假实习路线准备规划
  • (六)激光线扫描-三维重建
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (转)visual stdio 书签功能介绍
  • *p++,*(p++),*++p,(*p)++区别?
  • .NET Micro Framework初体验(二)
  • .NET 反射的使用
  • .net 怎么循环得到数组里的值_关于js数组