es的优势

news2024/11/18 16:07:01

系列文章目录

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 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 {
    @Autowired
    private RestHighLevelClient client;

    @Autowired
    private ESMapper esMapper;


    @BeforeEach
    void setUp() {
        this.client = new RestHighLevelClient(RestClient.builder(
                HttpHost.create("http://192.168.36.128:9200")
        ));
    }

    @AfterEach
    void tearDown() throws IOException {
        this.client.close();
    }

    /**
     * 判断索引是否存在
     * @throws IOException
     */
    @Test
    public void  getIndexRequest() throws IOException {
        GetIndexRequest request = new GetIndexRequest("tiantian");
        boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);
        System.out.println(exists?"不能再":"我问");
    }

    /**
     * 批量导入文档
     * @throws IOException
     */
    @Test
    public 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
     */
    @Test
    public 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
     */
    @Test
    public 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
     */
    @Test
    public 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
     * 地址在上海
     */
    @Test
    public 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
     */
    @Test
    public 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
     */
    @Test
    public 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());
        }

    }

    
    @Test
    public 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 /hotel

GET /hotel/_search
{
  "size": 0, 
  "aggs": {
    "brandAgg": {
      "terms": {
        "field": "brand.keyword"
      }
    }
  }
  
}

GET /hotel/_search
{
  "query": {
    "match": {
      "name": "东方明珠"
    }
  }
}

三,api功能

@Override
    public 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,分页,查询,联合查询,经纬度查询,相关性质查询方式

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

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

相关文章

教程:使用 Keras 优化神经网络

一、介绍 在 我 之前的文章中&#xff0c;我讨论了使用 TensorFlow 实现神经网络。继续有关神经网络库的系列文章&#xff0c;我决定重点介绍 Keras——据说是迄今为止最好的深度学习库。 我 从事深度学习已经有一段时间了&#xff0c;据我所知&#xff0c;处理…

橱柜的装修干货|板材、五金、高度、配色4个方面。福州中宅装饰,福州装修

引言 橱柜的装修干货。 橱柜是厨房的核心&#xff0c;一个好的橱柜能让厨房变得实用又美观。以下是关于橱柜装修的几个问题解答。 1. 橱柜的柜门常用的板材有哪些&#xff1f; 橱柜的柜门常用的板材有实木板、防火板、烤漆板、包复框、PVC板、膜压板等。不同板材有不同的特点…

庖丁解牛:NIO核心概念与机制详解 01

文章目录 Pre输入/输出Why NIO流与块的比较通道和缓冲区概述什么是缓冲区&#xff1f;缓冲区类型什么是通道&#xff1f;通道类型 NIO 中的读和写概述Demo : 从文件中读取1. 从FileInputStream中获取Channel2. 创建ByteBuffer缓冲区3. 将数据从Channle读取到Buffer中 Demo : 写…

五、hdfs常见权限问题

1、常见问题 2、案例 &#xff08;1&#xff09;问题 &#xff08;2&#xff09;hdfs的超级管理员 &#xff08;3&#xff09;原因 没有使用Hadoop用户对hdfs文件系统进行操作。 在Hadoop文件系统中&#xff0c;Hadoop用户相当于Linux系统中的root用户&#xff0c;是最高级别用…

win10电脑无法联网,设置IPv4,点击属性无法打开,闪退

win10设置IPv4&#xff0c;点击属性无法打开&#xff0c;闪退 问题:win10设置IPv4&#xff0c;点击属性无法打开&#xff0c;闪退 问题:win10设置IPv4&#xff0c;点击属性无法打开&#xff0c;闪退 第1步&#xff1a;用管理员打开cmd命令窗口&#xff0c;然后输入下面的命令&…

JVM的运行时数据区

Java虚拟机&#xff08;JVM&#xff09;的运行时数据区是程序在运行过程中使用的内存区域&#xff0c;主要包括以下几个部分&#xff1a; 程序计数器虚拟机栈本地方法栈堆方法区运行时常量池直接内存 不同的虚拟机实现可能会略有差异。这些区域协同工作&#xff0c;支持Java…

BUUCTF snake 1

BUUCTF:https://buuoj.cn/challenges 题目描述&#xff1a; 下载附件&#xff0c;解压得到一张snake的图片。 密文&#xff1a; 这里有一张蛇的图片&#xff0c;本人害怕不敢放&#xff0c;想看自己下载附件解压。&#xff08;吐槽一下&#xff0c;我做这道题&#xff0c;全…

每天一点python——day71

#每天一点Python——71 #格式化字符串在Python中&#xff0c;你可以使用格式化字符串来动态地插入变量的值、表达式的结果等到字符串中。 如图&#xff1a;xxx部分需要不断变化&#xff0c;再和原文拼接 如上图所示这是一个类似于字符串拼接的操作。 因为字符串拼接操作会产生很…

