GoFly快速开发框架集成ZincSearch全文搜索引擎-ZincSearch是ElasticSearch轻量级替代搜索引擎

news2024/10/24 13:05:21

前言

我们在项目开发中会遇到如下业务场景:

1. 电子商务:实现商品搜索与推荐、价格监控。
2. 日志分析:进行系统日志分析和网络流量监控。
3. 社交媒体:内容搜索与发现以及用户行为分析。
4. 企业知识管理:进行知识搜索与共享和文档版本管理。
5. 新闻媒体:实现新闻搜索与推荐以及热点话题追踪。
6. 金融领域:进行金融资讯搜索和风险监控预警。
7. 医疗领域:病历管理与检索以及医学文献搜索研究。

我们需要从海量的数据中快速找到需要的内容,如果我们用Mysql等数据库来处理处理复杂条件查询的方式的话,因为只能通过一个索引进行过滤,所以需要进行大量的 I/O 操作来读取行数据,并消耗 CPU 进行内存过滤,导致查询性能的下降。而且mysql数据库没有像全文搜索引擎为我们集成好分词器、高亮搜索等功能,如果使用mysql数据库我们需要自己开发好分词器、高亮搜索等功能,费时不说还有性能问题也是很影响应用使用体验。所以我们在需要对文本内容搜索时,需要使用到搜索和分析引擎。

说到搜索引擎大家可能就想到Elasticsearch(简称ES),虽然 Elasticsearch 是一款出色的产品,但它很复杂,需要大量资源,并且已有十多年的历史,它包太大(约1G),他是Java开发的安装需要配置JVM运行环境。所以我们就不用他了,我们选用一个用Go语言开发的轻量级ZincSearch 全文索引的搜索引擎,与 Elasticsearch 相比,它操作起来很简单,Elasticsearch 需要几十个 knobs 来理解和调整,你可以在 2 分钟内启动并运行,ZincSearch安装和运行都是单个二进制文件,二进制文件适用于多个平台的发行版,不需配置运行环境,运行内存不到 100 MB 的 RAM 。并且ZincSearch开发一套兼容Elasticsearch 的API,方便Elasticsearch 迁移到 Zinc 的应用。

ZincSearch特点:

  • 无模式索引
  • 资源利用率低
  • 用于查询用 Vue 编写的数据的 Web UI
  • 内置身份验证
  • 用于编程使用的简单 API
  • 与希望从 Elasticsearch 迁移到 Zinc 的应用程序兼容的 Elasticsearch API(单条记录和批量 API)。

ZincSearch使用文档

ZincSearch官方文档只有英文版,英文文档地址:https://zincsearch-docs.zinc.dev ,为了方便我们使用,GoFly社区把它翻译成中文并对使用相关内容进行补全,也是让大家能有个全面使用参考文档,帮助大家开发效率,这是我们翻译及gofly框架集成完善的文档:ZincSearch中文开发文档开发文档中我们对官方翻译同时结合开发实战得出经验结果对文档内容修改补全,并把实战示例代码也附到文档中,因此ZincSearch中文开发文档 可以更好指导开发。

GoFly框架对ZincSearch集成

如果你是在使用我们的GoFly快速开发框架,你可以更加简单 容易的使用ZincSearch了,我们把它封装成一个组件包,可以像使用ORM链式操作mysql一样使用ZincSearch,统一了代码风格可以提高开发效率和降低维护成本。

快速使用ZincSearch插件

在你安装好gofly快速开发框架后登录到管理后台,到开发者工具->代码仓,找到“Zinc全文搜索引擎”代码包进行安装,安装好后到数据中心->配置管理 找到ZincSearch配置项,把ZincSearch的账号、密码、访问路径配置好就可以使用了。

gofly框架在业务开发位置调用很简单,在import中引入gofly/utils/plugin扩展。

  • 在使用的位置引入插件

引入代码如下:

import (
  "gofly/utils/plugin"
)
  • 调用方法

 调用代码格式:plugin.ZincSearch().xx().方法(),例如: 

res, err := plugin.ZincSearch().Index().Insert("indexname", "fields")

使用时索引的添加、更新、删除、获取索引列表,文档数据的添加、更新、删除以及搜索使用直接到开发文档:GoFly框架使用ZincSearch文档说明 文档写的很详细,开发是复制示例代码过来改参数即可。

