基于elasticsearch-8.8.2 kibana-8.8.2 搭建一个文搜图系统demo
数据来源是由 图片url,图片descript,图片keywords 外加一个id
基于此首先创建 索引,
keywords是一组由单词或词组 组成的一组数据,所以以数组形式压入数据:
descript 是由两条语句组合成的数据(针对图片的两种不同描述)
# 这里创建的keywords 数组元素类型为text,即可以模糊匹配
PUT /img-search/
{"mappings":{"properties":{"id":{"type": "long"},"keywords":{"type":"text"},"descript":{"type":"text"},"url":{"type":"keyword"}}}
}
#这里创建的keywords 数组元素为keyword ,只能是精确匹配数组中的元素
PUT /pic-search/
{"mappings":{"properties":{"id":{"type": "long"},"keywords":{"type":"keyword"},"descript":{"type":"text"},"url":{"type":"keyword"}}}
}
然后倒入提前准备好的数据:
curl -X POST "http://121.36.xxx.xx:xxxx/img-search/_bulk" -H "Content-Type: application/json" --data-binary "@data.json"
data.json 文件的内容如下:
# 格式需要严格按照如下形式
{"index":{"_index":"img-search","_id":"002"}}
{"id":1,"keywords":["fly","wing","bird","crane","egret","stretch","flight","large","spread","white","heron","beak","sky","cloudy"],"descript":"'white bird in flight over a grey background', 'white bird in flight on a white background'","url":"baidu.com"}
清空img-search 索引下的数据:
#kibana 界面操作
POST /img-search/_delete_by_query
{"query":{"match_all":{}}
}
在Elasticsearch中,处理某个字段有多个值的情况可以采用不同的方法,具体取决于你的查询需求以及数据的性质。以下是两种主要的方法
1.数组字段:将该字段创建为一个数组(或者Elasticsearch中的nested字段,更复杂的数据结构)。这种方法适用于字段的多个值之间具有关联性,你希望能够对这些值进行聚合、过滤和查询。例如,如果你有一个文档表示一本书,可以将作者字段设计为数组,以便容纳多位作者。
优点:
可以使用Elasticsearch的聚合功能对多个值进行分析。
可以更容易地进行复杂的查询,例如搜索包含指定作者的所有书籍。
缺点:
使用数组会增加索引的复杂性和存储开销
2.多个字段串连接:将多个值连接成一个长字符串,并将其作为单个字段存储。这种方法适用于字段的多个值之间没有关联性,或者你只关心字段的文本表示形式。你可以使用分隔符将多个值连接在一起。
优点:
索引和存储开销较低。
可以简化索引映射和查询。
缺点:
不适用于需要对多个值进行聚合或复杂查询的情况。
所以考虑到后期可能会对图片提取词进行聚合分类查询
这里选择数组类型存储keywords
#从指定API拉取图片
func mainDownload() {for _, p := range [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} {url := "http://www.xxx.com/getPhotoByKeywords?keyword=人物&cate=3&page=" + strconv.Itoa(p) // 替换为你要请求的 URL// 发起 GET 请求response, err := http.Get(url)if err != nil {fmt.Println("请求失败:", err)return}defer response.Body.Close()// 读取响应数据body, err := ioutil.ReadAll(response.Body)if err != nil {fmt.Println("读取响应数据失败:", err)return}type image struct {Id int `json:"id"`Title string `json:"title"`KeywordTags string `json:"keywordTags"`Url string `json:"url"`Cate int `json:"cate"`}type respStruct struct {Code int `json:"code"`Msg string `json:"msg"`Data []image `json:"data"`}// 打印响应数据fmt.Println("响应数据:")var r respStructerr = json.Unmarshal([]byte(body), &r)if err != nil {fmt.Println("json.Unmarshal", err)}//fmt.Println(r)//trans := &http.Transport{}for _, v := range r.Data {fmt.Println(v.Url, len(v.Url))re, err := http.NewRequest("GET", "https:"+v.Url, nil)if err != nil {fmt.Println("http.NewRequest err:", err)}fmt.Println("http.NewRequest url:", v.Url)re.Header.Set("Referer", "https://www.51mo.com")client := http.Client{}resp, err := client.Do(re)if err != nil {fmt.Println("client.Do image:", err)}defer resp.Body.Close()sindex := strings.Index(v.Url, ".com")eindex := strings.Index(v.Url, "?")fmt.Println("sindex_eindex:", sindex, eindex)fmt.Println(v.Url[sindex+5 : eindex])fileName := strings.Replace(v.Url[sindex+5:eindex], "/", "+", -1)// 创建图片文件file, err := os.Create("./pic/" + fileName)if err != nil {fmt.Println("os.Create err:", err)}defer file.Close()_, err = io.Copy(file, resp.Body)if err != nil {fmt.Println("io.Copy err:", err)}}}
}#将模型转化来的数据从excel 中读取出来写入data.json 文件作为写入es 的数据
func mainFormatData() {// 打开Excel文件xlFile, err := xlsx.OpenFile("shang.xlsx")if err != nil {log.Fatal(err)}// 遍历工作表for _, sheet := range xlFile.Sheets {fmt.Printf("工作表名称: %s\n", sheet.Name)// 遍历行for numIndex, row := range sheet.Rows {// 遍历单元格var key, keyval, descval, nameval stringfor columnIndex, cell := range row.Cells {if columnIndex == 0 {continue}text := cell.String()switch columnIndex {case 1:key = "keywords"//keyval = strings.Replace(text, `"`, `'`, -1)re := regexp.MustCompile(`([a-zA-Z])"([a-zA-Z])`)keyval = re.ReplaceAllString(text, "$1'$2")case 2:key = "descript"//descval = strings.Replace(text, `"`, `'`, -1)#下面这里将左右两边都是字母的双引号换为单引号re := regexp.MustCompile(`([a-zA-Z])"([a-zA-Z])`)descval = re.ReplaceAllString(text, "$1'$2")case 3:key = "name"nameval = text}fmt.Printf("第 %d 个 %s :%s\t", numIndex, key, text)}_num := numIndex + 801_i := map[string]any{"index": map[string]string{"_index": "img-search","_id": strconv.Itoa(_num),},}fmt.Println("descval", descval)_v := map[string]any{"id": _num,"keywords": keyval,"descript": descval,"name": nameval,}_jsonI, err := json.Marshal(_i)if err != nil {log.Fatal("json.Marshal I err:", err)}_jsonV, err := json.Marshal(_v)if err != nil {log.Fatal("json.Marshal V err:", err)}file, err := os.OpenFile("data.json", os.O_WRONLY|os.O_APPEND, 0666)if err != nil {log.Fatal("os.OpenFile err:", err)}defer file.Close()write := bufio.NewWriter(file)_g := strings.Replace(string(_jsonV), `\"`, `"`, -1)_y := strings.Replace(_g, `"[`, `[`, -1)_z := strings.Replace(_y, `]"`, `]`, -1)write.WriteString(string(_jsonI) + "\n")write.WriteString(_z + "\n")write.Flush()fmt.Println("\n")}}
}
最终data.json 中的数据如下:
{"index":{"_id":"1","_index":"img-search"}}
{"descript":["woman holding a yellow maple leaf on an orange background", "a smiling young woman with a yellow maple leaf"],"id":1,"keywords":["hold", "girl", "hand", "red", "autumn", "young", "leaf", "woman", "smile", "catch", "sweater", "face", "maple leaf", "autumn leave", "laugh", "yellow"],"name":"ai+upload+20230721+edit_cMSndoSirkfboFoQ.jpg"}
{"index":{"_id":"2","_index":"img-search"}}
{"descript":["group of people looking at the world around them", "group of people facing the earth, with some galaxy background"],"id":2,"keywords":["stand", "business suit", "earth", "world", "businessman", "man", "people", "person", "purple"],"name":"ai+upload+20230726+edit_0W7yMVLHVtVTLfcf.jpg"}
通过API接口将data,json 中的数据写入es
curl -X POST "http://121.36.xxx.xx:9201/img-search/_bulk" -H "Content-Type: application/json" --data-binary "@data.json"
#查看es某条索引下有多少数据,以及最大的文档ID/如果数据量正好等于最大文档ID 则说明导入数据没有缺失
GET /img-search/_search
{"aggs": {"max_id": {"max": {"field": "id"}}},"size": 0
}
#清空某条索引下所有的数据
POST /img-search/_delete_by_query
{"query":{"match_all":{}}
}
相关文章:
基于elasticsearch-8.8.2 kibana-8.8.2 搭建一个文搜图系统demo
数据来源是由 图片url,图片descript,图片keywords 外加一个id 基于此首先创建 索引, keywords是一组由单词或词组 组成的一组数据,所以以数组形式压入数据: descript 是由两条语句组合成的数据(针对图片的两种不同描述) # 这里创建的keywords 数组元素类型为text,即可以模糊匹…...
第26节-PhotoShop基础课程-形状工具组-画板
文章目录 前言1.基础图形1.正方形(shift/alt/两者加起来)2.描边3.合并形状 将多个图放在一个图层4.对齐只能在不同图层5.修改6.重叠,相交 2.多边形1.边数2.星形 3.直线工具1.正常2.箭头 4.自定义形状 前言 类似画图板,矢量图形。…...
第一次课,通过进程信息和服务信息识别当前计算机运行程序(预习版)
题目: 检测的目标进程: ydebugg ; “ImmunityDebugger.exe” _500], rax Exe ; “ollydbg.exe” _4F8], rax hackerE ; “ProcessHacker.exe” _4F0], rax Exe ; “tcpview.exe” _4E8], rax sExe ; “autoruns.exe” _4E0], rax scExe ; “autorunsc.ex…...
ChatGPT 或其它 AI,能用在文书创作上吗?
新的申请季已经正式开始,一些热门项目的ED截止日期也不再遥远,因此很多准留学生们都已经开始了关于文书的创作。 而随着科技的不断发展,以ChatGPT为首的一众AI工具也作为一种辅助手段愈发融入了我们的生活。 那么不免就会有一些同学在准备申…...
Java中锁的分类
Java中锁的分类 这篇文章介绍各种锁的分类。介绍的内容如下: 公平锁/非公平锁可重入锁独享锁/共享锁互斥锁/读写锁乐观锁/悲观锁分段锁偏向锁/轻量级锁/重量级锁自旋锁 上面是很多锁的名词,这些分类并不是全是指锁的状态,有的指锁的特性&am…...
centos安装flink,通过windows访问webui
1. 安装flink 1.1. flink的下载 通过flink官网下载flink安装包 https://flink.apache.org/ 下载安装包 1.2 flink在centos上的安装 将下载好的flink-1.17.1-bin-scala_2.12.tgz安装包放到centos目录下 解压文件: [rootlocalhost ~]# tar -zxvf flink-1.17.…...
如何让两台手机相互远程控制?
你的两台手机是什么系统的?如果你的两台手机都是安卓系统,而且都是安卓7.0及以上版本的系统,那么恭喜你,这两台手机可以相互远程控制! 你可以利用两个软件实现将两台手机相互远程控制的想法。为了避免混淆,…...
预编译为什么能防止SQL注入?一看你就明白了。预编译原理详解
「作者主页」:士别三日wyx 「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」:对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 预编译防止SQL注入 1、SQL执行过程2、预编译原理3、…...
【7z密码】7z压缩包密码忘记了,怎么办?i
7z压缩包设置了密码,解压的时候就需要输入正确对密码才能顺利解压出文件,正常当我们解压文件或者删除密码的时候,虽然方法多,但是都需要输入正确的密码才能完成。忘记密码就无法进行操作。 那么,忘记了7z压缩包的密码…...
部署云MYSQL(在线版)
在Methodot - 您的一站式云原生在线开发协作平台网站上可以部署免费的MYSQL,在应用商店里能看到可以搭建多种数据库:(前提是要注册登录,免费版只能是2人共享) 登陆好后,点击工作台,选择应用商店…...
Gin 框架 解决 跨域问题
Gin 框架解决跨域问题 一点废话 在学习 Axios 的时候发现 up 使用了一个网址来提供 json 数据。因为不想加什么公众号搞啥百度网盘的,然后又刚好会一点点 go,就想着自己用 gin 框架返回一个 json 到前端页面然后从这个页面获取 json 。 这是我的go代码…...
【Datawhale课程笔记-简单学点大模型】大模型的能力
大模型的能力 参考GITHUB:https://github.com/datawhalechina/so-large-lm/blob/main/第二章:大模型的能力.md 深入探讨GPT-3——这个具有代表性的大型语言模型的能力。我们的研究主要基于GPT-3论文中的基准测试,这些测试包括: …...
git使用说明
目录 前言1.安装1.1. windows1.1.1.git客户端1.1.2.配置git客户端1.1.3.安装TortoiseGit图形客户端1.1.4 关于文件换行问题 1.2.ubuntu1.2.1.ubuntu终端Git中文乱码1.2.2 git log中文乱码解决 2.建立版本库2.1.下载网上开源版本库2.1.1.复制下载地址2.1.2.使用命令行…...
【PowerQuery】PowerBI Pro账户的自动刷新
在数据和模型通过发布或者上传方式上传到PowerBI Pro中,如何来进行数据刷新呢?数据源依然在本地,而数据模型已经发布到PowerBI Pro云端服务中。如果数据源更新,我们的模型如何进行自动刷新呢? PowerBI Pro如果需要基于本地数据源更新进行模型更新需要部署相应的数据网关服…...
红黑树(思维导图详解版)
目录 资源已上传 实现代码 测试代码 资源已上传 部分图片 实现代码 注意判断是否为红黑树的代码实现,实现代码中红黑树的删除 #pragma once #include<iostream> using namespace std;enum Color_Type {Red,Black };template<class K,class V> str…...
javafx学习记录
1.布局 2.选择重写或实现方法(select methods to override/implements) ctrl o 3.javafx有init方法,start方法,stop方法 4.定义一个按钮,使用系统默认浏览器访问网站 5.使窗口的关闭栏,缩小扩屏栏,代码是倒数第二行 6.设置模态窗口,默认关闭模态的 下…...
友善Nona Pi开发板ubuntu22.04系统用Python3.8.17的pip安装PyQt5.15.2时报错“Q_PID”这个宏未定义的一种解决办法
安装命令: pip install PyQt55.15.2 --config-settings --confirm-license --verbose -i https://mirrors.aliyun.com/pypi/simple/ 遇到出错: 如图: 分析具体错误内容: These bindings will be built: Qt, QtCore, QtNetwo…...
HTML中name和class,id的区别和联系
在HTML中,name、class和id是用于标识和选择元素的属性。 区别: name属性:用于标识表单元素,特别是在提交表单时,用于识别表单数据。name属性可以在同一表单中的多个元素中重复使用。class属性:用于为一个…...
Google 开源库Guava详解(集合工具类)—Maps、Multisets、Multimaps
一、Maps Maps有许多很酷的实用程序,值得单独解释。 1、uniqueIndex Maps.uniqueIndex(Iterable,Function)解决了一个常见的情况,即有一堆对象,每个对象都有一些唯一的属性,并希望能够根据该…...
肖sir__mysql之介绍__001
mysql之介绍 一、认识数据库 (1)什么是数据库? 是存放数据的电子仓库。以某种方式存储百万条,上亿条数据,供多个用户访问共享。 如: (2)数据库分关系型数据库和非关系型数据库 a、…...
【实战项目开发技术分享】如何设置机器人禁行区/虚拟墙
文章目录 前言一、代价地图自定义图层1.1 Costmap组成1.2 costmap_2d1.3 实现过程1.3.1 安装插件1.3.2 在costmap_2d中插入障碍物1.3.3 修改launch文件1.3.4 设置障碍物坐标参数二、图像编辑器2.1 安装GIMP2.1.1 命令行方式安装2.1.2 使用图形界面安装GIMP:2.2 实现过程三、ro…...
每日一题~中序后序遍历构造二叉树
原题链接:106. 从中序与后序遍历序列构造二叉树 - 力扣(LeetCode) 题目描述: 思路分析: 后序遍历分析图 中序遍历分析图 不难看出后序遍历的结果中的最后一个元素就是根节点,倒数第二个元素则是根节点的…...
Sentinel整合Gateway
pom引入依赖<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency> <dependency><groupId>com.alibaba.cloud</groupId><artifactId>…...
线性dp,优化,272. 最长公共上升子序列
272. 最长公共上升子序列 - AcWing题库 熊大妈的奶牛在小沐沐的熏陶下开始研究信息题目。 小沐沐先让奶牛研究了最长上升子序列,再让他们研究了最长公共子序列,现在又让他们研究最长公共上升子序列了。 小沐沐说,对于两个数列 A 和 B&…...
基于Java+SpringBoot+Vue+uniapp点餐小程序(包含协同过滤算法和会员系统,强烈推荐!)
校园点餐小程序 一、前言二、我的优势2.1 自己的网站2.2 自己的小程序(小蔡coding)2.3 有保障的售后2.4 福利 三、开发环境与技术3.1 MySQL数据库3.2 Vue前端技术3.3 Spring Boot框架3.4 微信小程序 四、功能设计4.1 系统功能结构设计4.2 主要功能描述 五…...
ActiveMQ面试题(二)
文章目录 前言一、死信队列二、ActiveMQ 中的消息重发时间间隔和重发次数吗?总结 前言 死信队列ActiveMQ 中的消息重发时间间隔和重发次数吗? 一、死信队列 如果你想在消息处理失败后,不被服务器删除,还能被其他消费者处理或重试…...
解决Oracle SQL语句性能问题——SQL语句改写(in、not in、exists及not exists)
8. in改为join in为Oracle数据库支持的条件语法,该语法会使得代码看起来思路清晰,逻辑分明。该语法有时也会导致SQL语句产生次优的执行计划,而导致SQL语句的性能问题。因此,为了解决相关SQL语句的性能问题,有时我们需要通过join来改写和消除in,具体改写方法如下所示。 …...
列表对象复制属性到另一个列表对象 从List<Object>另一个List<Object>
目录 事件起因环境和工具解决办法结束语 事件起因 在写一个市级的项目时,遇到了一个问题,这个项目涉及的数据内容非常大,光是数据库文件的大小就已经达到了12G,数据的规模大致是在百万级的,光是我这次参与处理的数据就…...
Python基本情况
Python(发音:/ˈpaɪθən/ )是一种强大的编程语言,它简单易学,提供众多高级的数据结构,让我们可以面向对象进行编程。Python 的语法优雅,由于是一个解释性语言,更贴近人类自然语言&…...
【精华】AI Agent:大模型改变世界的“钥匙”
文章目录 1.Auto-GPT2.BabyAGI3.AgentGPT4.GodMode5.AI Town6.ChatDev 当前大模型的本质是大语言模型(Large Language Model, LLM)。相较于传统的自然语言处理模型,LLM通过无监督训练,从大量文本数据中学习自然语言的模式和结构&a…...
哪个设计网站做兼职好/守游网络推广平台
目前,人脸识别已经在门禁控制范围内得到广泛使用,人脸识别系统具有的便捷、安全、不易被复制冒用等特点,受到市场的青睐。而翼闸是作为人流通道的控制设备,用于人员出、入口需要进行控制的地方,可以使人流有序的通过通…...
做网红用哪个网站/必应搜索引擎网站
16年元旦顶着大风来北京面试,一天6轮,在回去的高铁上感觉面试可能挂了,一个礼拜后收到了Offer。由于自身各方面的原因,18年元旦,选择离开微软。It is hard to say LEAVE, 这里整理了一下我在微软的两年经历,…...
wordpress主题域名限制破解/seo单页面优化
首先我们先看流程图,了解一下大致结构。 其中,index.html文件为空白页,代码如下: <html> <head> <title> index </title> </head> </html> new1~3.html文件的作用是将页面背景颜色改变&…...
北京交易中心网站/什么是友情链接?
二叉树的镜像(十八) 题目描述 操作给定的二叉树,将其变换为源二叉树的镜像。 输入描述: 二叉树的镜像定义: 源二叉树 8/ \6 10/ \ / \5 7 9 11镜像二叉树8/ \10 6/ \ / \11 9 7 5代码(已在牛客上 AC) class Solution { public:void Mirror(…...
苏州制作网站的有几家/网站排名在线优化工具
(图片来源:网络) 2022年2月4日,由量子经济发展联盟(QED-C)和总部位于加利福尼亚州的量子软件和服务公司QC Ware赞助,欧洲量子工业联盟和加拿大量子工业协助的Hyperion Research进行的一项新研究…...
做网络推广自己建网站/品牌推广策划方案怎么写
2333213...