ElasticSearch的基操和进阶查询

这篇具有很好参考价值的文章主要介绍了ElasticSearch的基操和进阶查询。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一,ElactisSearch简介

1. 定义

2. 优点

3. 缺点

4. 解决的问题

二,实现es操作的基本环境准备

 三,ES中的基本Rest命令说明

​编辑

简单操作:

复杂查询(排序,分页,高亮,模糊查询,精准查询)

1,搜索过滤,只显示source需要的结果

2,排序

3,分页

4,多条件查询--布尔值查询

5,过滤器 filter 

6,匹配多条件

7,多指匹配精确查询

8,搜索词高亮(自定义)


一,ElactisSearch简介

1. 定义

ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

ES 是基于Lucene这个非常成熟的索引方案,另加上一些分布式的实现:集群,分片,复制等。

2. 优点

  1. 具备横向可扩展性:只需要增加一台服务器,做些配置,启动 ES 进程就可以快速并入集群。'
  2. 分片机制:同一个索引分成多个分片(sharding),类似于 redis 中的分片,采取分而治之的思想来更好地解决问题。
  3. 高可用:提供复制机制,一个分片可以设置多个复制,使得某台服务器宕机的话,集群依旧可以正常运行,并会把丢失的复制恢复到其它可用节点上'

3. 缺点

  1. 节点数据的一致性问题:其默认的机制是通过多播机制,同步元数据信息,但是在比较繁忙的集群中,可能会由于网络的阻塞,或者节点处理能力达到饱和导致各节点元数据不一致——也就是所谓的脑裂问题,这样会使集群处于不一致状态。目前并没有一个彻底的解决方案来解决这个问题,但是可以通过将工作节点与元数据节点分开的部署方案来缓解这种情况。
  2. 没有细粒度的权限管理,没有像MySQL那样的分各种用户,每个用户又有不同的权限。

4. 解决的问题

  • 更快的在大量数据中检索相关数据,性能远优于传统数据库
  • 结合分词器,根据关键词返回统计结果

二,实现es操作的基本环境准备

1,下载ES的安装包解压后进入bin目录下,双击执行elasticsearch.bat(前提:自备Javajdk,因为ElasticSearch是基于lucence开发的,运行需要java jdk支持。所以要先安装JAVA环境,最低1.8)

………………………………
[2022-03-18T15:51:45,927][INFO ][o.e.l.LicenseService     ] [DESKTOP-I2SMELA] license [40d2c00e-52ad-4124-9506-526b9a613d3c] mode [basic] - valid
[2022-03-18T15:51:45,928][INFO ][o.e.x.s.s.SecurityStatusChangeListener] [DESKTOP-I2SMELA] Active license is now [BASIC]; Security is disabled
[2022-03-18T15:51:45,936][INFO ][o.e.g.GatewayService     ] [DESKTOP-I2SMELA] recovered [3] indices into cluster_state
[2022-03-18T15:51:46,098][INFO ][o.w.a.d.Monitor          ] [DESKTOP-I2SMELA] try load config from D:\ElasticSearch\elasticsearch-7.6.1\config\analysis-ik\IKAnalyzer.cfg.xml
[2022-03-18T15:51:46,101][INFO ][o.w.a.d.Monitor          ] [DESKTOP-I2SMELA] try load config from D:\ElasticSearch\elasticsearch-7.6.1\plugins\ik\config\IKAnalyzer.cfg.xml
[2022-03-18T15:51:46,278][WARN ][o.w.a.d.Monitor          ] [DESKTOP-I2SMELA] [Ext Loading] file not found: D:\ElasticSearch\elasticsearch-7.6.1\plugins\ik\config\my_ik
[2022-03-18T15:51:46,673][INFO ][o.e.h.AbstractHttpServerTransport] [DESKTOP-I2SMELA] publish_address {127.0.0.1:9200}, bound_addresses {127.0.0.1:9200}, {[::1]:9200}
[2022-03-18T15:51:46,674][INFO ][o.e.n.Node               ] [DESKTOP-I2SMELA] started