实例代码

把我们测试用的示例代码ZincSearch.go完整代码提供给大家做个参考,GoFly框架使用完整代码如下:

package createcode

import (
	"gofly/utils/gf"
	"gofly/utils/plugin"
)

// 测试ZincSearch全文搜索引擎接口
type ZincSearch struct{}

func init() {
	fpath := ZincSearch{}
	gf.Register(&fpath, fpath)
}

// 添加索引
func (api *ZincSearch) AddIndex(c *gf.GinCtx) {
	param, _ := gf.RequestParam(c)
	res, err := plugin.ZincSearch().Index().Insert(gf.String(param["name"]), param["fields"])
	if err != nil {
		gf.Failed().SetMsg("添加索引失败").SetData(err).Regin(c)
		return
	}
	gf.Success().SetMsg("添加索引成功").SetData(res).Regin(c)
}

// 获取索引
func (api *ZincSearch) GetList(c *gf.GinCtx) {
	param, _ := gf.RequestParam(c)
	list, err := plugin.ZincSearch().Index().Page(1, 10).FindName(gf.String(param["name"])).List()
	if err != nil {
		gf.Failed().SetMsg("添加索引失败").SetData(err).Regin(c)
		return
	}
	gf.Success().SetMsg("添加索引成功").SetData(list).Regin(c)
}

// 添加文档数据
func (api *ZincSearch) AddDoc(c *gf.GinCtx) {
	param, _ := gf.RequestParam(c)
	res, err := plugin.ZincSearch().Doc().Insert(gf.String(param["name"]), param["data"])
	if err != nil {
		gf.Failed().SetMsg(err.Error()).Regin(c)
		return
	}
	gf.Success().SetMsg("添加文档数据成功").SetData(res).Regin(c)
}

// 更新文档数据
func (api *ZincSearch) UpdateDoc(c *gf.GinCtx) {
	param, _ := gf.RequestParam(c)
	res, err := plugin.ZincSearch().Doc().Update(gf.String(param["name"]), param["id"], param["data"])
	if err != nil {
		gf.Failed().SetMsg(err.Error()).Regin(c)
		return
	}
	gf.Success().SetMsg("更新文档数据成功").SetData(res).Regin(c)
}

// 删除文档数据
func (api *ZincSearch) DelDoc(c *gf.GinCtx) {
	param, _ := gf.RequestParam(c)
	res, err := plugin.ZincSearch().Doc().Del(gf.String(param["name"]), param["id"])
	if err != nil {
		gf.Failed().SetMsg(err.Error()).Regin(c)
		return
	}
	gf.Success().SetMsg("删除文档数据成功").SetData(res).Regin(c)
}

// 测试api搜索
func (api *ZincSearch) ApiSearch(c *gf.GinCtx) {
	param, _ := gf.RequestParam(c)
	res, err := plugin.ZincSearch().Search().SetForm(0).SetSize(20).Highligh(gf.String(param["seachword"]), "title", "web")
	if err != nil {
		gf.Failed().SetMsg("测试api搜索失败").SetData(err).Regin(c)
		return
	}
	gf.Success().SetMsg("测试api搜索成功").SetData(res).Regin(c)
}

// 测试es搜索
func (api *ZincSearch) EsSearch(c *gf.GinCtx) {
	param, _ := gf.RequestParam(c)
	res, err := plugin.ZincSearch().EsSearch().SetSize(3).SetFields("title,content").Base(gf.String(param["seachword"]), "title,content", "web")
	if err != nil {
		gf.Failed().SetMsg("测试es搜索失败").SetData(err).Regin(c)
		return
	}
	gf.Success().SetMsg("测试es搜索成功").SetData(res).Regin(c)
}

// 测试http请求
func (api *ZincSearch) HttpZinc(c *gf.GinCtx) {
	data := `{
			"from": 0,
			"size": 10,
			"query":{
				"multi_match":{
					"query":"复仇者",
					"fields":["title","content"]
				}
			},
			"highlight": {
				"fields": {
					"title":{},
					"content":{}
				}
			}
		}`
	res, _ := gf.RequestHttp("POST", "http://localhost:4080/es/web/_search", data, gf.MapStrStr{"Content-Type": "application/json", "Authorization": "Basic YWRtaW46MTIzNDU2"})
	gf.Success().SetMsg("测试http请求").SetData(res).Regin(c)
}

