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

es的优势

系列文章目录

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 Python 机器学习入门之pandas的使用


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 系列文章目录
  • 前言
  • 一、es为什么比mysql快
  • 二、使用步骤
    • 1.引入库
    • 2. es查询语法
  • 三,api功能
  • 总结


前言

总结es优势


一、es为什么比mysql快

  1. es是一个基于Lucene引擎库,基于内存,查询速度比mysql,这个是在存储方式的比较
  2. 第二是数据存储方式,倒排索引,存储方式,可以快速找到数据的大概位置,文档列表,利用二叉查询方法进行寻找方式
  3. es支持复杂的语法格式,寻找附近酒店,进行分页
  4. 缺点
  5. 过于占内存

二、使用步骤

1.引入库

代码如下(示例):

package com.cn;import com.alibaba.fastjson.JSON;
import com.cn.mapper.ESMapper;
import com.cn.pojo.Hotel;
import com.cn.pojo.TbHotel;
import com.cn.pojo.vo.TbHotelVo;
import org.apache.http.HttpHost;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.common.geo.GeoPoint;
import org.elasticsearch.common.unit.DistanceUnit;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder;
import org.junit.Test;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;@RunWith(SpringRunner.class)
@SpringBootTest
public class EsTest {@Autowiredprivate RestHighLevelClient client;@Autowiredprivate ESMapper esMapper;@BeforeEachvoid setUp() {this.client = new RestHighLevelClient(RestClient.builder(HttpHost.create("http://192.168.36.128:9200")));}@AfterEachvoid tearDown() throws IOException {this.client.close();}/*** 判断索引是否存在* @throws IOException*/@Testpublic void  getIndexRequest() throws IOException {GetIndexRequest request = new GetIndexRequest("tiantian");boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);System.out.println(exists?"不能再":"我问");}/*** 批量导入文档* @throws IOException*/@Testpublic void c() throws IOException {List<Hotel> hotels = new ArrayList<>();for (int i = 0; i < 50; i++) {Hotel hotel = new Hotel();hotel.setId(Long.valueOf(i));hotel.setAge(i);hotel.setAddress("我的地址方式"+i);hotel.setTime(new Date());hotel.setName("将来"+i);hotel.setLatLon("23.5","3"+i);hotel.setLocation("23.5","3"+i);hotels.add(hotel);}//批量导入BulkRequest bulkRequest = new BulkRequest();//转化文档for (Hotel hotel : hotels) {bulkRequest.add(new IndexRequest("tiantian").id(hotel.getId().toString()).source(JSON.toJSONString(hotel), XContentType.JSON));}//发送请求BulkResponse bulk = client.bulk(bulkRequest, RequestOptions.DEFAULT);System.out.println(bulk);}/*** 导入数据信息* @throws IOException*/@Testpublic void bulkRequest() throws IOException {BulkRequest bulkRequest = new BulkRequest();List<TbHotel> tbHotels = esMapper.selectList(null);for (TbHotel tbHotel : tbHotels) {TbHotelVo tbHotelVo = new TbHotelVo(tbHotel);bulkRequest.add(new IndexRequest("hotel").id(tbHotelVo.getId().toString()).source(JSON.toJSONString(tbHotelVo),XContentType.JSON));}client.bulk(bulkRequest,RequestOptions.DEFAULT);}/*** 查询所有文档信息* @throws IOException*/@Testpublic void testMatchAll() throws IOException {SearchRequest request = new SearchRequest("hotel");request.source().query(QueryBuilders.matchAllQuery());SearchResponse response = client.search(request, RequestOptions.DEFAULT);for (SearchHit hit : response.getHits().getHits()) {String source = hit.getSourceAsString();System.out.println(source);}}/*** 准确查询* @throws IOException*/@Testpublic void matchQuery() throws IOException {SearchRequest request = new SearchRequest("hotel");request.source().query(QueryBuilders.termQuery("price","189"));SearchResponse response = client.search(request, RequestOptions.DEFAULT);for (SearchHit hit : response.getHits().getHits()) {String sourceAsString = hit.getSourceAsString();System.out.println(sourceAsString);}}/*** 布尔查询方式* 查询名字叫做如家* 价格200* 地址在上海*/@Testpublic void boolQuery() throws IOException {SearchRequest request = new SearchRequest("hotel");BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();boolQuery.mustNot(QueryBuilders.rangeQuery("price").gte("400"));boolQuery.must(QueryBuilders.matchQuery("city","上海"));boolQuery.must(QueryBuilders.matchQuery("name","如家"));request.source().query(boolQuery);for (SearchHit hit : client.search(request, RequestOptions.DEFAULT).getHits().getHits()) {String sourceAsString = hit.getSourceAsString();System.out.println(sourceAsString);}}/*** bool查询方式* @throws IOException*/@Testpublic void testBoole() throws IOException {SearchRequest request = new SearchRequest("hotel");BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();boolQuery.must(QueryBuilders.matchQuery("name","如家"));request.source().query(boolQuery);for (SearchHit hit : client.search(request, RequestOptions.DEFAULT).getHits()) {System.out.println(hit.getSourceAsString());}}/*** 根据经纬度查询方式* @throws IOException*/@Testpublic void geoPoint() throws IOException {SearchRequest request = new SearchRequest("hotel");request.source().sort(SortBuilders.geoDistanceSort("lonAndLat",new GeoPoint("31.2,121.5")).order(SortOrder.ASC).unit(DistanceUnit.KILOMETERS));SearchResponse response = client.search(request, RequestOptions.DEFAULT);for (SearchHit hit : response.getHits().getHits()) {TbHotel tbHotel = JSON.parseObject(hit.getSourceAsString(), TbHotel.class);System.out.println(tbHotel.getLonAndLat());}}@Testpublic void testMat() throws IOException {SearchRequest request = new SearchRequest("hotel");request.source().query(QueryBuilders.matchQuery("name","如家"));SearchResponse response = client.search(request, RequestOptions.DEFAULT);for (SearchHit hit : response.getHits().getHits()) {System.out.println(hit.getSourceAsString());}}
}