运行到started,并在浏览器上测试端口号如下图:

ElasticSearch的基操和进阶查询

证明成功!

2, 安装ElasticSearch可视化插件ElasticSearch-head

在这儿进行下载,里面有详细的安装步骤(前提是准备node环境,安装node,因为他是个node项目),解压后将在对应文件命令行界面输入npm install-->npm run start运行得到得到连接成功的界面:

……………………
D:\ElasticSearch\elasticsearch-head-master>grunt server
Running "connect:server" (connect) task
Waiting forever...
Started connect web server on http://localhost:9100

在浏览器下测试发现存在跨域问题。

3,解决跨域问题,因为在可视化插件上显示ES的信息需要连接ES的端口地址涉及到跨域问题,所以我们在ES的配置文件上修改一下配置去解决跨域:

        更改config文件下的 elasticsearch.yaml的配置:

http.cors.enabled: true 
http.cors.allow-origin: "*"
@注意,设置参数的时候:后面要有空格!

重启ES服务器,然后再连接得到下图:

ElasticSearch的基操和进阶查询

并且能查看ES的一些基本信息

4.Kibana的安装 

Kibana是一个针对ElasticSearch的开源分析及可视化平台,用来搜索、查看交互存储在Elasticsearch索引中的数据。使用Kibana,可以通过各种图表进行高级数据分析及展示。

Kibana让海量数据更容易理解。它操作简单,基于浏览器的用户界面可以快速创建仪表板(dashboard)实时显示Elasticsearch查询动态。

设置Kibana非常简单。无需编码或者额外的基础架构,几分钟内就可以完成Kibana安装并启动Elasticsearch索引监测

我们可以自行在ElasticSearch官网下载,开箱即用,双击kibana.bat后可以看到运行成功:

………………
  log   [07:53:14.405] [info][status][plugin:vega@7.6.1] Status changed from uninitialized to green - Ready
  log   [07:53:14.408] [info][status][plugin:tagcloud@7.6.1] Status changed from uninitialized to green - Ready
  log   [07:53:15.078] [warning][reporting] 正在为 xpack.reporting.encryptionKey 生成随机密钥。要防止待处理报告在重新启 动时失败,请在 kibana.yml 中设置 xpack.reporting.encryptionKey
  log   [07:53:15.089] [info][status][plugin:reporting@7.6.1] Status changed from uninitialized to green - Ready
  log   [07:53:15.134] [info][listening] Server running at http://localhost:5601
  log   [07:53:15.285] [info][server][Kibana][http] http server running at http://localhost:5601

在浏览器中运行结果:

ElasticSearch的基操和进阶查询

如果初始界面是英文的,我们也可以进行汉化。更改config目录下的kibana.yaml配置,将默认的i18n更改为i18n.local: "zh_CN"即可。

 三,ES中的基本Rest命令说明

ElasticSearch的基操和进阶查询

简单操作:

1,创建索引

PUT  /索引名/类型名(可不写,默认为_doc)/文档id

kibana控制台输入:

PUT /test2/_doc/1
{
  "name":"stephen curry",
  "age":23,
  "address":"加利福利亚旧金山",
  "email":"12334424342342@qq.com"
}

 ES界面即可看到完成的自动增加的索引,数据也完成了添加。

ElasticSearch的基操和进阶查询

2,指定字段类型

#创建规则
PUT /test2/_doc/2
{
  "mappings": {
    "properties": {
      "name":{
        "type": "text"
      },
      "age":{
        "type":"long"
      },
      "birth":{
        "type": "date"
      }
    }
  }
}

 3,查看:

GET /test2/_doc/2

结果:

{
  "_index" : "test2",
  "_type" : "_doc",
  "_id" : "2",
  "_version" : 2,
  "_seq_no" : 2,
  "_primary_term" : 1,
  "found" : true,
  "_source" : {
    "mappings" : {
      "properties" : {
        "name" : {
          "type" : "text"
        },
        "age" : {
          "type" : "long"
        },
        "birth" : {
          "type" : "date"
        }
      }
    }
  }
}

