使用Python3.7结合Redisearch代替ElasticSearch实现的全文检索功能服务
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_105
“检索”是很多产品中无法绕开的一个功能模块,当数据量小的时候可以使用模糊查询等操作凑合一下,但是当面临海量数据和高并发的时候,业界常用 elasticsearch 和 lucene 等方案,但是elasticsearch对运行时内存有着最低限额,其运行时大小推荐 2G 以上的内存空间,并且需要额外的磁盘空间做持久化存储。
其实mongoDB 内置的正则匹配搜索文本以及自带的 text 索引和 search 关键字也是一套靠谱的解决方案,但是这一次我们带来一种更加高效经济的文本检索方案:Redisearch
下图是elasticsearch和redisearch的性能对比
Redis Modules 是 redis 4.0 引入的一种扩展机制,用户可以通过实现 redis module 提供的 C api 接口为 redis 服务添加定制化功能。 redisLab 也希望籍此来规范 redis 社区的 ecosystem 实现。
redis module 本身的版本独立于redis,并且以编译成动态加载库 .so 文件的方式 release, 不同版本的 redis 可以 load 同一版本 module.so 文件。
redis 提供了两种加载方式。可以通过 在 conf 文件中 加入 loadmodule /path/to/mymodule.so ,也可以在 redis-cli中使用命令 MODULE LOAD /path/to/panda.so 动态加载,MODULE UNLOAD 卸载。
特性
基于文档的全文索引。
高性能增量索引。
支持文档评分,文档字段(field) 权重机制。
支持布尔复杂查询。
支持自动补全。
基于 snowball 的词干分析,多语言支持。使用 friso 支持中文分词。
utf-8 字符集支持。
redis 数据持久化支持。
自定义评分机制。
其原理是在 redis 的 hashmap 基础上就可以很容易实现倒排索引的结构。redisearch 倒排索引除了实现了基础功能外,还引入了内存管理等优化功能。如果有兴趣可以阅读源码中的 src/inverted_index.c 部分
首先,安装Rediseach,记住一点你本地的redis服务版本必须在4.0以上,网上一大堆编译安装的攻略,繁琐又浪费时间,所以又到了Docker登场时间了,hub上有编译好的免费镜像供我们下载
docker pull redislabs/redisearch
下载后,直接在后台启动服务
docker run -d -p 6666:6379 redislabs/redisearch:latest
此时已经有一个docker容器在后台启动了,redis服务映射到了宿主的6666端口,我们来连接一下
redis-cli -h localhost -p 6666
检查 modules 是否成功加载
localhost:6666> MODULE list
1) 1) "name"
1) "ft"
2) "ver"
3) (integer) 10405
如果返回数组中存在 “ft” , 则表明 redisearch 已经成功加载。
Redisearch 的索引概念 与elasticsearch 的 index 类似,表示某一类文档资源单元。
这里我们定义了一个 SMARTX_VM 索引,其中存储的文档 包含 了 title 和 desc 两个 类型为 TEXT 的field。
FT.CREATE SMARTX_VM SCHEMA title TEXT WEIGHT 5.0 desc TEXT
然后向刚刚创建的这条索引加一个文档
FT.ADD SMARTX_VM vm-2019082911110001 1.0 LANGUAGE "chinese" FIELDS title "人工智能" desc "我在北京昌平学习人工智能"
LANGUAGE “chinese” 参数 表示 使用 中文分词器 处理文本。默认为英文
此时我们进行文档检索
FT.SEARCH SMARTX_VM "人工智能" LANGUAGE "chinese"
注意检索的时候也要指定语言,这里我们用中文分词,默认的英文分词是无法检索中文的
可以看到已经返回了我们想要的结果。
Redisearch 是一个高效,功能完备的内存存储的高性能全文检索组件, 十分适合应用在数据量适中, 内存和存储空间有限的环境。借助数据同步手段,我们可以很方便的将redisearch 结合到现有的数据存储中, 进而向产品提供 全文检索, 自动补全等服务优化功能。
使用python3和高性能全文检索引擎Redisearch进行交互
使用redisearch-python:https://github.com/RediSearch/redisearch-py
首先,安装
pip3 install redisearch
基本操作:
from redisearch import Client, TextField
# Creating a client with a given index name
client = Client('myIndex',host='localhost',port='6666')
# Creating the index definition and schema
client.create_index((TextField('title'), TextField('body')))
# Indexing a document
client.add_document('doc2', title = '你好', body = '我在北京学习人工智能',language='chinese')
# Simple search
res = client.search("人工智能")
print(res.docs[0].title)
可以看到,基本上和命令行中的操作方式没有太大区别,只是在search时不需要指定语言了,程序可以自主判断。
其实它的官方文档很简单,只是介绍了基本用法,但是你如果阅读了它的源码,发现一些常用操作它也进行了封装,比如
#删除索引
client.drop_index()
#获取当前索引的基本信息
client.info()
#删除文档
client.delete_document('doc2')
还是非常简单的,基本上,我们可以抛弃ES了,因为研发人员都是喜新厌旧的。
原文转载自「刘悦的技术博客」 https://v3u.cn/a_id_105
使用Python3.7结合Redisearch代替ElasticSearch实现的全文检索功能服务的更多相关文章
- Redisearch实现的全文检索功能服务
"检索"是很多产品中无法绕开的一个功能模块,当数据量小的时候可以使用模糊查询等操作凑合一下,但是当面临海量数据和高并发的时候,业界常用 elasticsearch 和 lucene ...
- EasySwoole+ElasticSearch打造 高性能 小视频服务系统
EasySwoole+ElasticSearch打造高性能小视频服务 第1章 课程概述 第2章 EasySwoole框架快速上手 第3章 性能测试 第4章 玩转高性能消息队列服务 第5章 小视频服务平 ...
- Elasticsearch强大的聚合功能Facet
在常规数据库中,我们都知道有一个sql就是group,分组.如果主表只有对应的一个列记录的分组的ID,那么还好统计,比如说每本书book表,有一个分类catId,记录是属于哪一类的书,那么直接按照ca ...
- python3 opencv3 实现基本的人脸检测、识别功能
一言不和,先上码子(纯新手,莫嘲笑) # encoding: utf-8 #老杨的猫,环境:PYCHARM,python3.6,opencv3 import cv2,os import cv2.fac ...
- Python3设置在shell脚本中自动补全功能的方法
本篇博客将会简短的介绍,如何在ubuntu中设置python自动补全功能. 需求:由于python中的内建函数较多,我们在百纳乘时,可能记不清函数的名字,同时自动补全功能,加快了我们开发的效率. 方法 ...
- elasticsearch更改mapping,不停服务重建索引(转)
原文:http://donlianli.iteye.com/blog/1924721?utm_source=tuicool&utm_medium=referral Elasticsearch的 ...
- ElasticSearch 索引模块——全文检索
curl -XPOST http://master:9200/djt/user/3/_update -d '{"doc":{"name":"我们是中国 ...
- ElasticSearch基础之查询功能
[01]查询类型: [02]基本查询和组合查询是参与打分的 1.创建映射: 注意事项:基于上面映射的创建: "type": "keyword" # 如果某个字段 ...
- python-django框架中使用docker和elasticsearch配合实现搜索功能
注意:系统环境为Ubuntu18 一.docker安装 0:如果之前有安装过docker使用以下命令卸载: sudo apt-get remove docker docker-engine docke ...
随机推荐
- Swift初探03 字符串操作
字符串操作 01 获取长度 var a = "he l lo" print(a.count) // 计算空格,输出7 02 String.Index类型 String.Index类 ...
- WinUI迁移到即将"过时"的.NET MAUI个人体验
迁移的初衷 本人平时是做.net相关的工作,对于.net技术栈也有一些了解,自从新的.net能够跨平台之后,之前也有跨平台的ui框架Xamarin,现在微软推出了.NET MAUI这个说是 统一了开发 ...
- Android 子线程 UI 操作真的不可以?
作者:vivo 互联网大前端团队- Zhang Xichen 一.背景及问题 某 SDK 有 PopupWindow 弹窗及动效,由于业务场景要求,对于 App 而言,SDK 的弹窗弹出时机具有随机性 ...
- CenterNet和CenterNet2笔记
CenterNet和CenterNet2笔记 CenterNet是基于anchor-free的一阶段检测算法 CenterNet2是CenterNet作者基于两阶段的改进 CenterNet(Obje ...
- PostMan 快快走开, ApiFox 来了, ApiFox 强大的Api调用工具
简介 为什么要用ApiFox呢, 一般现在程序员开发测试, 一般都是PostMan, PostWoman等Api调用工具, 我之前也是一直在用, 但是今天我发现了一款相比于Postman更加好用的工具 ...
- 在Winform开发中,使用Async-Awati异步任务处理代替BackgroundWorker
在Winform开发中有时候我们为了不影响主UI线程的处理,以前我们使用后台线程BackgroundWorker来处理一些任务操作,不过随着异步处理提供的便利性,我们可以使用Async-Awati异步 ...
- Solon 1.8.3 发布,云原生微服务开发框架
相对于 Spring Boot 和 Spring Cloud 的项目 启动快 5 - 10 倍 qps 高 2- 3 倍 运行时内存节省 1/3 ~ 1/2 打包可以缩小到 1/2 ~ 1/10(比如 ...
- Spring框架系列(2) - Spring简单例子引入Spring要点
上文中我们简单介绍了Spring和Spring Framework的组件,那么这些Spring Framework组件是如何配合工作的呢?本文主要承接上文,向你展示Spring Framework组件 ...
- HMS Core新闻行业解决方案:让技术加上人文的温度
开发者们,你希望用户如何获取新闻? 有的人靠手机弹窗知天下事,有的人则在新闻应用中尽览每一篇文章:有的人一目十行,有的人则喜欢细细咀嚼:有的人主动探索,有的人则想要应用投其所好. 科技在不断刷新着用户 ...
- BUUCTF-来首歌吧
来首歌吧 歌曲题目一般就是整个摩斯电码 看上面的样子应该就是摩斯电码解密一下 ..... -... -.-. ----. ..--- ..... -.... ....- ----. -.-. -... ...