ZincSearch Java 客户端教程

news/2024/5/17 13:34:54/文章来源:https://blog.csdn.net/zhangxin09/article/details/129337698

ZincSearch

Zinc 简单、强大,不了解的同学可以参见我之前的博客。今天我们这里谈谈 Java 环境如何集成 Zinc 客户端,跟如何使用的。

安装 Zinc

到 Github 的官方 Releases 下载:
在这里插入图片描述
我的是 Windows 开发环境,下载 zincsearch_0.4.1_Windows_x86_64.tar.gz,解压两次。Zinc 是 Go 程序,编译后一个 .exe 文件,之前它就启动的搜索引擎以及一个 Web 服务。

第一次运行 Zinc 之前,你需要设置一下环境变量,用于设置账号跟密码。设置过一次之后,就不用再设置环境变量了。

set ZINC_FIRST_ADMIN_USER=admin
set ZINC_FIRST_ADMIN_PASSWORD=Complexpass#123
mkdir data
zinc.exe

在这里插入图片描述
注意 cmd 应该在管理员的权限下执行。

成功启动后,在浏览器访问 http://localhost:4080,登录后如下图所示。

在这里插入图片描述

Zinc 搜索概念入门

Zinc 中的 document 文档概念,对应就是数据库中的“实体”。下面我们一律称之实体。所谓搜索数据库,实质就是冗余你 DBMS 的一份数据,你 MySQL/Oracle/SQLServer 有什么数据要搜索的,就怼到 Zinc 中去。自然,有了数据冗余就要涉及一致性的问题,或者说是同步的问题。当然我们采取的策略是,当业务层或者 ORM 层 CRUD 数据的时候,也同步地操作一次 Zinc 数据,通过这个客户端来完成,不用考虑额外的同步工作。

这里所谓同步的工作无非多一次的 CRUD 工作。我们来看看这个客户端能怎么完成 CRUD 的。

建立索引 index

在真正进入 SDK 之前,先说说 Zinc 的 index 概念。

Zinc 的 index,类似于数据库中的表(Table),所以建立索引也类似于我们数据库的建表(CREATE TABLE)操作,一样有名称、类型(type)等设置,当然结合搜索引擎的特性还有 index、sortable、aggregatable 等相关特性的设置字段。

Zinc 没有 SQL 这样的 DSL 操作语句,一切都是通过 HTTP 与 JSON 来交互操作。典型的一个索引定义如下 JSON Key/Value,首先有名称 name;还有设置参数 settings,不填则默认;最重要的,mappings 里面定义了每个 properties ,它相当于数据库的列定义(Column):

{"name": "web","storage_type": "disk","settings": {},"mappings": {"properties": {"@timestamp": {"type": "date","index": true,"store": false,"sortable": true,"aggregatable": true,"highlightable": false,"term_positions": false},"_id": {"type": "keyword","index": true,"store": false,"sortable": true,"aggregatable": true,"highlightable": false,"term_positions": false},"content": {"type": "text","index": true,"store": true,"sortable": false,"aggregatable": true,"highlightable": true,"term_positions": true},"title": {"type": "text","index": true,"store": true,"sortable": false,"aggregatable": false,"highlightable": true,"term_positions": true}}}
}

建立索引是使用 Zinc 的第一步。所谓建立索引,就是将上述 JSON POST 到 Zinc 的 API 接口中去。你用 Postman/curl 等工具固然可以,用 SDK/客户端也可以。但我更推荐用服务自带的 Web UI 去创建。
在这里插入图片描述
在这里插入图片描述

当前非常抱歉的是,我们的 Java SDK 暂时未对接 index 接口。故看官您还需自己到 Web UI 去创建 index。

使用 Java SDK

要求 Java1.8+。

Maven 依赖

请通过 Maven 引入本客户端。

<dependency><groupId>com.ajaxjs</groupId><artifactId>aj-zincsearch-sdk</artifactId><version>1.0</version>
</dependency>

我们的这个客户端很少依赖,除了自己写的一个工具库之外,还依赖 spring-core 的一些工具方法。注意这是 spring 的 core,不是全集,并不大。一般大家都用 Spring,所以默认选用了。如果你实在不想依赖 Spring,请告诉我,——去掉 Spring core 依赖问题也不大。

初始化设置