4,修改

(1)使用PUT在原有情况下进行覆盖

PUT /test2/_doc/1
{
  "name":"stephen james",
  "age":23,
  "address":"加利福利亚旧金山"
}

不过这种方法有时候会因为少些漏掉数据,不推荐

{
"_index": "test2",
"_type": "_doc",
"_id": "1",
"_version": 2,
"_score": 1,
"_source": {
"name": "stephen james",
"age": 23,
"address": "加利福利亚旧金山"
}
}

(2)使用POST的Rest命令进行修改

POST /test2/_doc/1/_update
{
  "doc":{
  "name":"湖人又被别人吊着锤了"
}}

可以看到修改成功:

{
"_index": "test2",
"_type": "_doc",
"_id": "1",
"_version": 3,
"_score": 1,
"_source": {
"name": "湖人又被别人吊着锤了",
"age": 23,
"address": "加利福利亚旧金山"
}
}

并且随着每次修改version都会依次增加,而且result会显示修改结果:

#! Deprecation: [types removal] Specifying types in document update requests is deprecated, use the endpoint /{index}/_update/{id} instead.
{
  "_index" : "test2",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 3,
  "result" : "updated",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 4,
  "_primary_term" : 1
}

5,删除索引

通过DELETE命令来实现删除,根据请求来判断是删除索引还是文档记录

6,查询

简单的条件查询GET 索引/选填/选填id/_search?条件

#插入
PUT /test1/nba/1
{
   "name":"NBA",
   "age":150,
   "desc":"季后赛名额",
   "teams":["公牛", "热火","篮网","太阳","勇士"]
}

#查询
GET /test1/nba/_search?q=name:NBA

#结果
{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 0.2876821,
    "hits" : [
      {
        "_index" : "test1",
        "_type" : "nba",
        "_id" : "1",
        "_score" : 0.2876821,
        "_source" : {
          "name" : "NBA",
          "age" : 150,
          "desc" : "季后赛名额",
          "teams" : [
            "公牛",
            "热火",
            "篮网",
            "太阳",
            "勇士"
          ]
        }
      }
    ]
  }
}

复杂查询(排序,分页,高亮,模糊查询,精准查询)

插入数据

ElasticSearch的基操和进阶查询

1,搜索过滤,只显示source需要的结果

#查询
GET test1/nba/_search
{
  "query":{
      "match": {
      "name":"NBA"
       }
},
"_source": ["name","teams"]
}

#结果
{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 0.9808291,
    "hits" : [
      {
        "_index" : "test1",
        "_type" : "nba",
        "_id" : "1",
        "_score" : 0.9808291,
        "_source" : {
          "teams" : [
            "公牛",
            "热火",
            "篮网",
            "太阳",
            "勇士"
          ],
          "name" : "NBA"
        }
      }
    ]
  }
}

2,排序

插入新的数据进行测试:

GET /test/user/_search
{
  "query": {
    "match": {
      "name": "张三"
    }
  },
  "_source": ["name","age"],
  "sort": [
    {
      "age": {
        "order": "asc"
      }
    }
  ]
}

ElasticSearch的基操和进阶查询

3,分页

GET /test/user/_search
{
  "query": {
    "match": {
      "name": "张三"
    }
  },
  "_source": ["name","age"],
  "sort": [
    {
      "age": {
        "order": "asc"
      }
    }
  ],
  "from": 0,
  "size": 10
}

 ElasticSearch的基操和进阶查询

4,多条件查询--布尔值查询

4.1,must

GET /test/user/_search
{
  "query": {
    "bool": {
      "must": [
        {
        "match": {
          "name": "张三"}
        },
       {
         "match": {
          "age": 40}
        }
      ]
    }  
  }
}

 ElasticSearch的基操和进阶查询

