点赞再看,养成习惯,微信搜索「小大白日志」关注这个搬砖人。

文章不定期同步公众号,还有各种一线大厂面试原题、我的学习系列笔记。

es基础知识

  • es和solr一样,都是基于Lucene的全文检索数据库
  • es数据库和mysql数据库类似,只是它们的概念名词叫法不一样
mysql的叫法 es的叫法
database数据库 索引集
table表 类型
文档
字段

es基础使用(以es7语法在kibana中建立索引为例)

(1)新建名叫index_good的索引(代表商品):

delete /index_good -- 先执行删除命令,以防同名

put  /index_good  -- 再执行新增
{
"settings": {
"number_of_shards": 3, -- 分片数量
"number_of_replicas": 2 -- 副本数量
}
} get /index_good --查询刚刚创建好的索引是否存在

(2)新建字段[title、name、price],分别代表[商品标题、商品名、价格],并设置每个字段的属性=含(type、index、store、analyzer)

put /index_good/_mapping   -- 新建字段,_mapping为固定写法
{
"properties": {
"title": { -- 新建title字段,商品标题
"type": "", -- 该字段的类型,可以是text、long、short、date、integer、object等
"index": true,-- 该字段是否索引,默认为true
"store": false,-- 该字段是否存储,默认为false
"analyzer": "ik_max_word" -- 该字段所使用的分词器,一般用ik_max_word即代表使用ik分词器
},
"name": { -- 新建name字段,商品名
"type": "",
"index": true,
"store": false,
"analyzer": "ik_max_word"
},
"price": { -- 新建title字段,商品价格
"type": "",
"index": true,
"store": false,
"analyzer": "ik_max_word"
},
}
} get /index_good/_mapping --查询刚刚创建好的字段
  • 字段属性

    • type:字段类型。字符串类型有“text”和“keyword”,区别是“text”类型的字段在搜索时es自动进行分词搜索(类似于mysql的模糊查询),但是“keyword”类型的字段则不会进行分词搜索(即不进行模糊查询);数值类型的有long、short、integer、byte、double、float;代表日期类型的有date;其他类型有boolean、object
    • index:该字段在被搜索时是否被做成索引进行搜索。默条认true
    • store:保存每条文档数据时(一条文档数据相当于mysql中的一表数据),是否额外备份数据。默认false,因为es在保存每条文档数据时,会把数据存在一个_source的字段中,如果store为true,es会把_source字段的数据再备份一遍保存,没必要,所以默认为false

(3)新增一条文档数据

每条文档数据都有一个唯一标识_id(相当于rowid),_id可以自增或手动指定,_id以自增的方式插入:

post /index_good/_doc   -- _doc为固定写法(doc=文档=mysql里面的行数据),每条文档数据都有一个“_id”值,此处“_doc”后面没有加“/id”,代表该条文档数据的_id自增
{
"title":"小米手机",
"name":"小米11青春版",
"price":"2399"
} get /index_good/_search -- 查看刚刚插入的index_good索引数据
{
"query":{
"match_all":{}
}
}

指定_id的方式插入数据:

post /index_good/_doc/101  -- 指定该条文档数据的_id为101
{
"title":"小米手机",
"name":"小米11青春版",
"price":"2399"
}

如果插入的字段在es里面没有创建,es会先把没有创建的字段自动创建,再插入数据

(4)修改文档数据(修改文档数据必须指定_id)

put /index_good/_doc/101  -- 修改_id为101的文档数据
{
"title":"小米手机",
"name":"小米12",
"price":"3399"
}

(5)删除文档数据(删除文档数据必须指定_id)

delte /index_good/_doc/101  -- 删除_id为101的文档数据

(6)查询文档数据

查询数据比较复杂,其格式为:

  • match_all查询所有
get /index_good/_search
{
"query":{ -- 固定写法query
"match_all":{}
}
}
  • match模糊查询(将模糊条件进行or、and操作)

or:

get /index_good/_search
{
"query":{ -- 固定写法query
"match":{
"title":"小米手机" --or查询:match默认会用or连接匹配,相当于符合mysql的【title like “%小米%” or title like “%手机%”】的文档数据都会被搜索出来
}
}
}

and:

get /index_good/_search
{
"query":{
"match":{
"title":"小米手机",
"operator":"and" -- match会用and连接匹配,相当于符合mysql的【title like “%小米%” and title like “%手机%”】的文档数据都会被搜索出来
}
}
}
  • multi_match多字段查询