DocumentService docService = new DocumentService();
docService.setApi("http://localhost:4080");
docService.setUser("admin");
docService.setPassword("Complexpass#123");

源码

我们肯定是开源的,源码在:https://gitee.com/sp42_admin/ajaxjs/tree/master/aj-zincsearch-sdk。如有不足,请多提宝贵意见!

增删改查 CRUD

创建实体

创建实体,那么实体究竟是什么呢?——对于我们这个客户端而言,允许接收两种格式的实体:Map 和 Java Bean。这是 Java 编程里面最为常见的数据格式,分别对应的类型是:Map<String, Object>Object。最后实体均化作 JSON 传给 Zinc。

Zinc 创建一个实体,可以指定 id 的,也可以不指定,让 Zinc 生成随机字符作为 id。一般情况我们都是指定好实体的 id。这样有个好处便是,Zinc 搜索出来结果了,可以通过 id 返回给你的业务系统,晓得你系统内的所对应的实体如何。

一般而言,一个 index 里面的 id 应该保持唯一不重复,否则重复 id 都不晓得该取哪个结果。

我们客户端封装好的创建实体方法如下几个,位于 DocumentService 类。

/*** 创建实体* * @param target index 名称* @param bean   Java 实体 Bean* @return*/
public ZincResponse create(String target, Object bean);/*** 创建实体* * @param target index 名称* @param doc    Java 实体 Map* @return*/
public ZincResponse create(String target, Map<String, Object> doc);/*** 创建实体* * @param target index 名称* @param bean   Java 实体 Bean* @param id     实体 id* @return*/
public ZincResponse create(String target, Object bean, Serializable id);/*** 创建实体* * @param target index 名称* @param bean   Java 实体 Map* @param id     实体 id* @return*/
public ZincResponse create(String target, Map<String, Object> doc, Serializable id);

调用例子如下:

Map<String, Object> doc = ListUtils.hashMap("title", "AIGC带你看来自“天涯海角”的新种子");
doc.put("content", "央视新闻《开局之年“hui”蓝图》系列微视频,用AI视角,带您看两会。\r\n" + "\r\n"+ "目前,中国的水果产量稳居世界第一,国人的“果盘子”琳琅满目,瓜果飘香。而作为全球第一的肉类生产和消费大国,近十多年来,全国居民牛羊肉消费量也持续提升。未来的水果产业和牛羊养殖业什么样?让我们跟随AIGC,感受从田间走到舌尖的“新科技”。");ZincResponse resp =docService.create(target, doc);
assertNotNull(resp);resp = docService.create(target, doc, 2l);
assertNotNull(resp);

返回结果

既然是 HTTP API 请求,自然就有响应。我们是怎么封装响应结果的呢?很简单,基础封装 Bean,然后具体结果还是放在一个 Map 里面,请见 ZincResponse 类结构:

/*** Zinc API 返回的结果* * @author Frank Cheung sp42@qq.com**/
@Data
public class ZincResponse {/*** 正常返回结果的信息*/private String message;/*** 是否返回异常*/private Boolean hasError;/*** 异常信息*/private String errMsg;/*** 原始返回的 JSON*/private Map<String, Object> rawResult;
}

主要是调用 getHasError() 辨别成功与否;具体返回信息在 Map<String, Object> rawResult 里面,请用户针对具体的信息获取想要的内容,我们就不多封装了。

实体的更新

与创建不同,你必须指定实体之 id 来进行更新,——显然,如果没传,Zinc 哪知道修改哪个实体。

更新同样支持 Map<String, Object> 和 Java Bean 两种格式。

/*** 更新实体* * @param target index 名称* @param bean   Java 实体 Bean* @param id     实体 id* @return*/
public ZincResponse update(String target, Object bean, Serializable id);/*** 更新实体* * @param target index 名称* @param bean   Java 实体 Map* @param id     实体 id* @return*/
public ZincResponse update(String target, Map<String, Object> doc, Serializable id);

调用例子如下:

Map<String, Object> doc = ListUtils.hashMap("title", "222222222AIGC带你看来自“天涯海角”的新种子");
doc.put("content", "央视新闻《开局之年“hui”蓝图》系列微视频,用AI视角,带您看两会。\r\n" + "\r\n"+ "目前,中国的水果产量稳居世界第一,国人的“果盘子”琳琅满目,瓜果飘香。而作为全球第一的肉类生产和消费大国,近十多年来,全国居民牛羊肉消费量也持续提升。未来的水果产业和牛羊养殖业什么样?让我们跟随AIGC,感受从田间走到舌尖的“新科技”。");docService.update(target, doc, 2l);

