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

前言

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

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 createcodeimport ("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.mzph.cn/bicheng/57179.shtml

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

相关文章

Excel:Cells(Rows.Count, 1).End(xlUp).Row和Cells(Rows.Count, 1).End(xlUp)有什么区别

Cells(Rows.Count, 1).End(xlUp).Row 和 Cells(Rows.Count, 1).End(xlUp) 是 VBA 中用于定位 Excel 工作表中单元格的两种不同用法。以下是它们的区别: 1. Cells(Rows.Count, 1).End(xlUp).Row 功能: 这个表达式返回的是一个行号(Long 类型&#xff09…

聚类算法的代码解析与实现

谱聚类算法的代码解析与实现 本文将对一个基于未归一化拉普拉斯矩阵的谱聚类算法进行详细解析。该算法的实现源自 SpeechBrain 项目,适用于语音片段的聚类,例如语音分离、说话人识别等任务。我们将逐步分析代码的每个部分,并解释其背后的数学…

DS快速排序和归并排序的非递归实现(16)

文章目录 前言一、快排的非递归实现二、归排的非递归实现总结 前言 打破递归桎梏,迎接迭代解放! 一、快排的非递归实现 我们要替代递归,就要用到迭代或者循环,也就是说,其核心思想是不变的,只是换一种方式来…

使用 CDN 后 Apache 的日志记录客户真实 IP

经常搭建网站服务器的都知道,在给站点使用了 CDN 后 Web 应用的日志记录里就会只记录 CDN 节点 IP 了,这就没法看到真实客户请求 IP,对于日志分析、运维日常维护来说就有点儿麻烦了,今天明月结合在五洛云服务器上搭建的Apache环境…

ElementPlus-Table表格-单选--TypeScript进阶篇

今天看个例子&#xff0c;这个例子是ElementPlus的组件Table表格下面的单选 <template> <el-table ref"singleTableRef" :data"tableData" highlight-current-row style"width: 100%" current-change"hand…

探索C嘎嘎:模版初阶

前言&#xff1a; 小编在前文讲述了C的内存管理&#xff0c;下面我们来开始继续探索C&#xff0c;开启C又一个重要的内容&#xff0c;模版初阶的详解&#xff0c;代码时间到&#xff01; 目录 1.泛型编程 1.1.引子 1.2.泛型编程 2.函数模版 2.1.函数模版的概念 2.2.函数模版的格…

基于知识图谱的电子元器件问答系统

你还在为寻找电子元器件的相关信息头疼吗&#xff1f;作为一名程序员或电子工程师&#xff0c;在项目中经常需要快速查询电子元件的属性或关联关系。今天给大家介绍一个可以大大提升工作效率的神器——基于知识图谱的电子元器件问答系统。这不仅是你学习和工作的好帮手&#xf…

解读华为云Kuasar多沙箱容器技术,带来更强隔离性和安全性

摘要&#xff1a;沙箱技术的引入&#xff0c;为容器提供了更强的隔离性和安全性&#xff0c;成为云原生技术的重要组成部分。 本文来源 《华为云DTSE》第五期开源专刊&#xff0c;作者&#xff1a;华为云云原生开源团队研发工程师。 近年来&#xff0c;云原生容器技术飞速发展&…

1.5 ROS架构

到目前为止&#xff0c;我们已经安装了ROS&#xff0c;运行了ROS中内置的小乌龟案例&#xff0c;并且也编写了ROS小程序&#xff0c;对ROS也有了一个大概的认知&#xff0c;当然这个认知可能还是比较模糊并不清晰的&#xff0c;接下来&#xff0c;我们要从宏观上来介绍一下ROS的…

详解Java之异常

目录 防御式编程 捕获异常 基础语法 示例1 【不处理异常】 示例2 【使用try catch捕获异常】 示例3 【catch只能处理对应的异常】 示例4 【catch可以有多个】 示例5 【可以用一个catch捕获所有异常】 示例6 【finally一定会执行】 示例7 【使用try回收资源】 示例8 …

【iOS】YYModel

目录 什么是YYModel &#xff1f; 如何使用YYModel &#xff1f; 最简单的Model 与网络请求结合 属性为容器类的Model 白名单和黑名单 Model的嵌套 结语 什么是YYModel &#xff1f; YYModel是一个用于 iOS 和 macOS 开发的高性能的模型框架&#xff0c;主要用于对象和…

Lua条件语句

软考鸭微信小程序 过软考,来软考鸭! 提供软考免费软考讲解视频、题库、软考试题、软考模考、软考查分、软考咨询等服务 在Lua编程语言中&#xff0c;条件语句是控制程序执行流程的关键工具。它们允许开发者根据特定条件的真假来执行不同的代码块&#xff0c;从而实现复杂的逻辑…

STM32+DHT11温湿度传感器(含完整代码)

DHT11是一款常用的数字温湿度传感器&#xff0c;它通过单总线与微控制器通信&#xff0c;输出数字信号&#xff0c;使得数据采集和处理变得简单。本文将详细介绍如何使用STM32微控制器驱动DHT11传感器&#xff0c;并提供完整的代码实现。 DHT11传感器简介 DHT11传感器包含一个…

MYSQL的SQL优化

SQL优化是提高数据库查询性能的核心步骤&#xff0c;尤其在处理大规模数据时&#xff0c;SQL查询优化至关重要。优化的目标是减少查询执行时间、降低数据库服务器负载&#xff0c;并使系统在高并发场景下运行更加高效。SQL优化涉及从数据库设计、索引使用、查询重构、配置参数调…

鸿蒙网络编程系列24-Web组件与应用互操作示例

1. APP内嵌网页与应用互操作概述 在通常的APP开发中&#xff0c;经常会采用内嵌网页的形式&#xff0c;通过网页来展现丰富的动态内容&#xff0c;虽少了很多原生开发的功能&#xff0c;但是这么做无可厚非&#xff0c;毕竟APP需要适配的系统平台很多&#xff0c;比如安卓、苹…

mysql 主从安装

登录看第二篇 WINDOWS系统搭建MYSQL 8.0主从模式_windows mysql8.0.34主从配置-CSDN博客 Windows下MySQL8.0最新版本超详细安装教程_windowsserver安装mysql8.0-CSDN博客 启动两个服务 可执行文件路径一致问题解决&#xff1a; windows&#xff0c;同一台机器安装两个mysq…

【HarmonyOS NEXT】权限申请及应用设置页跳转

关键词&#xff1a;鸿蒙、程序访问控制、定位、应用详情页、startability、want 在app开发过程中&#xff0c;常进行系统权限的申请以提供设备访问或个性化功能&#xff08;如扫一扫、城市定位、剪贴板等&#xff09;&#xff0c;从而保障应用功能的完整性&#xff0c;那么本期…

Jupyter notebook和Conda使用

Jupyter notebook和Conda使用 文章目录 Jupyter notebook和Conda使用AnacondaJupyter notebook简介页面使用技巧编写格式自动补全查看函数文档魔术命令远程访问交互式 Anaconda Anaconda是一个开源的Python发行版本&#xff0c;其包含了conda、Python等180多个科学包及其依赖项…

stm32实现esp8266连接到TCP服务器(二)未完

1.2 连接到TCP Server 1.2.1 使用网络助手&#xff0c;设立TCP服务器 ​ 编辑 1.2.2 连接服务器 ATCIPSTART"TCP","192.168.1.18",8080 //指令&#xff0c;注意双引号逗号都要半角(英文)输入 CONNECT //结果&#xff1a;成功 OK //结果&#xff1a;成功 …

jmeter中用csv data set config做参数化2

在jmeter中&#xff0c;使用csv data set config进行参数化是很重要的一个功能&#xff0c;但是这个功能的使用需要十分仔细和小心&#xff0c;因为细节之处往往决定着结果的正确与否。 举例&#xff1a; 一个登录接口用加密密码登录&#xff0c;一个登录接口用原始密码登录。…