get /index_good/_search
{
"query":{
"multi_match":{ -- 只要title或者name含有“小米”即可被搜索到
"query":"小米",
"fields":["title","name"] -- 类似于把多个字段进行or连接查询 }
}
}
  • term单字段进准查询
精准查询的字段必须不为text类型,因为text类型的字段在查询中时可以被es进行分词查询的,这与精准查询矛盾
get /index_good/_search
{
"query":{
"term":{
"title":"oppo手机" -- 只有title=“oppo手机”的文档数据才会被查询到
}
}
}
  • term单字段进准查询下的fuzzy偏差查询
在term精准查询后,允许查询结果最多出现多少个字符的偏差,此时也满足查询条件
get /index_good/_search
{
"query":{
"fuzzy":{--允许title最多出现两个字符的偏差,如【xiaomi没偏差、iiaomi一个字符偏差、aaaomi两个字符偏差、xiaomiii两个字符偏差】都可以被查询到
"title":"xiaomi",
"fuzziness":2 -- 若不指定fuzziness,默认是一个偏差距离
}
}
}
  • terms多字段精准查询
精准查询的字段必须不为text类型
get /index_good/_search
{
"query":{
"terms":{
"title":["oppo手机","小米手机"] --只要title=“oppo手机”或者“小米手机”就可以被查询到
}
}
}
  • 过滤查看
指定想要查看的字段(两种方式)
不使用includes:
get /index_good/_search
{
_source:[title] -- 在查询出来的结果中只显示title字段,其他不显示
"query":{
"term":{
"title":"oppo手机" -- 只有title=“oppo手机”的文档数据才会被查询到
}
}
}
使用includes:
get /index_good/_search
{
_source:{
"includes":["title"]
} -- 在查询出来的结果中只显示title字段,其他不显示
"query":{
"term":{
"title":"oppo手机" -- 只有title=“oppo手机”的文档数据才会被查询到
}
}
}
指定不想要查看的字段(excludes)
get /index_good/_search
{
_source:{
"excludes":["title"]
} -- 在查询出来的结果中显示除了title字段外的所有字段,其他不显示
"query":{
"term":{
"title":"oppo手机" -- 只有title=“oppo手机”的文档数据才会被查询到
}
}
}
  • bool查询

    bool查询是将多个match、term、terms等等进行与(must)、或(must_not)、非(should)操作
