es篇-es基础
点赞再看,养成习惯,微信搜索「小大白日志」关注这个搬砖人。
文章不定期同步公众号,还有各种一线大厂面试原题、我的学习系列笔记。
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基础的更多相关文章
- ES 架构及基础 - 1
		
Elasticsearch 是一款分布式,RESTful 风格的搜索和数据分析引擎,可以从海量的数据中高效的找到相关信息.如 wiki 用 ES 进行全文检索及其高亮,Github 用其检索代码,电商 ...
 - Membership三步曲之入门篇 - Membership基础示例
		
Membership 三步曲之入门篇 - Membership基础示例 Membership三步曲之入门篇 - Membership基础示例 Membership三步曲之进阶篇 - 深入剖析Pro ...
 - swift开发多线程篇 - 多线程基础
		
swift开发多线程篇 - 多线程基础 iOS 的三种多线程技术 (1)NSThread 使用NSThread对象建立一个线程非常方便 但是!要使用NSThread管理多个线程非常困难,不推荐使用 ...
 - [转]Membership三步曲之入门篇 - Membership基础示例
		
本文转自:http://www.cnblogs.com/jesse2013/p/membership.html Membership三步曲之入门篇 - Membership基础示例 Members ...
 - iOS开发UI篇—Button基础
		
iOS开发UI篇—Button基础 一.简单说明 一般情况下,点击某个控件后,会做出相应反应的都是按钮 按钮的功能比较多,既能显示文字,又能显示图片,还能随时调整内部图片和文字的位置 二.按钮的三种状 ...
 - iOS开发基础篇-Button基础
		
一.简单介绍 UIButton 的功能:响应用户操作.显示文字.显示图片.调整内部图片和文字的位置. 二. UIButton 的状态 UIControlStateNormal :普通状态,为默认情 ...
 - Data Structures & js &ES 6 & ES next
		
Data Structures & js &ES 6 & ES next Algorithm Singly-Linked List & Doubly-Linked Li ...
 - 【0728 | 预习】第三篇  Python基础
		
第三篇 Python基础预习 Part 1 变量 一.什么是变量? 二.为什么要有变量? 三.定义变量 四.变量的组成 五.变量名的命名规范 六.变量名的两种风格 Part 2 常量 Part 3 P ...
 - 前端第二篇---前端基础之CSS
		
前端第二篇---前端基础之CSS 目录 一.css介绍 二.css语法 三.css的几种引入方式 四.css选择器 五.css属性相关 六.盒子模型 拓展 一.css介绍 CSS(Cascading ...
 
随机推荐
- 这些OAuth2客户端的认证方式你未必了解
			
OAuth2客户端按照它们与授权服务器进行安全认证的能力可以分为机密类型(Confidential)和公共类型(Public). 机密类型的自身会有个密码凭据,比如Web服务器后端程序:而公共类型则没 ...
 - XStream类对象把List<javaBean>()转成json数据
			
[省市联动] Servlet端: XStream把list转成json数据 //JSONArray-->变成数组/集合[] //JSONObject-->变成简单的数据{name:ayee ...
 - XML技术的作用?
			
XML技术用于数据存储.信息配置.数据交换三方面. 可以将数据存储在XML中,通过节点.元素内容.属性标示数据内容及关系. 可以使用XML很方便的做信息配置,软件的各种配置参数和对象关系都存贮在XML ...
 - Xml 映射文件中,除了常见的 select|insert|updae|delete  标签之外,还有哪些标签?
			
<resultMap>.<parameterMap>.<sql>.<include>. <selectKey>,加上动态 sql 的 9 个 ...
 - System.getenv和getProperty的区别
			
/** * System.getenv()是获取---环境变量(environment variables), * 系统层面的,好比我linux系统里的.bash_profile文件里面的变量 * 返 ...
 - pip 安装更新卸载  pip/yum换源
			
pip安装:sudo apt-get install python3-pip pip更新:sudo pip3 install --upgrade pip pip卸载:sudo apt-get remo ...
 - 什么是 Aspect?
			
aspect 由 pointcount 和 advice 组成, 它既包含了横切逻辑的定义, 也包 括了连接点的定义. Spring AOP 就是负责实施切面的框架, 它将切面所定义的横 切逻辑编织到 ...
 - 为什么需要域驱动设计DDD?
			
我们需要 DDD 的因素 – 微服务面试问题
 - 顺利通过EMC实验(6)
 - 转载:介绍AD另外一种奇葩的多通道复用的方法
			
原文链接:http://www.eda365.com/forum.php?_dsign=74fe4957&mod=viewthread&page=1&tid=110710 在设 ...