注意,每次更新必须是“全量更新”,例如一则新闻有 title 和 content 字段,用户只修改了标题 title,content 内容不变,你还是要传 content 字段的。否则 Zinc 只保存了 title,content 就丢失了。所以你必须在 JSON 提交完整的实体数据,在 Update 的操作中。

实体的删除

删除很简单。

/*** 删除实体* * @param target index 名称* @param id     实体 id* @return*/
public ZincResponse delete(String target, Serializable id) ;

调用例子如下:

ZincResponse resp = docService.delete(target, 2l);
assertNotNull(resp);

批量操作

TODO

搜索 Search

TODO

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

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

相关文章

基于ANSYS的无约束梁的模态分析与实验结果比较

一、实验模型简介 该模型来源于文献&#xff1a;“Khatir, A., Capozucca, R., Khatir, S. et al. Vibration-based crack prediction on a beam model using hybrid butterfly optimization algorithm with artificial neural network. Front. Struct. Civ. Eng. 16, 976–98…

蓝桥杯第十四届校内赛(第三期) C/C++ B组

一、填空题 &#xff08;一&#xff09;最小的十六进制 问题描述   请找到一个大于 2022 的最小数&#xff0c;这个数转换成十六进制之后&#xff0c;所有的数位&#xff08;不含前导 0&#xff09;都为字母&#xff08;A 到 F&#xff09;。   请将这个数的十进制形式作…

【mysql是怎样运行的】-InnoDB行格式

文章目录1 指定行格式的语法2 COMPACT行格式2.1 变长字段长度列表2.2 NULL值列表2.3 记录头信息&#xff08;5字节&#xff09;2.4 记录的真实数据3 Dynamic和Compressed行格式1 指定行格式的语法 CREATE TABLE 表名 (列的信息) ROW_FORMAT行格式名称ALTER TABLE 表名 ROW_FOR…

【C++知识点】位运算

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 &#x1f4da;专栏地址&#xff1a;C/C知识点 &#x1f4e3;专栏定位&#xff1a;整理一下 C 相关的知识点&#xff0c;供大家学习参考~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;…

C语言刷题(4)——“C”

各位CSDN的uu们你们好呀&#xff0c;今天小雅兰的内容又到了我们的复习啦&#xff0c;那么还是刷题噢&#xff0c;话不多说&#xff0c;让我们进入C语言的世界吧 BC55 简单计算器 BC56 线段图案 BC57 正方形图案 BC58 直角三角形图案 BC59 翻转直角三角形图案 BC60 带空格…

主流机器学习平台调研与对比分析

梗概 本报告主要调研目前主流的机器学习平台&#xff0c;包括但不限于Amazon的Sage maker&#xff0c;Alibaba的PAI&#xff0c;Baidu的PaddlePaddle。对产品的定位、功能、实践、定价四个方面进行详细解析&#xff0c;并通过标杆对比分析提出一套机器学习平台评价体系&#x…

39. 实战:基于api接口实现视频解析播放(32接口,窗口化操作,可导出exe,附源码)

目录 前言 目的 思路 代码实现 需要导入的模块 1. 导入解析网站列表&#xff0c;实现解析过程 2. 设计UI界面 3. 设置窗口居中和循环执行 4. 注意事项 完整源码 运行效果 总结 前言 本节将类似34. 实战&#xff1a;基于某api实现歌曲检索与下载&#xff08;附完整…

Gateway网关选型

网关一般分为流量网关和业务网关&#xff0c;流量网关负责接入所有的流量&#xff0c;并分发给不同的子系统&#xff0c;那在具体的业务接入之前&#xff0c;还有一层业务网关。流量网关提供全局性的、与后端业务应用无关的策略&#xff0c;例如 HTTPS证书卸载、Web防火墙、全局…

【2021.12.28】ctf逆向中的迷宫问题(含exe及wp)

【2021.12.28】ctf逆向中的迷宫问题&#xff08;含exe及wp&#xff09; 文章目录【2021.12.28】ctf逆向中的迷宫问题&#xff08;含exe及wp&#xff09;1、迷宫简介&#xff08;1&#xff09;简单例子&#xff08;2&#xff09;一般的迷宫代码2、二维迷宫&#xff08;1&#xf…

