目录
创建索引:
请求头
put 192.168.0.101:9200/log_index/
请求体:
{
"mappings":{
"log_type":{
"properties":{
"name":{
"type":"keyword"
},
"age":{
"type":"integer"
},
"birthday":{
"type": "date"
}
}
}
}
}
插入测试数据
请求头
PUT 192.168.0.101:9200/log_index/log_type/_bulk
请求体:
{"index":{}}
{"name":"小黑","age":23,"birthday":"2012-12-12"}
{"index":{}}
{"name":"王小黑","age":24,"birthday":"2012-12-13"}
{"index":{}}
{"name":"张小五","age":8,"birthday":"2012-12-14"}
{"index":{}}
{"name":"win7","age":9,"birthday":"2012-12-15"}
{"index":{}}
{"name":"梅超风","age":43,"birthday":"2012-12-16"}
{"index":{}}
{"name":"张无忌","age":59,"birthday":"2012-12-17"}
QueryDSL用法
查询所有
请求头:
GET 192.168.0.101:9200/log_index/log_type/_search
请求体:
{
"query":{
"match_all":{}
}
}
注:match_all 而不是match-all中间是下划线
排序
说明:多字段排序,先按照出生日期降序排列,如果出生日期相同则按照年龄排序
请求头:
GET 192.168.0.101:9200/log_index/log_type/_search
请求体:
{
"query":{
"match_all":{}
},
"sort":{
"birthday":"desc",
"age":"asc"
}
}
或者
请求头:
GET 192.168.0.101:9200/log_index/log_type/_search
请求体:
{
"query":{
"match_all":{ }
},
"sort": [
{
"birthday":{
"order":"desc" }
},
{
"age":{
"order":"asc"
}
}
]
}
两种写法结果一样
查询n条数据
请求头:
GET 192.168.0.101:9200/log_index/log_type/_search
请求体:
{
"query":{
"match_all":{ }
},
"size":2,
"sort": [
{
"birthday":{
"order":"desc" }
},
{
"age":{
"order":"asc"
}
}
]
}
注意:size的位置适合query关键字并列,而不是在query关键字内部
分页查询
请求头:
GET 192.168.0.101:9200/log_index/log_type/_search
请求体:
{
"query":{
"match_all":{ }
},
"size":2,
"from":1,
"sort": [
{
"birthday":{
"order":"desc" }
},
{
"age":{
"order":"asc"
}
}
]
}
同理:from和size是并列的,from表示从第几页查询,size表示每页几条数据
查询结果返回指定列
请求头:
GET 192.168.0.101:9200/log_index/log_type/_search
请求体:
{
"query":{
"match_all":{ }
},
"size":2,
"from":1,
"_source":["name","age"]
}
注:关键字_source表示要显示的指定列,且指定列以数组的形式表现
关键字term查询
请求头:
GET 192.168.0.101:9200/log_index/log_type/_search
请求体:
{
"query":{
"term":{
"name":"梅超风"
}
},
"_source":["name","age"]
}
或者
请求头:
GET 192.168.0.101:9200/log_index/log_type/_search
请求体:
{
"query":{
"term":{
"name":{
"value":"梅超风"
}
}
},
"_source":["name","age"]
}
注:使用term关键字查询是特别需要注意text类型和keywordl类型的字段
NOTE1: 通过使用term查询得知ES中默认使用分词器为标准分词器(StandardAnalyzer),标准分词器对于英文单词分词,对于中文单字分词
NOTE2: 通过使用term查询得知,在ES的Mapping Type 中 keyword , date ,integer, long , double , boolean or ip 这些类型不分词**,**只有text类型分词
范围查询(range)
说明:查询年龄大于等于33小于等于35岁的文档数据
请求头:
GET 192.168.0.101:9200/log_index/log_type/_search
请求体:
{
"query":{
"range":{
"age":{
"gte":33,
"lte":35
}
}
},
"_source":["name","age"]
}
注:其中gte表示大于等于,lte表示小于等于,gt表示大于,lt表示小于
注:关键字range在query内部,而查询的关键字在range内部
前缀查询(prefix)
请求头:
GET 192.168.0.101:9200/log_index/log_type/_search
请求体:
{
"query":{
"prefix":{
"name":{
"value":"梅超"
}
}
},
"_source":["name","age"]
}
注:这里和term关键字有所区别,我的name字段类型是keyword(keyword默认是不分词),如果是term查询结果则是无数据,而使用perfix查询时则表示查询name是“梅超”前缀的修饰的文档数据。
通配符查询(wildcard)
请求头:
GET 192.168.0.101:9200/log_index/log_type/_search
请求体:
{
"query":{
"wildcard":{
"name":{
"value":"梅*"
}
}
},
"_source":["name","age"]
}
请求头:
GET 192.168.0.101:9200/log_index/log_type/_search
请求体:
{
"query":{
"wildcard":{
"name":{
"value":"梅?"
}
}
},
"_source":["name","age"]
}
注:*表示可以匹配一个或多个字符,而?只能匹配零个或一个,同时通配符要放到索引词的后面
根据多个id查询
请求头:
GET 192.168.0.101:9200/log_index/log_type/_search
请求体:
{
"query":{
"ids":{
"values":["AXnciHtbCxsROukG0JQu","AXnciHtbCxsROukG0JQv"]
}
},
"_source":["name","age"]
}
注:这里ids和values都是关键字(千万不要写成id或value!!!!),且values的值是数组的形式展现
模糊查询(fuzzy)
请求头:
GET 192.168.0.101:9200/log_index/log_type/_search
请求体:
{
"query":{
"fuzzy":{
"name":{
"value":"梅花风"
}
}
},
"_source":["name","age"]
}
注:fuzzy 模糊查询 最大模糊错误 必须在0-2之间
# 搜索关键词长度为 2 不允许存在模糊 0
# 搜索关键词长度为3-5 允许一次模糊 0 1
# 搜索关键词长度大于5 允许最大2模糊
如上梅超风三个字,则允许出现一个错误(官方文档这样定义的),因此查询梅花风也是能查询到数据的
bool查询
说明: 用来组合多个条件实现复杂查询
> **must: 相当于&& 同时成立**
> **should: 相当于|| 成立一个就行**
> **must_not: 相当于! 不能满足任何一个**
说明:查询年龄大于等于33小于等于35并且名称是小黑1的文档信息
请求头:
GET 192.168.0.101:9200/log_index/log_type/_search
请求体:
{
"query":{
"bool":{
"must":[
{
"term":{
"name":{
"value":"小黑1"
}
}
} ,
{
"range":{
"age":{
"gte":33,
"lte":35
}
}
}
]
}
},
"_source":["name","age"]
}
注意的是多个条件查询是比如must后面则是数组格式(内部是json格式的对象),而单个条件查询时则是json对象如下图
请求头:
GET 192.168.0.101:9200/log_index/log_type/_search
请求体:
{
"query":{
"bool":{
"must": {
"range":{
"age":{
"gte":33,
"lte":35
}
}
}
}
},
"_source":["name","age"]
}
高亮查询
说明:关键字梅超风,所有字段含有梅超风的文档数据都高亮显示
请求头:
GET 192.168.0.101:9200/log_index/log_type/_search
请求体:
{
"query":{
"bool":{
"must": {
"term":{
"name":{
"value":"梅超风"
}
}
}
}
},
"highlight":{
"fields":{
"*":{}
}
},
"_source":["name","age"]
}
自定义高亮标签
请求头:
GET 192.168.0.101:9200/log_index/log_type/_search
请求体:
{
"query":{
"bool":{
"must": {
"term":{
"name":{
"value":"梅超风"
}
}
}
}
},
"highlight":{
"pre_tags": ["<span style='color:red'>"],
"post_tags": ["</span>"],
"fields":{
"*":{}
}
},
"_source":["name","age"]
}
多字段查询
说明:在desc和content字段中查询名称是北京的文档数据(这里的desc,content都是text类型,name是keyword类型)。
请求头:
GET 192.168.0.101:9200/log_index/log_type/_search
请求体
{
"query":{
"multi_match":{
"query": "北京",
"fields":["desc","content"]
}
},
"_source":["name","age","desc","content"]
}
请求头:
GET 192.168.0.101:9200/log_index/log_type/_search
请求体
{
"query":{
"multi_match":{
"query": "北京",
"fields":["desc","content","name"]
}
},
"_source":["name","age","desc","content"]
}
1.多字段查询时需要注意字段类型,这里的age定义的是integer类型因此这样查询报错
请求头:
GET 192.168.0.101:9200/log_index/log_type/_search
请求体
{
"query":{
"multi_match":{
"query": "北京",
"fields":["desc","content","name","age"]
}
},
"_source":["name","age","desc","content"]
}
请求头:
GET 192.168.0.101:9200/log_index/log_type/_search
请求体
{
"query":{
"multi_match":{
"query": "北京欢迎",
"fields":["desc","content","name"]
}
},
"_source":["name","age","desc","content"]
}
注:如果对搜索的字段分词(即搜索的字段是text),则对query先分词在搜索,如果对搜索的字段不分词则直接使用query整体进行搜索。
多字段分词查询
请求头:
GET 192.168.0.101:9200/log_index/log_type/_search
请求体
{
"query":{
"query_string":{
"query": "北京",
"fields":["desc","content","name"]
}
},
"_source":["name","age","desc","content"]
}