2. es查询语法

代码如下(示例):


//添加索引
PUT /tiantian
{"mappings": {"properties": {"name":{"type": "text", "analyzer": "ik_smart"},"age":{"type": "integer", "index": false}}}
}//查询索引
GET /tiantian//查询文档信息
GET /tiantian/_doc/1//添加字段信息
PUT /tiantian/_mapping
{"properties":{"address":{"type":"text","index":false}}
}//添加数据文档数据信息
POST /tiantian/_doc/1
{"address":"巴黎","name":"太牛龙","age":123
}//查询经纬度
GET /hotel/_search
{"query": {"match_all": {}},"sort": [{"price": {"order": "desc"}},{"_geo_distance": {"lonAndLat": {"lat": 31.2,"lon": 121.5},"order": "asc"}}]
}POST /hotel/_update/1902197537
{"doc": {"isAD": true}
}
POST /hotel/_update/2056126831
{"doc": {"isAD": true}
}
POST /hotel/_update/1989806195
{"doc": {"isAD": true}
}
POST /hotel/_update/2056105938
{"doc": {"isAD": true}
}GET /hotel/_search
{"query": {"function_score": {"query": {"match": {"name": "外滩"}},"functions": [{"filter": { "term": {"id": "1"}},"weight": 10}],"boost_mode": "multiply"}},"from": 1,"size": 10
}GET /hotel/_search
{"query": {"function_score": {"query": {"match": {"name": "如家"}},"functions": [{"filter": {"term": {"name": "339952837"}}, "weight": 10}],"boost_mode": "sum"}}
}GET /hotel/_search
{"query": {"match_all": {}}
}GET /hotelGET /hotel/_search
{"size": 0, "aggs": {"brandAgg": {"terms": {"field": "brand.keyword"}}}}GET /hotel/_search
{"query": {"match": {"name": "东方明珠"}}
}

三,api功能