数据是如何在计算机中存储的

我们普通人对于数据存储的认识恐怕大多数都是从自己使用的电脑来的。现在几乎人手一台电脑,而我们的电脑存储着各种各样的文件,比如视频文件、音频文件和Word文档等。这些文件从计算机术语的角度都可以称为数据。 如图1-1所示是Windows 10 “我的电脑”的截图。通过该截图我…

AQS为什么用双向链表?

首先&#xff0c;在AQS中&#xff0c;等待队列是通过Node类来表示的&#xff0c;每个Node节点包含了等待线程的信息以及等待状态。下面是Node类的部分源码&#xff1a;static final class Node {// 等待状态volatile int waitStatus;// 前驱节点volatile Node prev;// 后继节点…

十一、GoF之代理模式

1 对代理模式的理解 【在程序中&#xff0c;对象A和对象B无法直接交互时。】 【在程序中&#xff0c;功能需要增强时。】 【在程序中&#xff0c;目标需要被保护时】 业务场景&#xff1a;系统中有A、B、C三个模块&#xff0c;使用这些模块的前提是需要用户登录&#xff0c;也…

总结磁共振成像的脑龄预测的人工智能模型

脑龄预测的人工智能模型 介绍基于神经影像的BA预测BA预测建模:从统计方法到DL统计方法使用统计/最大似然估计方法的BA研究的主要结果深度学习使用DL方法进行BA研究的主要结果可解释的人工智能(即可解释的深度学习方案)可解释的能力(Interpretability,)、可因果性和可解释性…

Scrapy框架(高效爬虫)

文章目录一、环境配置二、创建项目三、scrapy数据解析四、基于终端指令的持久化存储1、基于终端指令2、基于管道3、数据同时保存至本地及数据库4、基于spider爬取某网站各页面数据5、爬取本页和详情页信息&#xff08;请求传参&#xff09;6、图片数据爬取ImagesPipeline五、中…

OpenGL中的坐标系

1、2D笛卡尔坐标系2D笛卡尔坐标系跟我们高中的时候学习的坐标系一样&#xff0c;是由x、y决定的。2、3D笛卡尔坐标系3D笛卡尔坐标系坐标由x、y、z决定&#xff0c;满足右手定则。3、视口glViewport(GLint x,GLint y,GLsizei width,GLsizei height)窗口和视口大小可以相同&#…

【2023unity游戏制作-mango的冒险】-前六章API,细节,BUG总结小结

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 秩沅 原创 收录于专栏&#xff1a;unity游戏制作 ⭐mango的冒险前六章总结⭐ 文章目录⭐mango的冒险前六章总结⭐&#x1f468;‍&a…

【图神经网络】李宏毅

GNN 引入 假如要预测一个人是否是凶手。可以通过每个角色的特征训练出一个分类器。 有没有我们忽略的信息&#xff0c;或者我们可以利用但没有完全利用的信息。就是角色的关系。 这些角色关系可以让我们在做分类的时候获得一些额外的信息&#xff0c;可以帮助我们做更好的mode…

一文带你入门,领略angular风采(上)!!!

话不多说&#xff0c;上代码&#xff01;&#xff01;&#xff01; 一、脚手架创建项目 1.安装脚手架指令 npm install -g angular/cli 2.创建项目 ng new my-app(ng new 项目名) 3.功能选择 4.切换到创建好的项目上 cd my-app 5.安装依赖 npm install 6.运行项目 npm start或…

Trace、Metrics、Logging 选型

背景分布式追踪的起源自从微服务的兴起开始&#xff0c;整个系统架构开始变得极为庞大和复杂&#xff0c;但是服务之间的调用关系&#xff0c;调用消耗时间等等信息却依然是半黑盒的状态。为了能够将调用的链路进行串联&#xff0c;将系统的各种指标数据展示出来以使得系统的链…

NLP预训练模型

Models Corpus RoBERTa: A Robustly Optimized BERT Pretraining Approach 与BERT主要区别在于&#xff1a; large mini-batches 保持总训练tokens数一致&#xff0c;使用更大的学习率、更大的batch size&#xff0c;adam β20.98\beta_20.98β2​0.98&#xff1b;dynamic ma…