get /index_good/_search
{
"query":{
"bool":{
"must":[--查询结果需满足【title="小米手机" and price=2699】
{"term":{"title":"小米手机"}},
{"term":{"price":2699}}
],
"must_not":{"match":{"name":"oppo"}}, -- 查询结果需满足【title="小米手机" and price=2699 and name not like '%oppo%'】
"should":{"term":{"price":"3000"}} --查询结果需满足【price =3000 or (title="小米手机" and price=2699 and name not like '%oppo%) 】
}
}
}
  • 范围查询range
gt即大于,gte即大于等于,lt即小于,lte即小于等于:
get /index_good/_search
{
"query":{
"range":{
"price":{
"gt":2600, -- 查询2600<price<3000的文档数据,
"lt":3000
}
}
}
}
  • 排序查询
把查询结果加上order by:
get /index_good/_search
{
"query":{
"term":{
"title":"oppo手机" -- 只有title=“oppo手机”的文档数据才会被查询到
}
},
"sort":[ -- 查询结果根据【order by price desc,name asc】进行排序
{"price":{"order":"desc"}},
{"name":{"name":"asc"}}
]
}
  • 分页查询
get /index_good/_search
{
"query":{
"term":{
"title":"oppo手机" -- 只有title=“oppo手机”的文档数据才会被查询到
}
},
"sort":[ -- 查询结果根据【order by price desc,name asc】进行排序
{"price":{"order":"desc"}},
{"name":{"name":"asc"}}
],
"from":5, -- 从第5条数据开始取10条(es中的数据从第0条开始)
"size":10
}

(7) 其他命令

get /_cat/indices?v  -- 查看es库中看所有的索引

get /_alias  --查看es库中所有的别名

OK,如果文章哪里有错误或不足,欢迎各位留言。

创作不易,各位的「三连」是二少创作的最大动力!我们下期见!

es篇-es基础的更多相关文章

  1. ES 架构及基础 - 1

    Elasticsearch 是一款分布式,RESTful 风格的搜索和数据分析引擎,可以从海量的数据中高效的找到相关信息.如 wiki 用 ES 进行全文检索及其高亮,Github 用其检索代码,电商 ...

  2. Membership三步曲之入门篇 - Membership基础示例

    Membership 三步曲之入门篇 - Membership基础示例 Membership三步曲之入门篇 -  Membership基础示例 Membership三步曲之进阶篇 -  深入剖析Pro ...

  3. swift开发多线程篇 - 多线程基础

    swift开发多线程篇 - 多线程基础 iOS 的三种多线程技术 (1)NSThread  使用NSThread对象建立一个线程非常方便 但是!要使用NSThread管理多个线程非常困难,不推荐使用 ...

  4. [转]Membership三步曲之入门篇 - Membership基础示例

    本文转自:http://www.cnblogs.com/jesse2013/p/membership.html Membership三步曲之入门篇 - Membership基础示例   Members ...

  5. iOS开发UI篇—Button基础

    iOS开发UI篇—Button基础 一.简单说明 一般情况下,点击某个控件后,会做出相应反应的都是按钮 按钮的功能比较多,既能显示文字,又能显示图片,还能随时调整内部图片和文字的位置 二.按钮的三种状 ...

  6. iOS开发基础篇-Button基础

    一.简单介绍  UIButton 的功能:响应用户操作.显示文字.显示图片.调整内部图片和文字的位置. 二. UIButton 的状态  UIControlStateNormal :普通状态,为默认情 ...

  7. Data Structures & js &ES 6 & ES next

    Data Structures & js &ES 6 & ES next Algorithm Singly-Linked List & Doubly-Linked Li ...

  8. 【0728 | 预习】第三篇 Python基础

    第三篇 Python基础预习 Part 1 变量 一.什么是变量? 二.为什么要有变量? 三.定义变量 四.变量的组成 五.变量名的命名规范 六.变量名的两种风格 Part 2 常量 Part 3 P ...

  9. 前端第二篇---前端基础之CSS

    前端第二篇---前端基础之CSS 目录 一.css介绍 二.css语法 三.css的几种引入方式 四.css选择器 五.css属性相关 六.盒子模型 拓展 一.css介绍 CSS(Cascading  ...

随机推荐

  1. 一致性检验评价方法kappa

    最近在做眼底图像的无监督分类,使用的数据集辣子kaggle的Diabetic Retinopathy,简称DR,中文称糖尿病型眼底疾病. 最后的评估方法是二次加权kappa.以前没接触过,网上也没有具 ...

  2. Notion-douan:搭建自己的阅读清单

    前言 交完论文盲审稿,终于从接近一年的实习.秋招和论文的忙碌中闲下来. 在复盘秋招的时候发现自己虽然看过不少书,但缺少整理和思考,所以想趁这个机会梳理一下自己的阅读习惯,希望以后再读新的东西可以更系统 ...

  3. 团队vue基础镜像选择思考

    前端镜像可以考虑使用nginx或者openresty; 镜像 大小 说明 nginx:1.20.2-alpine 8.41 MB 最小最新版本 nginx:1.21.4 50.95 MB 最新版本 n ...

  4. 简单面试前算法一览java

    1.排序 冒泡,快速排序 2.查找 二分查找 3.链表 翻转链表 合并链表 是否有环 b. 快慢指针 public class QuickSort {   public static void qui ...

  5. Dubbo 服务降级,失败重试怎么做?

    可以通过 dubbo:reference 中设置 mock="return null".mock 的值也可以修 改为 true,然后再跟接口同一个路径下实现一个 Mock 类,命名 ...

  6. java中的方法覆盖(Overriding)和方法重载(Overloading)是什么意思?重写跟重载的区别?

    java中的方法重载发生在同一个类里面两个或者多个方法的方法名相同但是参数不同的情况.与此相对,方法覆盖是说子类重新定义了父类的方法.方法覆盖必须有相同的方法名,参数列表和返回类型. 覆盖者可能不会限 ...

  7. STM32 HAL库与标准库的区别_浅谈句柄、MSP函数、Callback函数

    最近笔者开始学习STM32的HAL库,由于以前一直用标准库进行开发,于是发现了HAL库几点好玩的地方,在此分享. 1.句柄在STM32的标准库中,假设我们要初始化一个外设(这里以USART为例)我们首 ...

  8. 制作任意波形发生器MAX038

  9. 002.MEMS应用在开关电源上,实现大功率超小型化

    设计任务书 1.有关MEMS还有待具体了解 2.有关开关电源的目前难题也需要了解

  10. 10行 JavaScript 实现文本编辑器

    背景 我们平时用到的浏览器编辑器功能都会比较多,实现的代码逻辑也会非常复杂,往往是作为一个单独插件被引入进来的.但是,现在我只需要一个很基本的内容输入内容编辑的功能,如:粗体.斜体.列表.对齐等.那要 ...