超全的elasticsearch查询语句语法⼤全
es是什么?
es是基于Apache Lucene的开源分布式(全⽂)搜索引擎,,提供简单的RESTful API来隐藏Lucene的复杂性。es除了全⽂搜索引擎之外,还可以这样描述它:
1、分布式的实时⽂件存储,每个字段都被索引并可被搜索
2、分布式的实时分析搜索引擎
3、可以扩展到成百上千台服务器,处理PB级结构化或⾮结构化数据。
ES的数据组织类⽐
Relational DB Elasticsearch
数据库(database) 索引(indices)
表(tables) types
⾏(rows) documents
字段(columns) fields
mac安装ES
1、更新brew
brew update
2、安装java1.8版本
brew cask install homebrew/cask-versions/java8
3、安装ES
brew install elasticsearch
4、启动本地ES
brew services start elasticsearch
5、本地访问9200端⼝查看ES安装
localhost:9200
6、安装kibana
Kibana是ES的⼀个配套⼯具,可以让⽤户在⽹页中与ES进⾏交互
brew install kibana
7、本地启动kibana
brew services start kibana
8、本地访问5601端⼝进⼊kibana交互界⾯
localhost:5601
⼀、 ES简单的增删改查
1、创建⼀篇⽂档(有则修改,⽆则创建)
PUT test/doc/2
{
“name”:“wangfei”,
“age”:27,
“desc”:“热天还不让后⼈不认同”
}
PUT test/doc/1
{
“name”:“wangjifei”,
“age”:27,
“desc”:“萨芬我反胃为范围额”
}
PUT test/doc/3
{
“name”:“wangyang”,
“age”:30,
“desc”:“点在我⼼内的⼏⾸歌”
}
2、查询指定索引信息
GET test
3、 查询指定⽂档信息
GET test/doc/1
GET test/doc/2
4、查询对应索引下所有数据
GET test/doc/_search
GET test/doc/_search
{
“query”: {
“match_all”: {}
}
}
5、删除指定⽂档
DELETE test/doc/3
6、删除索引
DELETE test
7、修改指定⽂档⽅式
修改时,不指定的属性会⾃动覆盖,只保留指定的属性(不正确的修改指定⽂档⽅式)
PUT test/doc/1
{
“name”:“王计飞”
}
使⽤POST命令,在id后⾯跟_update,要修改的内容放到doc⽂档(属性)中(正确的修改指定⽂档⽅式)
POST test/doc/1/_update
{
“doc”:{
“desc”:“⽣活就像 茫茫海上”
}
}
⼆、ES查询的两种⽅式
1、查询字符串搜索
GET test/doc/_search?q=name:wangfei
2、结构化查询(单字段查询,不能多字段组合查询)
GET test/doc/_search
{
“query”:{
“match”:{
“name”:“wang”
}
}
}
三、match系列之操作
1、match系列之match_all (查询全部)
GET test/doc/_search
{
“query”:{
“match_all”: {
}
}
}
2、match系列之match_phrase(短语查询)
准备数据
PUT test1/doc/1
{
“title”: “中国是世界上⼈⼝最多的国家”
}
PUT test1/doc/2
{
“title”: “美国是世界上军事实⼒最强⼤的国家”}
PUT test1/doc/3
{
“title”: “北京是中国的⾸都”
}
查询语句
GET test1/doc/_search
{
“query”:{
“match”:{
“title”:“中国”
}
}
}
输出结果
{
“took” : 241,
“timed_out” : false,
“_shards” : {
“total” : 5,
“successful” : 5,
“skipped” : 0,
“failed” : 0
},
“hits” : {
“total” : 3,
“max_score” : 0.68324494,
“hits” : [
{
“_index” : “test1”,
“_type” : “doc”,
“_id” : “1”,
“_score” : 0.68324494,
“_source” : {
“title” : “中国是世界上⼈⼝最多的国家”
}
},
{
“_index” : “test1”,
“_type” : “doc”,
“_id” : “3”,
“_score” : 0.5753642,
“_source” : {
“title” : “北京是中国的⾸都”
}
},
{
“_index” : “test1”,
“_type” : “doc”,
“_id” : “2”,
“_score” : 0.39556286,
“_source” : {
“title” : “美国是世界上军事实⼒最强⼤的国家”
}
}
]
}
}
通过观察结果可以发现,虽然如期的返回了中国的⽂档。但是却把和美国的⽂档也返回了,这并不是我们想要的。是怎么回事呢?因为这是elasticsearch在内部对⽂档做分词的时候,对于中⽂来说,就是⼀个字⼀个字分的,所以,我们搜中国,中和国都符合条件,返回,⽽美国的国也符合。⽽我们认为中国是个短语,是⼀个有具体含义的词。所以elasticsearch在处理中⽂分词⽅⾯⽐较弱势。后⾯会讲针对中⽂的插件。但⽬前我们还有办法解决,那就是使⽤短语查询 ⽤match_phrase
GET test1/doc/_search
{
“query”:{
“match_phrase”: {
“title”: “中国”
}
}
}
查询结果
{
“took” : 10,
“timed_out” : false,
“_shards” : {
“total” : 5,
“successful” : 5,
“skipped” : 0,
“failed” : 0
},
“hits” : {
“total” : 2,
“max_score” : 0.5753642,
“hits” : [
{
“_index” : “test1”,
“_type” : “doc”,
“_id” : “1”,
“_score” : 0.5753642,
“_source” : {
“title” : “中国是世界上⼈⼝最多的国家”
}
},
{
“_index” : “test1”,
update语法大全
“_type” : “doc”,
“_id” : “3”,
“_score” : 0.5753642,
“_source” : {
“title” : “北京是中国的⾸都”
}
}
]
}
}
我们搜索中国和世界这两个指定词组时,但⼜不清楚两个词组之间有多少别的词间隔。那么在搜的时候就要留有⼀些余地。这时就要⽤到了slop了。相当于正则中的中国.*?世界。这个间隔默认为0

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。