如果你用的ZincSearch,但没有安装GoFly开始开发框架后台,那么你先到:GoFly全栈开发社区 下载安装框架,安装使用GoFly快速开发框架请参考框架对应文档,文档就在框架介绍那里,直接点击进出查看。好了ZincSearch搜索引擎使用就介绍到这里。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2222408.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信小程序上传图片添加水印

微信小程序使用wx.chooseMedia拍摄或从手机相册中选择图片并添加水印&#xff0c; 代码如下&#xff1a; // WXML代码&#xff1a;<canvas canvas-id"watermarkCanvas" style"width: {{canvasWidth}}px; height: {{canvasHeight}}px;"></canvas&…

如何使用 Spring Cloud 实现客户端负载平衡

微服务系统通常运行每个服务的多个实例。这是实施弹性所必需的。因此&#xff0c;在这些实例之间分配负载非常重要。执行此操作的组件是负载均衡器。Spring 提供了一个 Spring Cloud Load Balancer 库。在本文中&#xff0c;您将学习如何使用它在 Spring Boot 项目中实现客户端…

QPainterPath路径类

函数drawPath()绘制的是一个复合的图形&#xff0c;它使用一个QPainterPath类型的参数作为绘图的对象,QPainterPath类用于记录绘图的操作顺序&#xff0c;优点是绘制复杂图形时只需要创建一个painterpath,然后重复调用就可以了 在使用QPainterPath把路径画好之后&#xff0c;我…

脚本-把B站缓存m4s文件转换成mp4格式

js脚本&#xff0c;自动处理视频 1. 需求简介1.1 pc安装b站客户端1.2 设置视频缓存目录1.3 找个视频缓存1.4 打开缓存文件夹![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/0eb346a84d5f42a7908f1d39bf410c3b.png)1.5 用notepad编辑后缀m4s文件&#xff0c;删除文件内…

Windows系统启动MongoDB报错无法连接服务器

文章目录 发现问题解决办法 发现问题 1&#xff09;、先是发现执行 mongo 命令&#xff0c;启动报错&#xff1a; error: MongoNetworkError: connect ECONNREFUSED 127.0.0.1:27017&#xff1b; 2&#xff09;、再检查 MongoDB 进程 tasklist | findstr mongo 发现没有进程&a…

澳元/美元价格预测:不排除跌至0.6600的可能

澳元/美元一路下跌至0.6620附近。美元保持强劲上涨势头&#xff0c;升至创下三个月新高。汇价的下跌让关键的200日均线受到考验。 澳元/美元周三再度遭遇抛售兴趣&#xff0c;迅速扭转周二的多头尝试&#xff0c;滑落至0.6630附近的新低。这次急剧下跌也对关键的200日均线构成…

yjs机器学习常见算法01——KNN(02)Kd树

1.什么是Kd树&#xff0c;为什么要引入Kd树 knn是寻找k个邻近的点&#xff0c;在这个过程中&#xff0c;需要一个点一个点的与未分类点进行比较&#xff0c;这样的时间复杂度非常高&#xff0c;因此引入了一种原理类似二叉树的Kd树&#xff0c;以减少比较搜索的次数。 kd树的本…

PyTorch求导相关

PyTorch是动态图&#xff0c;即计算图的搭建和运算是同时的&#xff0c;随时可以输出结果&#xff1b;而TensorFlow是静态图。 在pytorch的计算图里只有两种元素&#xff1a;数据&#xff08;tensor&#xff09;和 运算&#xff08;operation&#xff09; 运算包括了&#xf…

Psychophysiology:脑-心交互如何影响个体的情绪体验?

摘要 情绪的主观体验与对身体(例如心脏)活动变化的情境感知和评估相关。情绪唤醒增加与高频心率变异性(HF-HRV)降低、EEG顶枕区α功率降低以及心跳诱发电位(HEP)振幅较高有关。本研究使用沉浸式虚拟现实(VR)技术来研究与情绪唤醒相关的脑心相互作用&#xff0c;以实现自然而可…

SSM考研科目学习APP-计算机毕业设计源码90377

