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

ZincSearch Java 客户端教程

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

相关文章:

ZincSearch Java 客户端教程

ZincSearch Zinc 简单、强大&#xff0c;不了解的同学可以参见我之前的博客。今天我们这里谈谈 Java 环境如何集成 Zinc 客户端&#xff0c;跟如何使用的。 安装 Zinc 到 Github 的官方 Releases 下载&#xff1a; 我的是 Windows 开发环境&#xff0c;下载 zincsearch_0.4…...

数据结构(一)(嵌入式学习)

数据结构干货总结&#xff08;一&#xff09;基础线性表的顺序表示线性表的链式表示单链表双链表循环链表循环单链表循环双链表栈顺序存储链式存储队列队列的定义队列的常见基本操作队列的顺序存储结构顺序队列循环队列队列的链式存储结构树概念二叉树二叉树的创建基础 数据&a…...

合成复用原则-快速理解

什么是合成/聚合复用原则&#xff1f; 合成/聚合复用原则是在一个新的对象里面使用一些已有的对象&#xff0c;使之成为新对象的一部分&#xff1b;新的对象通过向这些对象的委派达到复用已有功能的目的。 简述为&#xff1a;要尽量使用合成/聚合&#xff0c;尽量不要使用继承…...

Scala04 方法与函数

Scala04 方法与函数 Scala 中的也有方法和函数的概念。 Scala中的 方法 是类的一部分。 Scala中的 函数 是一个对象&#xff0c;可以赋值给变量。 在类中定义的函数就是方法 4.1 方法 Scala 中方法 与 Java 中类似&#xff0c;是组成类的一部分 4.1.1 语法结构 格式&#x…...

XJTUSE专业课与实验指南(已经开源)

文章目录XJTUSE专业课与实验指南大一小学期大二上课程实验大二下课程实验大二小学期大三上课程实验大三下课程实验XJTUSE专业课与实验指南 github地址&#xff1a;https://github.com/yijunquan-afk/XJTUSE-NOTES.git &#x1f4c4;写在前面 1️⃣ 本篇文章仅供参考&#xff0…...

Spring面试专题

讲师&#xff1a;邓澎波 Spring面试专题 1.Spring应该很熟悉吧&#xff1f;来介绍下你的Spring的理解 1.1 Spring的发展历程 先介绍Spring是怎么来的&#xff0c;发展中有哪些核心的节点&#xff0c;当前的最新版本是什么等 通过上图可以比较清晰的看到Spring的各个时间版本…...

【truncate、delete和drop的6大区别!】

在MySQL中&#xff0c;truncate、delete和drop是三个常用的命令&#xff0c;它们可以用于删除表或表中的数据&#xff0c;下面是它们的六大区别&#xff1a; 语法不同&#xff1a; truncate和delete是SQL语句&#xff0c;drop是DDL&#xff08;数据定义语言&#xff09;语句。…...

如何入门Vue:掌握Vue的核心概念和基本用法

Vue是一种流行的JavaScript框架&#xff0c;它可以让开发者更容易地构建响应式的用户界面。Vue的设计理念是简单易懂&#xff0c;它的核心库只关注视图层&#xff0c;可以与其它库或现有项目很好地结合。在本文中&#xff0c;我将介绍Vue的基础概念和如何开始使用Vue。Vue的基本…...

APM飞控使用动捕等外部定位

本文初次写于2023.03.03&#xff0c;pixhawk飞控应该是刷写了ArduPilot 4.1以上的版本。 机载计算机通过WIFI和vrpn_ros_client获取动捕系统&#xff08;vicon或者nokov&#xff09;的无人机定位数据&#xff08;x&#xff0c;y&#xff0c;z四元数&#xff09;&#xff0c;然…...

【vulhub漏洞复现】CVE-2013-4547 Nginx 文件名逻辑漏洞

一、漏洞详情影响版本 Nginx 0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7通过%00截断绕过后缀名的限制&#xff0c;使上传的php内容文件被解析执行。当Nginx得到一个用户请求时&#xff0c;首先对url进行解析&#xff0c;进行正则匹配&#xff0c;如果匹配到以.php后缀结尾的文件名&#x…...

Kubernetes中配置livenessProbe、readinessProbe和startupProbe

livenessProbe、readinessProbe和startupProbe作用kubelet使用livenessProbe&#xff08;存活探针&#xff09;来判断何时重启容器。例如&#xff0c;当程序中产生死锁的时候&#xff0c;程序还在运行&#xff0c;通过livenessProbe可以检测到程序已不能正常提供服务。这种情况…...