【算法挨揍日记】day26——53. 最大子数组和、918. 环形子数组的最大和

53. 最大子数组和 53. 最大子数组和 题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组 是数组中的一个连续部分。 解题思路&#xff1a; 状态…

公司会倒闭,但大模型肯定不会

咋玩抖音的我&#xff0c;前几天在抖音上发了一张图片&#xff0c;没想到竟然有1000多的播放量。 当然这个播放量不算高&#xff0c;甚至在抖音的体系里属于很低的&#xff0c;但是比我预料的可能只有个位数的播放量是高了不少。 这张图片是我用某国产 AI 软件生成的&#xff…

R语言和RStudio的下载安装(非常简便舒适)

目录 R语言和RStudio的关系R语言和Tableau下载R语言进入官网选择清华镜像源Download R for Windows选择base版本开始下载进行安装配置环境变量检查是否安装成功 下载RStudio进入官网点击下载进行安装检查是否安装成功打开选择R语言环境成功打开显示四个工作区 R语言和RStudio的…

CDN是什么,能起到什么作用

随着互联网的快速发展&#xff0c;用户对于快速、稳定、高效的互联网体验的需求日益增长。为了满足这一需求&#xff0c;内容分发网络&#xff08;CDN&#xff09;应运而生&#xff0c;并在近年来得到了广泛应用。CDN通过在全球范围内部署大量的服务器和网络节点&#xff0c;实…

2023 鹏程杯

前言 笔者没有参加此次比赛&#xff0c;由于团队后面会复现此次比赛&#xff0c;所以笔者在此进行复现记录。 silent 考点: 栈溢出 ret2csu 栈迁移 保护: 开了 Full RELRO 和 NX, 禁掉了 execve/execveat 系统调用 漏洞分析 一个裸的栈溢出, 但是没有输出函数可以泄漏 …

MySQL进阶_8.数据库其他调优策略

文章目录 第一节、数据库调优的步骤1.1、选择合适的DBMS1.2、优化表设计1.3、优化逻辑查询1.4、优化物理查询1.5、使用 Redis 或 Memcached 作为缓存1.6、库级优化 第二节、优化MySQL服务器第三节、优化数据库结构 第一节、数据库调优的步骤 1.1、选择合适的DBMS 如果对事务性…

C++基础从0到1入门编程(三)

系统学习C 方便自己日后复习&#xff0c;错误的地方希望积极指正 往期文章&#xff1a; C基础从0到1入门编程&#xff08;一&#xff09; C基础从0到1入门编程&#xff08;二&#xff09; 参考视频&#xff1a; 1.黑马程序员匠心之作|C教程从0到1入门编程,学习编程不再难 2.系统…

腾讯云服务器带宽计费模式_按流量和带宽收费说明

腾讯云服务器带宽计费模式分为“按带宽计费”和“按使用流量”两种计费模式&#xff1a;按带宽计费是预付费&#xff0c;一次性购买固定带宽值&#xff0c;先付费&#xff1b;按使用流量计费是先使用后付费&#xff0c;根据云服务器公网出方向实际产生流量来计算。如何选择带宽…

腾讯云CVM服务器标准型/高IO/计算/大数据使用场景及选择说明

腾讯云CVM服务器多种机型使用场景说明&#xff0c;如标准型、内存型、高 IO 型、计算型、大数据型、异构型和批量型&#xff0c;腾讯云百科txybk.com分享不同CVM实例规格配置适合使用场景说明&#xff1a; 腾讯云CVM云服务器 标准型&#xff1a;适合中小型 Web 应用、中小型数据…

腾讯云服务器价格计算器真心好用,推荐给大家!

腾讯云服务器价格计算器可以一键计算出云服务器的精准报价&#xff0c;包括CVM实例规格价格、CPU内存费用、公网带宽收费、存储系统盘和数据盘详细费用&#xff0c;腾讯云百科txybk.com分享腾讯云价格计算器链接入口、使用方法说明&#xff1a; 腾讯云服务器价格计算器 打开腾…

大模型是怎么知道 “我赚了200万” 的?

今天在和 chatGPT 聊天时&#xff0c;我说“我赚了200万”&#xff0c;他立刻就根据这句话给我了一句。 我当然没有赚到200万&#xff0c;只是想引出一个话题&#xff1a;“大模型是如何识别出这句话&#xff0c;又是怎么知道该回答什么的呢&#xff1f;" 在学习自然语言…

Linux(4):Linux文件与目录管理

目录与路径 相对路径在进行软件或软件安装时非常有用&#xff0c;更加方便。利用相对路径的写法必须要确认目前的路径才能正确的去到想要去的目录。 绝对路径的正确度要比相对路径好&#xff0c;因此&#xff0c;在写程序&#xff08;shell scripts&#xff09;来管理系统的条…