摘 要 基于Android的考研科目学习系统的设计与实现&#xff0c;旨在为广大考研学子提供一个便捷、高效的学习平台。该系统充分利用Android操作系统的广泛普及与灵活定制性&#xff0c;结合考研科目的特点和需求&#xff0c;实现了个性化的学习方案、丰富的题库资源以及智能化…

【个人同步与备份】电脑(Windows)与手机/平板(Android)之间文件同步

文章目录 1. syncthing软件下载2. syncthing的使用2.1. 添加设备2.1.1. syncthing具备设备发现功能&#xff0c;因此安装好软件&#xff0c;只需确认设备信息是否对应即可2.1.2. 如果没有发现到&#xff0c;可以通过设备ID连接2.1.3. 设置GUI身份验证用户&#xff0c;让无关设备…

LeetCode: 3274. 检查棋盘方格颜色是否相同

一、题目 给你两个字符串 coordinate1 和 coordinate2&#xff0c;代表 8 x 8 国际象棋棋盘上的两个方格的坐标。   以下是棋盘的参考图。   如果这两个方格颜色相同&#xff0c;返回 true&#xff0c;否则返回 false。   坐标总是表示有效的棋盘方格。坐标的格式总是先…

大模型技术学习过程梳理,零基础入门到精通,收藏这一篇就够了

“ 学习是一个从围观到宏观&#xff0c;从宏观到微观的一个过程 ” 今天整体梳理一下大模型技术的框架&#xff0c;争取从大模型所涉及的理论&#xff0c;技术&#xff0c;应用等多个方面对大模型进行梳理。 01 — 大模型技术梳理 这次梳理大模型不仅仅是大模型本身的技术…

接口测试(八)jmeter——参数化(CSV Data Set Config)

一、CSV Data Set Config 需求&#xff1a;批量注册5个用户&#xff0c;从CSV文件导入用户数据 1. 【线程组】–>【添加】–>【配置元件】–>【CSV Data Set Config】 2. 【CSV数据文件设置】设置如下 3. 设置线程数为5 4. 运行后查看响应结果

vue3项目页面实现echarts图表渐变色的动态配置

完整代码可点击vue3项目页面实现echarts图表渐变色的动态配置-星林社区 https://www.jl1mall.com/forum/PostDetail?postId202410151031000091552查看 一、背景 在开发可配置业务平台时&#xff0c;需要实现让用户对项目内echarts图表的动态配置&#xff0c;让用户脱离代码也…

基于Matlab 人脸识别技术

Matlab 人脸识别技术 算法流程&#xff1a; 本系统运用PCA算法来实现人脸特征提取&#xff0c;然后通过计算欧式距离来判别待识别测试人脸&#xff0c;本个系统框架图如下&#xff1a; 图&#xff1a; 人脸识别系统框架图 整个系统的流程是这样的&#xff0c;首先通过图像采…

给哔哩哔哩bilibili电脑版做个手机遥控器

前言 bilibili电脑版可以在电脑屏幕上观看bilibili视频。然而&#xff0c;电脑版的bilibili不能通过手机控制视频翻页和调节音量&#xff0c;这意味着观看视频时需要一直坐在电脑旁边。那么&#xff0c;有没有办法制作一个手机遥控器来控制bilibili电脑版呢&#xff1f; 首先…

基于SpringBoot+Vue+uniapp的时间管理小程序的详细设计和实现(源码+lw+部署文档+讲解等)

详细视频演示 请联系我获取更详细的演示视频 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不…

【文件加密系统】华企盾DSC服务程序启动失败解决办法

问题原因&#xff1a; 1.sa账户密码错误导致连接数据数据库失败无法启动DSC服务 解决方法&#xff1a; 用windows身份验证进入数据库更改sa用户密码&#xff1a;安全性>登录名>sa>右键属性>更改密码 ※如果显示请输入秘钥更改&#xff0c;使用更改完密码的sa账户登…

从0开始深度学习(16)——暂退法(Dropout)

上一章的过拟合是由于数据不足导致的&#xff0c;但如果我们有比特征多得多的样本&#xff0c;深度神经网络也有可能过拟合 1 扰动的稳健性 经典泛化理论认为&#xff0c;为了缩小训练和测试性能之间的差距&#xff0c;应该以简单的模型为目标&#xff0c;即模型以较小的维度的…