冰箱压缩机 方案

压缩机是制冷系统的心脏&#xff0c;它从吸气管吸入低温低压的制冷剂气体&#xff0c;通过电机运转带动活塞对其进行压缩后&#xff0c;向排气管排出高温高压的制冷剂气体&#xff0c;为制冷循环提供动力&#xff0c;从而实现压缩→冷凝→膨胀→蒸发 ( 吸热 ) 的制冷循环。压缩…...

一文带你入门,领略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或…...

SpringMVC 参数绑定(视图传参到控制器)

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…...

Three.js高级应用--利用Three.js+WebGL实现fbx和obj格式模型的自定义加载

通过对webgl和three.js的不断学习与实践&#xff0c;在三维应用场景建设过程中&#xff0c;利用Three.js与webgl配合可以实现大部分三维场景的应用需求&#xff0c;这一篇主要讲述如何利用Three.js加载已有的模型&#xff0c;支持的三维模型格式有.fbx和.obj&#xff0c;同时.o…...

Go struct

每个无名结构体类型的字面形式均由struct关键字开头&#xff0c;后面跟着用一对大括号{}&#xff0c;其中包裹着的一系列字段&#xff08;field&#xff09;声明。 一般来说&#xff0c;每个字段声明由一个字段名和字段类型组成。一个结构体类型的字段数目可以为0。struct {tit…...

Redis多线程模型源码解析

1. 配置启用多线程 默认情况下多线程是默认关闭的&#xff0c;如果想要启动多线程&#xff0c;需要在配置文件中做适当的修改。 修改redis.conf 文件如下 io-threads 4 #启用的 io 线程数量 io-threads-do-reads yes #读请求也使用io线程2 源码解析 进入到Redis的main入口函…...

搭建zabbix4.0监控服务实例

一.Zabbix服务介绍 1.1服务介绍 Zabbix是基于WEB界面的分布式系统监控的开源解决方案&#xff0c;Zabbix能够监控各种网络参数&#xff0c;保证服务器系统安全稳定的运行&#xff0c;并提供灵活的通知机制让SA快速定位并解决存在的各种问题。 1.2 Zabbix优点 Zabbix分布式监…...

Xcode 系统崩溃问题01

参考链接&#xff1a;https://www.5axxw.com/questions/content/x2zlpx 问题&#xff1a;崩溃提示&#xff1a; Message from debugger: The LLDB RPC server has crashed. You may need to manually terminate your process. The crash log is located in ~/Library/Logs/Dia…...

SpringMVC文件上传、下载、国际化配置

Java知识点总结&#xff1a;想看的可以从这里进入 目录3.6、文件上传、下载3.6.1、文件上传3.6.2、文件下载3.7、国际化配置3.6、文件上传、下载 3.6.1、文件上传 form 表单想要具有文件上传功能&#xff0c;其必须满足以下 3 个条件。 form 表单的 method 属性必须设置为 p…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

什么是EULA和DPA

文章目录 EULA&#xff08;End User License Agreement&#xff09;DPA&#xff08;Data Protection Agreement&#xff09;一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA&#xff08;End User License Agreement&#xff09; 定义&#xff1a; EULA即…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下&#xff0c;风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...

LabVIEW双光子成像系统技术

双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制&#xff0c;展现出显著的技术优势&#xff1a; 深层组织穿透能力&#xff1a;适用于活体组织深度成像 高分辨率观测性能&#xff1a;满足微观结构的精细研究需求 低光毒性特点&#xff1a;减少对样本的损伤…...

高考志愿填报管理系统---开发介绍

高考志愿填报管理系统是一款专为教育机构、学校和教师设计的学生信息管理和志愿填报辅助平台。系统基于Django框架开发&#xff0c;采用现代化的Web技术&#xff0c;为教育工作者提供高效、安全、便捷的学生管理解决方案。 ## &#x1f4cb; 系统概述 ### &#x1f3af; 系统定…...

【免费数据】2005-2019年我国272个地级市的旅游竞争力多指标数据(33个指标)

旅游业是一个城市的重要产业构成。旅游竞争力是一个城市竞争力的重要构成部分。一个城市的旅游竞争力反映了其在旅游市场竞争中的比较优势。 今日我们分享的是2005-2019年我国272个地级市的旅游竞争力多指标数据&#xff01;该数据集源自2025年4月发表于《地理学报》的论文成果…...