@Overridepublic PageResult search(RequestParams params) throws IOException {//1.准备发送SearchRequest request = new SearchRequest("hotel");//2.准备布尔条件BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();//3.判断是否存在String key = params.getKey();if (key==null || "".equals(key)){boolQuery.must(QueryBuilders.matchAllQuery());}else {boolQuery.must(QueryBuilders.matchQuery("name",key));}Integer size = params.getSize();Integer page = params.getPage();request.source().from((page - 1) * size).size(size);request.source().query(boolQuery);String location = params.getLocation();//得出具体路径if (location!=null && !location.equals("")){request.source().sort(SortBuilders.geoDistanceSort("lonAndLat",new GeoPoint(location)).order(SortOrder.ASC).unit(DistanceUnit.KILOMETERS));}//相关性算法FunctionScoreQueryBuilder scoreQuery = QueryBuilders.functionScoreQuery(boolQuery,new FunctionScoreQueryBuilder.FilterFunctionBuilder[]{new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.termQuery("isAD", true),ScoreFunctionBuilders.weightFactorFunction(10))});request.source().query(scoreQuery);SearchResponse response = client.search(request, RequestOptions.DEFAULT);return  handleResponse(response);}

根据经纬度查询方式
在这里插入图片描述

//得出具体路径if (location!=null && !location.equals("")){request.source().sort(SortBuilders.geoDistanceSort("lonAndLat",new GeoPoint(location)).order(SortOrder.ASC).unit(DistanceUnit.KILOMETERS));}

相关性算法

请添加图片描述

       //相关性算法FunctionScoreQueryBuilder scoreQuery = QueryBuilders.functionScoreQuery(boolQuery,new FunctionScoreQueryBuilder.FilterFunctionBuilder[]{new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.termQuery("isAD", true),ScoreFunctionBuilders.weightFactorFunction(10))});

总结

  1. es高效,速度快,基于lu的内存数据库,采用倒序索引的方式,倒叙索引好处,我们之前数据库根据id找到值,倒排索引的方式,es默认创建索引,根据值找到,对应的文档列表,文档列表根据二分查找方式,找到对应的值
  2. es强大的api功能普通基于内存的数据库的方式,比如redis功能,适合做缓存,没有强大的api,不能做复杂的功能,es有强大api,分页,查询,联合查询,经纬度查询,相关性质查询方式

相关文章:

es的优势

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目…...

sonar对webgoat进行静态扫描

安装sonar并配置 docker安装sonarqube&#xff0c;sonarQube静态代码扫描 - Joson6350 - 博客园 (cnblogs.com) 对webgoat进行sonar扫描 扫描结果 bugs Change this condition so that it does not always evaluate to "false" 意思是这里的else if语句不会执行…...

opencv-重点知识

OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉库&#xff0c;提供了大量用于图像处理和计算机视觉任务的工具和算法。以下是一些OpenCV中的重点知识&#xff1a; 图像加载与显示: 使用cv2.imread()加载图像。使用cv2.imshow()显示…...

上海亚商投顾:北证50指数大涨 机器人概念股掀涨停潮

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 三大指数昨日震荡反弹&#xff0c;黄白二线有所分化&#xff0c;题材热点轮动表现。北证50指数大涨超3%&#…...

2.4G无线收发芯片 XL2400P使用手册

XL2400P 系列芯片是工作在 2.400~2.483GHz 世界通用 ISM 频段的单片无线收发芯片。该芯片集成射 频收发机、频率收生器、晶体振荡器、调制解调器等功能模块&#xff0c;并且支持一对多组网和带 ACK 的通信模 式。发射输出功率、工作频道以及通信数据率均可配置。芯片已将多颗外…...

ZC序列理论学习及仿真

文章目录 前言一、ZC 序列理论1、基本概念2、表达式3、ZC 序列一些定义①、自相关②、循环移位③、循环自相关④、循环互相关二、ZC 序列性质1、性质 1:恒包络,即等模2、性质 2:零循环自相关3、性质 3:固定循环互相关4、其他性质①、傅里叶变换后仍是 ZC 序列②、低峰均比③…...

利用OpenCV实现图片中导线的识别

下面是一个需求&#xff0c;识别图片中的导线&#xff0c;要在图像中检测导线&#xff0c;我们需要采用不同于直线检测的方法。由于OpenCV没有直接的曲线检测函数&#xff0c;如同它对直线提供的HoughLines或HoughLinesP&#xff0c;检测曲线通常需要更多的图像处理步骤和算法&…...

关于VITS和微软语音合成的效果展示(仙王的日常生活第1-2209章)

目录 说明微软VITS 合成效果展示 说明 自己尝试了VITS和微软这两个语音合成功能。甚至使用了微软的效果来训练VITS&#xff0c;出乎意料&#xff0c;效果居然不错&#xff0c;没有大佐的口音。 微软 微软中最好听的&#xff0c;感情最顺滑的&#xff0c;应该是“云希”莫属。…...

普乐蛙VR航天航空巡展项目来到了第七站——绵阳科博会

Hi~ 你有一份邀约请查收 11月22日—26日绵阳科博会 普乐蛙展位号&#xff1a;B馆科技体验区(1) 邀你体验趣味VR科普&#xff0c;探索科技新发展 第十一届中国(绵阳)科技城国际科技博览会 绵阳科博会自2013年创办以来&#xff0c;已连续成功举办十届&#xff0c;已有近7000家单位…...

行情分析——加密货币市场大盘走势(11.22)

大饼昨日晚上打了止损&#xff0c;笔者入场了空单&#xff0c;目前来看上涨乏力&#xff0c;下跌是必然的&#xff0c;昨日的下跌跌破了蓝色上涨趋势线&#xff0c;而今日白天开始反弹&#xff0c;别着急抄底&#xff0c;下跌还没有结束。 空单策略&#xff1a;入场36500 止盈…...

QT--MP3项目数据库数据表设计与实现_歌曲搜索

QSqlQuery类&#xff1a;...

gzip 压缩优化大 XML 响应的处理方法

当处理大型XML响应时&#xff0c;我们经常会面临内存限制和性能问题。 在处理这个问题时&#xff0c;我们可以使用Python的requests库和lxml库来解决。下面是解决方案的步骤&#xff1a; 1. 使用requests库发送HTTP请求获取XML响应。 2. 检查响应的Content-Encoding标头&…...

数字化文旅系统,让景区营销变得更加简单!

随着互联网的普及和信息技术的不断发展&#xff0c;越来越多的消费者开始通过互联网来获取旅游信息、预订旅游产品和服务。因此&#xff0c;文旅行业需要紧跟时代步伐&#xff0c;借助数字化技术来提高服务质量和效率&#xff0c;满足消费者对于便捷、个性化的需求。 1. 强大功…...

配置命令别名

vim ~/.bashrc 配置命令别名 alias knkubectl -n alias kkubectl 配置golang环境变量 export GOPATH/root/go export GO111MODULEon export GOPROXY"http://mirros.yun.ali.com.cn:8848/goproxy" export GOROOT/usr/local/go export PATH$PATH:$GOPATH/bi…...

zookeeper应用之分布式队列

队列这种数据结构都不陌生&#xff0c;特点就是先进先出。有很多常用的消息中间件可以有现成的该部分功能&#xff0c;这里使用zookeeper基于发布订阅模式来实现分布式队列。对应的会有一个生产者和一个消费者。 这里理论上还是使用顺序节点。生产者不断产生新的顺序子节点&am…...

取数游戏2(动态规划java)

取数游戏2 题目描述 给定两个长度为n的整数列A和B&#xff0c;每次你可以从A数列的左端或右端取走一个数。假设第i次取走的数为ax&#xff0c;则第i次取走的数的价值vibi⋅ax&#xff0c;现在希望你求出∑vi的最大值。 输入格式 第一行一个数T &#xff0c;表示有T 组数据。…...

Spring Boot中配置文件生效位置

1. 配置文件位置 首先小伙伴们要明白&#xff0c;Spring Boot 默认加载的配置文件是 application.properties 或者 application.yaml&#xff0c;properties优先级高于yaml。默认的加载位置一共有五个&#xff0c;五个位置可以分为两类&#xff1a; 从 classpath 下加载&…...

AIGC创作系统ChatGPT网站系统源码,支持最新GPT-4-Turbo模型

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如…...

【JavaEE】操作系统与进程

作者主页&#xff1a;paper jie_博客 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文录入于《JavaEE》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白精心打造的。笔者用重金(时间和精力)打造&…...

【MATLAB源码-第86期】基于matlab的QC-LDPC码性能仿真,输出误码率曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 QC-LDPC&#xff08;准循环低密度奇偶校验&#xff09;编码是一种高效的错误校正编码方式&#xff0c;广泛应用于通信系统和数据存储中以提高数据的可靠性。它是低密度奇偶校验&#xff08;LDPC&#xff09;编码的一种特殊形…...

Ollama与MCP协议集成:为本地大模型赋予工具调用能力

1. 项目概述&#xff1a;当Ollama遇上MCP&#xff0c;本地AI的“手”与“脑”终于相连 如果你和我一样&#xff0c;是个喜欢在本地折腾大模型的开发者&#xff0c;那你对Ollama一定不陌生。它就像一个超级好用的“模型管理器”&#xff0c;让你能一键拉取、运行各种开源大语言…...

Python表白程序实战:用Turtle库画动态爱心与小人(含源码可修改)

Python表白程序实战&#xff1a;用Turtle库打造个性化动态爱心与互动小人 在数字化表达情感的时代&#xff0c;用代码创作一份独特的礼物正成为技术爱好者的浪漫选择。Python的Turtle图形库以其直观的可视化效果和低门槛特性&#xff0c;成为制作动态表白程序的理想工具。不同于…...

Flutter脚手架flutterclaw:工程化开发的最佳实践与核心模块解析

1. 项目概述&#xff1a;一个Flutter开发者的“工具箱”与“脚手架”如果你在GitHub上搜索过Flutter相关的项目&#xff0c;或者在一个Flutter开发者社群里待过一阵子&#xff0c;你大概率会看到过flutterclaw/flutterclaw这个名字。乍一看&#xff0c;它像是一个个人或团队的G…...

【深度解析】Google AI Studio Vibe Coding 更新:从 Prompt 生成到可视化应用构建闭环

摘要 Google AI Studio 的 Vibe Coding 正从“输入提示词生成 Demo”演进为“可视化应用构建器”。本文解析 Prompt 自动补全、设计预览、编辑模式与内联素材生成的技术价值&#xff0c;并给出可落地的 AI Prompt 编排实战方案。背景介绍&#xff1a;Vibe Coding 正在从文本驱动…...

游戏模组加载器终极指南:3步搞定ASI插件安装与管理

游戏模组加载器终极指南&#xff1a;3步搞定ASI插件安装与管理 【免费下载链接】Ultimate-ASI-Loader The Ultimate ASI Loader is a proxy DLL that loads custom .asi libraries into any game process. 项目地址: https://gitcode.com/gh_mirrors/ul/Ultimate-ASI-Loader …...

CVPR 2024投稿避坑指南:从LaTeX模板配置到OpenReview提交的完整流程

CVPR 2024投稿全流程实战手册&#xff1a;从模板配置到系统提交的23个关键细节 第一次向CVPR投稿的研究生小张&#xff0c;在截止前48小时发现参考文献格式全部错误&#xff0c;匿名化处理漏掉了3处作者信息&#xff0c;OpenReview提交页面卡在"Conflict Declaration"…...

别再自己编译zlib了!Qt自带zlib库的完整使用教程(附解压zip代码)

Qt开发者必知&#xff1a;无需编译直接调用内置zlib的完整实践指南 每次接手需要处理压缩文件的项目时&#xff0c;那种"又要折腾zlib编译"的恐惧感就会涌上心头。作为经历过无数次zlib编译失败的Qt开发者&#xff0c;我完全理解这种痛苦——直到发现Qt安装目录下那个…...

GetQzonehistory:5步永久备份你的QQ空间青春回忆,告别数据丢失焦虑

GetQzonehistory&#xff1a;5步永久备份你的QQ空间青春回忆&#xff0c;告别数据丢失焦虑 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否也曾担心&#xff0c;那些记录着青春岁…...

JAVA自营商城小程序APP商城源码单商户源码的uniapp代码片段

以下为JAVA自营商城小程序/APP单商户源码的Uniapp核心功能代码片段&#xff0c;包含商品展示、购物车管理、订单支付等模块&#xff1a;1. 商品列表页&#xff08;pages/product/list.vue&#xff09;vue<template><view class"container"><!-- 搜索栏…...

轻量化GraphRAG实践:用知识图谱提升大模型问答精度

1. 项目概述&#xff1a;当大模型遇上知识图谱&#xff0c;Nano-GraphRAG的轻量化实践最近在折腾大模型应用时&#xff0c;发现一个挺普遍的问题&#xff1a;当你把一份几十页的PDF或者一个复杂的项目文档丢给大模型&#xff0c;让它回答一些需要综合上下文才能搞定的问题时&am…...