ElasticSearch基础查询,开整
首先创建索引并向其中添加数据
在这里我用的是直接生成索引,之所以可以自动生成索引是因为es会自动判定传入参数类型(但建议自己生成索引)
POST your_index/_doc
{
"name":"嘿嘿嘿",
"body":"男",
"title":"这是一个标题",
"user":123456
}
POST your_index/_doc
{
"name":"哈哈哈",
"body":"女",
"title":"标题",
"user":23456
}
获取全部数据
GET your_index/_search
{
"query": {
"bool": {
}
}
}
返回结果 hits是本次返回结果(其余返回字段下次介绍)
{
"took" : 286,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 3,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "your_index",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"title" : "Relationships",
"body" : "It's complicated...",
"user" : 1,
"name" : "123"
}
},
{
"_index" : "your_index",
"_type" : "_doc",
"_id" : "tZt8S3IB1MaVq7kAgCMj",
"_score" : 1.0,
"_source" : {
"name" : "嘿嘿嘿",
"body" : "男",
"title" : "这是一个标题",
"user" : 123456
}
},
{
"_index" : "your_index",
"_type" : "_doc",
"_id" : "Dpt9S3IB1MaVq7kALiUw",
"_score" : 1.0,
"_source" : {
"name" : "哈哈哈",
"body" : "女",
"title" : "标题",
"user" : 23456
}
}
]
}
}
基本查询操作介绍
GET your_index/_search
{
"query": {
"bool": {
"must": [ must代表必须满足里面的条件
{}
],
"must_not": [ must_not代表必须不满足里面的条件
{}
],
"should": [ should代表应该满足,既满足里面任意一条件就可以展现出来
{}
]
}
}
}
must使用(必须满足)
GET your_index/_search
{
"query": {
"bool": {
"must": [
{
"term": { #这个trem是es关键字,本次查询是查询boby的值是男的数据
"body": { #your_index中的字段
"value": "男"
}
}
}
]
}
}
}
结果返回:
{
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 1.0925692,
"hits" : [
{
"_index" : "your_index",
"_type" : "_doc",
"_id" : "tZt8S3IB1MaVq7kAgCMj",
"_score" : 1.0925692,
"_source" : {
"name" : "嘿嘿嘿",
"body" : "男",
"title" : "这是一个标题",
"user" : 123456
}
}
]
}
}
must_not(必须不满足)
GET your_index/_search
{
"query": {
"bool": {
"must_not":[ #必须不满足
{
"term": {
"name": {
"value": "嘿嘿嘿"
}
}
}
]
}
}
}
should(应该满足,即如果should中有条件满足就展现满足条件的,如果不满足便为空)
should与must区别最大点在于must中的 条件必须全部同时满足才可以查询出数据,should可以只满足一个便查出,或者满足里面任意一个条件
GET your_index/_search
{
"query": {
"bool": {
"should": [
{
"match": {
"title": "这是一个标题"
}
}
]
}
}
}
结果返回
{
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 2,
"relation" : "eq"
},
"max_score" : 3.4513912,
"hits" : [
{
"_index" : "your_index",
"_type" : "_doc",
"_id" : "tZt8S3IB1MaVq7kAgCMj",
"_score" : 3.4513912,
"_source" : {
"name" : "嘿嘿嘿",
"body" : "男",
"title" : "这是一个标题",
"user" : 123456
}
},
{
"_index" : "your_index",
"_type" : "_doc",
"_id" : "Dpt9S3IB1MaVq7kALiUw",
"_score" : 1.0884296,
"_source" : {
"name" : "哈哈哈",
"body" : "女",
"title" : "标题",
"user" : 23456
}
}
]
}
}
大家对这个结果是不是很意外,因为我的数据里面只有一条数据里面包含"这是一个标题"的内容啊,为什么会展现出来两个呢,这是因为我们should里面用的是match关键字,这个关键字跟sql中的like有点相像,但这并不是说match这个就是模糊,它并不是模糊,它只是将我们的文本字段分词了,简单的说一下,比如说"这是一个标题"这段文本(text类型),当我们存入es之后它便会替我们分词,例如会分成"这是" “一个” “文本”,那当我们去查询的时候,我们传入的数据也会被分词,然后与查询字段进行匹配,如果满足匹配则返回结果
range范围查询(一般范围查询用于时间与数值类型的字段查询)
GET your_index/_search
{
"query": {
"bool": {
"must": {
"range": { #范围查询关键字
"user": {
"gte": 123456, #gte代表大于等于
"lte": 123457 #代表小于等于
}
}
}
}
}
}
返回结果
{
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "your_index",
"_type" : "_doc",
"_id" : "tZt8S3IB1MaVq7kAgCMj",
"_score" : 1.0,
"_source" : {
"name" : "嘿嘿嘿",
"body" : "男",
"title" : "这是一个标题",
"user" : 123456
}
}
]
}
}
filter(过滤查询)
GET your_index/_search
{
"query": {
"bool": {
"filter": { #filter可以接收单个条件,也可以是以数组形式接收多个条件
"range": {
"user": {
"gte": 123456,
"lte": 123457
}
}
}
}
}
是否有同学会有疑问,这个filter与must与must_not有什么区别的,它们的却别在于filter代表只代表满足与不满足,es的查询并不如我们sql中的查询一样,只返回结果,es还会返回一个评分字段,也就是例如你全文检索时,会给你依据评分高低排序返回,凡是在filter中的条件统统不参与打评分,这也是说在我们不需要评分的时候我们可以把条件直接写进filter中,速度会快一点(毕竟不用参与打分)
exists(刨除字段为空的数据)
GET your_index/_search
{
"query": {
"bool": {
"filter": {
"exists": { #有些时候我们并不需要获取此字段为null的数据,便可以勇exitsts进行排除,但注意此关键字只能排除null不会排除""(空字符串)
"field": "user"
}
}
}
好了,以上就是本次分享的内容啦,如有疑问,可以评论提出哦!
以上查询是利用工具kibana 官网下载地址如下https://www.elastic.co/cn/downloads/kibana
(记得kibana与es的版本尽量一致,不一致容易导致一些意想不到的问题)