ES的基本语法
1 基本使用
使用kibaba来执行语句
es安装和kibaba安装:https://www.cnblogs.com/jthr/p/17075759.html
1)添加PUT
已存在会直接覆盖
PUT /myindex/_doc/1
{
"id":1,
"name":"手机",
"price":3888.8,
"desc":"美国有苹果,中国有菠萝"
}
2)修改POST
POST/myindex/_doc/1
{
"id":1,
"name":"手机",
"price":3888.8,
"desc":"美国有苹果,中国有菠萝"
}
3)查询GET
GET /jsnh/user/1/
4)删除DELETE
DELETE /jsnh/user/1/
2 查询
2.1 测试数据准备
PUT /product/_doc/1
{
"name" : "xiaomi phone",
"desc" : "shouji zhong de zhandouji",
"price" : 3999,
"tags": [ "xingjiabi", "fashao", "buka" ]
}
PUT /product/_doc/2
{
"name" : "xiaomi nfc phone",
"desc" : "zhichi quangongneng nfc,shouji zhong de jianjiji",
"price" : 4999,
"tags": [ "xingjiabi", "fashao", "gongjiaoka" ]
} PUT /product/_doc/3
{
"name" : "nfc phone",
"desc" : "shouji zhong de hongzhaji",
"price" : 2999,
"tags": [ "xingjiabi", "fashao", "menjinka" ]
} PUT /product/_doc/4
{
"name" : "xiaomi erji",
"desc" : "erji zhong de huangmenji",
"price" : 999,
"tags": [ "low", "bufangshui", "yinzhicha" ]
} PUT /product/_doc/5
{
"name" : "hongmi erji",
"desc" : "erji zhong de kendeji",
"price" : 399,
"tags": [ "lowbee", "xuhangduan", "zhiliangx" ]
}
2.2 简单查询
1)查询product/_doc下所有
GET /product/_doc/_search
2)简单条件查询
返回name中包含xiaomi或者phone的关键字的
es采取的是关键字查询索引,xiaomi phone会被分词分为 xiaomi和phone,再去查找索引
GET /product/_doc/_search?q=name:xiaomi phone
3)简单条件+分页排序
页码为0,每页为2,安装price排正序
GET /product/_doc/_search?q=name:xiaomi phone&from=0&size=2&sort=price:asc
2.3 复杂查询
2.3.1 查询所有match_all
无条件查询所有
GET /product/_doc/_search
{
"query":{
"match_all": {}
}
}
2.3.2 单字段条件查询match
match会对查询条件进行分词处理,得到一些关键字,然后每个关键字去相等匹配,只要有一个匹配到,就可以返回,再根据相关度排序
返回name中包含xiaomi或者phone关键字的
GET /product/_doc/_search
{
"query":{
"match": {
"name":"xiaomi phone"
}
}
}
2.3.3 多字段条件匹配multi_match
multi_match和match的区别在于,可以对多个字段进行匹配查询
查询name字段或desc字段中包含phone关键字的的,multi_match多个字段单条件去匹配
GET /product/_doc/_search
{
"query":{
"multi_match": {
"query":"phone",
"fields":["name","desc"]
}
}
}
2.3.4 排序sort
GET /product/_doc/_search
{
"query":{
"multi_match": {
"query":"phone",
"fields":["name","desc"]
}
},
"sort":{
"price":"asc"
}
}
2.3.5 指定返回字段
可以指定只返回部分字段,不用全部字段都返回
只返回字段name和price
GET /product/_doc/_search
{
"query":{
"multi_match": {
"query":"phone",
"fields":["name","desc"]
}
},
"sort":{
"price":"asc"
},
"_source":["name","price"]
}
2.3.6 分页
GET /product/_doc/_search
{
"query":{
"multi_match": {
"query":"phone",
"fields":["name","desc"]
}
},
"sort":{
"price":"asc"
},
"_source":["name","price"],
"from":0,
"size":2
}
2.3.7 不分词查询term
查询条件不会被分词,而是整个作为一个关键字去查询
获取name包含关键字xiaomi erji的,由于关键字中没有xiaomi erji,只有xiaomi和erji这两个关键字,所以查不到
GET /product/_doc/_search
{
"query":{
"term": {
"name":"xiaomi erji"
}
},
"sort":{
"price":"asc"
},
"_source":["name","price"],
"from":0,
"size":2
}
2.3.8 不分词查询terms
和term的区别在于,对一个字段可以查询多个条件,满足一个就可以
获取name包含关键字包含xiaomi erji或者phone关键字的
GET /product/_doc/_search
{
"query":{
"terms": {
"name":["hongmi erji","phone"]
}
},
"sort":{
"price":"asc"
},
"_source":["name","price"],
"from":0,
"size":2
}
2.3.9 验证分词会怎么分_analyze
查询字符串"xiaomi nfc zhineng phone huhu"会被分成哪几个关键词
GET /_analyze
{
"analyzer": "standard",
"text":"xiaomi nfc zhineng phone huhu"
}
2.3.10 短语搜索match_phrase
match_phrase还是分词后去搜的
目标文档需要包含分词后的所有关键词
目标文档还要保持这些词的顺序和文档中的一致
添加测试数据
PUT /myindex/_doc/1
{
"id":1,
"name":"手机",
"price":3888.8,
"desc":"USA has apple China has pineapple"
}
PUT /myindex/_doc/2
{
"id":1,
"name":"手机",
"price":3888.8,
"desc":"USA has apple China has pear"
} PUT /myindex/_doc/3
{
"id":1,
"name":"手机",
"price":3888.8,
"desc":"USA has apple China has pear and pineapple"
}
查询
GET /myindex/_search
{
"query":{
"match_phrase":{
"desc":"China has pineapple"
}
}
}
查询结果,只有一条。说明match_phrase是分词后去查询的,且查询的结果必须包含查询条件的这几个关键词,且顺序连续一致
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 0.6026137,
"hits" : [
{
"_index" : "myindex",
"_type" : "mytype",
"_id" : "1",
"_score" : 0.6026137,
"_source" : {
"id" : 1,
"name" : "手机",
"price" : 3888.8,
"desc" : "USA has apple China has pineapple"
}
}
]
}
}
2.4 组合条件查询bool
bool标识组合条件
2.4.1 must
must标识必须满足的条件
1)查询name中包含xiaomi关键字的并且desc中包含shouji关键字的
{
"query":{
"bool":{
"must":
[
{
"match":{
"name":"xiaomi"
}
},
{
"match":{
"desc":"shouji"
}
}
]
}
}
}
2.4.2 filter
filter也是必须满足的条件,和must的区别是不计相关度分数。
1)查询name包含xiaomi关键字的,desc包含shouji关键字的,price大于4000的(这个条件不参与相关度分数的计算)
GET /product/_doc/_search
{
"query":{
"bool":{
"must":
[
{
"match":{
"name":"xiaomi"
}
},
{
"match":{
"desc":"shouji"
}
}
],
"filter":[
{
"range":{
"price":{
"gt":4000
}
}
}
]
}
}
}
2.4.3 should
相当于or匹配
minimum_should_match表示shoule中的条件有几个必须满足,可以为0。
如果bool查询包含至少一个should子句,而没有must或 filter子句,则默认值为1。否则,默认值为0
1)查询出name包含xiaomi关键字或者desc包含shouji关键字的
GET /product/_doc/_search
{
"query":{
"bool":{
"should":
[
{
"match":{
"name":"xiaomi"
}
},
{
"match":{
"desc":"shouji"
}
}
],
"minimum_should_match":1
}
}
}
2)查询出name包含xiaomi关键字并且desc包含shouji关键字的
GET /product/_doc/_search
{
"query":{
"bool":{
"should":
[
{
"match":{
"name":"xiaomi"
}
},
{
"match":{
"desc":"shouji"
}
}
],
"minimum_should_match":2
}
}
}
3)如下,因为存在must,所以minimum_should_match值为0,相当于should里的条件不存在,也就是查询price大于1999的
GET /product/_doc/_search
{
"query":{
"bool":{
"should":
[
{
"match":{
"name":"xiaomi"
}
},
{
"match":{
"desc":"shouji"
}
}
],
"must":[
{
"range":{
"price":{
"gt":1999
}
}
}
]
}
}
}
4)查询价格大于1999,并且(name包含xiaomi关键字或者desc包含shouji关键字)
GET /product/_doc/_search
{
"query":{
"bool":{
"should":
[
{
"match":{
"name":"xiaomi"
}
},
{
"match":{
"desc":"shouji"
}
}
],
"minimum_should_match":1,
"must":[
{
"range":{
"price":{
"gt":1999
}
}
}
]
}
}
}
5)查询价格大于1999,并且(name包含xiaomi关键字,并且desc包含shouji关键字)
GET /product/_doc/_search
{
"query":{
"bool":{
"should":
[
{
"match":{
"name":"xiaomi"
}
},
{
"match":{
"desc":"shouji"
}
}
],
"minimum_should_match":2,
"must":[
{
"range":{
"price":{
"gt":1999
}
}
}
]
}
}
}
2.4.4 must not
必须不满足,且不计算相关度分数
1)查询价格不能大于4000的,也就是价格小于等于4000的
GET /product/_doc/_search
{
"query":{
"bool":{
"must_not":[
{
"range":{
"price":{
"gt":4000
}
}
}
]
}
}
}
ES的基本语法的更多相关文章
- Node.js 全栈开发(二)——ES 201x 新语法的使用之基础篇
在讲 ES 2015 新语法之前,先来说一下为什么叫 ES.JavaScript 是这门语言的名称,它有一个为它制定标准化的组织 European Computer Manufacturers Ass ...
- ES 6新语法
一.块级作用域绑定 回顾:使用var关键字定义变量 定义 = 声明 + 赋值: 1. 可以一次定义多个变量 2. 定义时可以只声明不赋值 3. 定义之后可以随时修改变量的值 4. 变量声明会被提升 ...
- ES常用查询语法
1.query string search GET /index/type/_search?q=name:zhangsan&sort=age:desc 2.query DSL(Domain S ...
- es聚合查询语法
{ "size": 0, "query": { "bool": { "filter ...
- 009 webpack将ES高级语法进行装换
一:ES高级转换 1.main.js中的js不能解析 // js的主要入口 import $ from 'jquery' import './css/index.css' import './css/ ...
- 前端笔记之ES678&Webpack&Babel(上)初识ES678&Babel&let和const&解构&语法
一.ES版本简介和调试运行方法 1.1 ECMAScript简介 MDN手册:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript JavaS ...
- ES 08 - 创建、查看、修改、删除、关闭Elasticsearch的index
目录 1 创建index(配置mapping[映射]) 2 查看index 3 修改index 4 删除index 5 打开/关闭index 6 常见问题及解决方法 index相当于RDBMS(关系型 ...
- 47.serch基本语法
主要知识点 1._search api基本语法 2.http协议中get请求带上request body 一.search api的基本语法 1.GET /_search {所传递的参 ...
- ES 调优查询亿级数据毫秒级返回!怎么做到的?--文件系统缓存
一道面试题的引入: 如果面试的时候碰到这样一个面试题:ElasticSearch(以下简称ES) 在数据量很大的情况下(数十亿级别)如何提高查询效率? 这个问题说白了,就是看你有没有实际用过 ES,因 ...
- es相关
1.es在数据量很大的情况下(数十亿级别)如何提高查询性能啊? 2.es生产集群的部署架构是什么?每个索引的数据量大概有多少?每个索引大概有多少个分片? 3.es的分布式架构原理能说一下么(es是如何 ...
随机推荐
- 系统启动后bond配置不生效问题定位
背景描述 为了适配新功能,裸金属服务的磁盘镜像中做了如下修改: dracut添加network, iscsi模块 grub添加rd.iscsi.firmware=1参数 删除网卡配置文件/etc/sy ...
- gin-巧用Context传递多种参数
目录 引言: 1.巧妙包装gin.Context为NewContext 2 在使用gin.Use对每一个请求的Context进行组装 3 在路由绑定时解析出NewContext来为应用层函数提供参数, ...
- 区分mbr与gpt分区
查看分区类型 [root@localhost ~]# parted -l|egrep 'dev/|Part' Warning: Unable to open /dev/sr0 read-write ( ...
- JSP利用AJAX实现页面即时校验验证码
在JSP页面实现验证码校验文章中当时是使用的Servlet类来进行的验证码校验,但是这种方式并不能即时校验,在正常情况下都是直接在用户输入之后就进行校验,这样对用户来说很方便的. AJAX 即&quo ...
- 重要内置函数、常见内置函数、可迭代对象、迭代器对象、for循环的本质、异常捕获处理
重要内置函数 #zip拉链 zip 函数是可以接收多个可迭代对象,然后把每个可迭代对象中的第i个元素组合在一起,形成一个新的迭代器,类型为元组. l1 = [11, 22, 33] l2 = ['a' ...
- 【Devexpres】spreadsheetControl设置可见范围
// 获得当前电子表格的工作簿 Worksheet worksheet = spreadsheetControl.ActiveWorksheet; // 获得当前用户数据范围 CellRange us ...
- 【Java技术】String类的使用
属于引用类型,在java.lang包下,类似的还有Integer.Character.Boolean.Math 常用方法: char charAt(int index)返回 char指定索引处的值. ...
- VmWare安装Centos后配置Net网络SSH链接问题看这一遍就够了
1:首先安装VmWare 2:启动时在安装对应的Linux版本,网络就默认 net即可 3:都安装好了之后,注意有一个大坑,输入的账号密码都不能准确登录 最后发现是linux默认的输入法没有启用电脑键 ...
- elementui中 分页在vue中的使用
template中: <el-pagination background layout="prev, pager, next" :total="total&quo ...
- JavaScript:变量:声明和赋值变量时,内存结构是什么样的?
这里只是大概画出内存结构的模型图,方便理解当我们声明变量和赋值变量时,到底在干嘛. 如上图所示,a赋值一个对象{},b赋值字符串hello: 于是内存里划了三个区域给我们,一个存储我们声明的变量表,即 ...