4.2,should(or)

GET /test/user/_search
{
  "query": {
    "bool": {
      "should": [
        {
        "match": {
          "name": "李四"}
        },
       {
         "match": {
          "age": 40}
        }
      ]
    }
  }
}

 ElasticSearch的基操和进阶查询

 4.3,must_not(not)

GET /test/user/_search
{
  "query": {
    "bool": {
      "should": [
        {
        "match": {
          "name": "李四"}
        },
       {
         "match": {
          "age": 40}
        }
      ]
    }
  }
}

ElasticSearch的基操和进阶查询

5,过滤器 filter 

GET /test/user/_search
{
  "query": {
    "bool": {
      "must": [
        {
        "match": {
          "name": "张三"
        }
        }
      ],
      "filter": {
#range 范围
        "range": {
          "age": {
#gte  大于等于
            "gte": 23 , 
            "lte": 40
          }
        }
      }
    }
    
  }
}

ElasticSearch的基操和进阶查询

6,匹配多条件

GET /test/user/_search
{
  "query": {
  
  "match": {
    "tags": "旅游 阳光"
  }
    
  },
  "_source":  ["tags" ,"name"]
}

 ElasticSearch的基操和进阶查询

7,多指匹配精确查询

GET test/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "term": {
            "name.keyword": {
              "value": "张三"
            }
          }
        },{
          "term": {
            "age": {
              "value": 23
            }
          }
        }
      ]
    }
  }
}

ElasticSearch的基操和进阶查询

8,搜索词高亮(自定义)

#插入数据1
PUT /test2/_doc/1/
{
   "name":"黎治跃",
   "age":20,
   "address":"湖北省武汉市",
   "email":"12334424342342@qq.com",
   "birth":"2000-10-21",
   "skill":["吃饭","吃饭吗"]
}
#插入数据2
PUT /test2/_doc/2/
{
   "name":"黎明",
   "age":27,
   "address":"湖北省武汉市",
   "email":"12334424342342@qq.com",
   "birth":"2000-10-21",
   "skill":["不吃饭","吃饭吗"]
}
#高亮处理
GET test2/_search
{
  "query":{
      "match": {
           "name":"黎"
         }
       },
       "highlight": {
         "pre_tags":"<p class='key' style='color:red'>",
         "post_tags":"</p>",
         "fields":{
           "name":{}
         }
       }
}
#结果
{
  "took" : 742,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 0.9534807,
    "hits" : [
      {
        "_index" : "test2",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 0.9534807,
        "_source" : {
          "name" : "黎明",
          "age" : 27,
          "address" : "湖北省武汉市",
          "email" : "12334424342342@qq.com",
          "birth" : "2000-10-21",
          "skill" : [
            "不吃饭",
            "吃饭吗"
          ]
        },
        "highlight" : {
          "name" : [
            "<p class='key' style='color:red'>黎</p><p class='key' style='color:red'>明</p>"
          ]
        }
      },
      {
        "_index" : "test2",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.16853255,
        "_source" : {
          "name" : "黎治跃",
          "age" : 20,
          "address" : "湖北省武汉市",
          "email" : "12334424342342@qq.com",
          "birth" : "2000-10-21",
          "skill" : [
            "吃饭",
            "吃饭吗"
          ]
        },
        "highlight" : {
          "name" : [
            "<p class='key' style='color:red'>黎</p>治跃"
          ]
        }
      }
    ]
  }
}

 结语:以上学习资源仅供个人笔记之用,总结的还是比较肤浅,不足之处还望不惜赐教。注:部分截图资源来自“狂神说”文章来源地址https://www.toymoban.com/news/detail-403479.html

到了这里,关于ElasticSearch的基操和进阶查询的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 2023新版医保目录明细(药品查询)

    查询医保目录的主要目的是为了了解医保政策对于特定医疗服务、药品和医疗器械的覆盖范围和支付标准。大众可以通过查看医保目录可以确定哪些药品可以被医保支付以及报销的比例和限额;医药从业者可通过查看医保目录可以即使了解医保政策的变化,便于做出相应的医

    2024年02月10日
    浏览(52)
  • Docker进阶数据卷&目录挂载及在线部署

    为了很好的实现数据保存和数据共享, Docker 提出了 Volume 这个概念,简单的说就是绕过默认的联合 文件系统,而以正常的文件或者目录的形式存在于宿主机上。又被称作 数据卷 Docker 中的数据卷(Volume)是用于持久化存储容器数据的一种机制。它可以将主机上的目录或文件

    2024年01月23日
    浏览(39)
  • 进阶Docker2:数据卷和挂载目录

    目录 准备 删除容器  创建并运行一个容器 数据卷(Volumes) 挂载数据卷 虚拟机端口映射 挂载目录(Bind mounts) 挂载目录 挂载文件 部署在线项目 docker 在容器中管理数据主要有两种方式: - 数据卷( Volumes ) - 挂载主机目录( Bind mounts ) 删除容器  创建并运行一个容器 挂

    2024年01月18日
    浏览(39)
  • 【MySQL】进阶查询-聚合查询和联合查询

    文章主要围绕着以下三个问题: group by的作用 where与having的区别 表的连接分为哪些,分别是什么作用 在创建数据表时,我们通常时根据需求找到\\\"实体\\\", 梳理\\\"实体\\\"之间的关系,从而进行创建. \\\"实体\\\"之间可能会有以下几种关系:1.没关系 2.一对一 3.一对多 4.多对多. 没关系应该是最好

    2023年04月11日
    浏览(72)
  • matlab 基操~

    1. 对象定义 使用sym定义单个对象、使用syms定义多个对象 2. 使用 limit 求极限 $$ lim_{v rightarrow a} f(x) $$ 3. 导数 使用 diff(f,v,n) 对$ f(v)=v^{t-1} $求 $ n $ 阶导 $ frac{d^nf}{d^nv} $,n缺省时,默认为1,diff(f)默认求一阶导数。 4. 定积分和不定积分 使用 int(f,v) 求f对变量v的不定积分,使用

    2024年03月11日
    浏览(45)
  • 《YOLOv5/v7进阶实战专栏》专栏介绍 & 专栏目录

    本专栏包含超多YOLO算法进阶使用教程;我会用最简练的语言让你用最低的时间成本掌握下面的内容,使用过程中有任何问题都可以与本人联系 ~ 2024年1-2月会对整个专栏全面重构,增加更多的改进,更多实战内容,修改好的代码包,敬请期待~ 专栏地址:点击跳转 专栏重构中

    2024年02月15日
    浏览(53)
  • C++的基类和派生类构造函数

    基类的成员函数可以被继承,可以通过派生类的对象访问,但这仅仅指的是普通的成员函数,类的构造函数不能被继承。构造函数不能被继承是有道理的,因为即使继承了,它的名字和派生类的名字也不一样,不能成为派生类的构造函数,当然更不能成为普通的成员函数。

    2024年02月10日
    浏览(48)
  • C++ QT FTP基操

        FTP是一种文件传输协议,可以通过网络将文件从一个计算机传输到另一个计算机。在C++ QT中,可以使用QNetworkAccessManager类来实现FTP上传和下载。     FTP上传:     1. 创建QNetworkAccessManager对象     QNetworkAccessManager *manager = new QNetworkAccessManager(this);     2. 创建QUrl对象

    2024年02月07日
    浏览(33)
  • mysql进阶-查询优化-慢查询日志

    日志对一个程序来说非常重要,他能帮助程序员在系统出现问题时快速定位问题, 慢查询日志 ( slow query log )是MySQL自带的几种日志文件中非常重要的一种日志(另还有错误日志、查询日志、二进制日志)。MySQL的慢查询日志是用于记录执行时间超过指定阈值的SQL查询语句的一

    2024年02月03日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包