肥仔教程网

SEO 优化与 Web 开发技术学习分享平台

Elasticsearch 入门 - 查询方式_elasticsearch join查询

查询所有文档

在 Postman 中,向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/people/_search

{ 
   "query": { 
   "match_all": {
   		}	 
   } 
} 

# "query":这里的 query 代表一个查询对象,里面可以有不同的查询属性

# "match_all":查询类型,例如:match_all(代表查询所有), match,term , range 等等

# {查询条件}:查询条件会根据类型的不同,写法也有差异

返回值

{
    "took": 0,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 3,
            "relation": "eq"//【计数规则】: "eq" # eq 表示计数准确, gte 表示计数不准确
        },
        "max_score": 1.0,//【匹配度分值】"
        "hits": [
            {
                "_index": "people",
                "_type": "_doc",
                "_id": "3",
                "_score": 1.0,
                "_source": {
                    "name": "小红",
                    "sex": "女",
                    "phone": "3333"
                }
            },
            {
                "_index": "people",
                "_type": "_doc",
                "_id": "1",
                "_score": 1.0,
                "_source": {
                    "name": "小明",
                    "sex": "男",
                    "phone": "1111"
                }
            },
            {
                "_index": "people",
                "_type": "_doc",
                "_id": "2",
                "_score": 1.0,
                "_source": {
                    "name": "小华",
                    "sex": "男",
                    "phone": "2222"
                }
            }
        ]
    }
}

匹配查询

match 匹配类型查询,会把查询条件进行分词,然后进行查询,多个词条之间是 or 的关系 在 Postman 中,向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/people/_search

字段匹配查询

multi_match 与 match 类似,不同的是它可以在多个字段中查询。 在 Postman 中,向 ES 服务器发 GET 请求 :
http://127.0.0.1:9200/people/_search

{ 
   "query": { 
     "multi_match": { 
       "query": "男", 
       "fields": ["name","sex"] 
     } 
   } 
}

关键字精确查询

term 查询,精确的关键词匹配查询,不对查询条件进行分词。在 Postman 中,向 ES 服务器发 GET 请求 :
http://127.0.0.1:9200/people/_search

{
	"query": {
		"term": {
			"name": {
				"value": "xxx"
			}
		}
	}
}

注意:精确匹配 如果要使用name中文查询,是查不出来的,要改成name.keyword

多关键字精确查询

terms 查询和 term 查询一样,但它允许你指定多值进行匹配。如果这个字段包含了指定值中的任何一个值,那么这个文档满足条件,类似于 mysql 的 in 在 Postman 中,向 ES 服务器发 GET 请求 :
http://127.0.0.1:9200/people/_search

{
	"query": {
		"terms": {
			"name.keyword": ["小明","小红"]
		}
	}
}

指定查询字段

默认情况下,Elasticsearch 在搜索的结果中,会把文档中保存在_source 的所有字段都返回。如果我们只想获取其中的部分字段,我们可以添加_source 的过滤

在 Postman 中,向 ES 服务器发 GET 请求 :
http://127.0.0.1:9200/people/_search

{   
  "_source": ["name"],
	"query": {
		"terms": {
			"name.keyword": ["小明","小红"]
		}
	}
}

我们也可以通过:

  • includes:来指定想要显示的字段
  • excludes:来指定不想要显示的字段
{   
    "_source": {
        "includes": ["name","phone"],
        "excludes": ["name"]
    },
	"query": {
		"terms": {
			"name.keyword": ["小明","小红"]
		}
	}
}

组合查询

`bool`把各种其它查询通过`must`(必须 )、`must_not`(必须不)、`should`(应该)的方式进行组合

在 Postman 中,向 ES 服务器发 GET 请求 :
http://127.0.0.1:9200/people/_search

{
	"query": {
		"bool": {
			"must": [{
				"match": {
					"name.keyword": "小明"
				}
			}],
			"must_not": [{
				"match": {
					"phone": "1212"
				}
			}],
			"should": [{
				"match": {
					"sex.keyword": "男"
				}
			}]
		}
	}
}

范围查询

range 查询找出那些落在指定区间内的数字或者时间。range 查询允许以下字符

操作符

说明

gt

大于>

gte

大于等于>=

lt

小于<

lte

小于等于<=

在 Postman 中,向 ES 服务器发 GET 请求 :
http://127.0.0.1:9200/student/_search

{
	"query": {
		"range": {
			"age": {
				"gte": 30,
				"lte": 35
			}
		}
	}
}

模糊查询

返回包含与搜索字词相似的字词的文档。

编辑距离是将一个术语转换为另一个术语所需的一个字符更改的次数。这些更改可以包括:

  • 更改字符(box → fox)
  • 删除字符(black → lack)
  • 插入字符(sic → sick)
  • 转置两个相邻字符(act → cat)

我们输入字符的大概,ES就可以去根据输入的内容大概去匹配一下结果;

注意:他和我们在MySQL中的模糊查询还是有区别的,他有个偏移值;比如:当我们在京东中输入appla 的时候他会出现许多apple(苹果),就像它有个自动修正似的;它就是按照匹配的相似度来的;也就是说,一些信息,有对的也有错误的,它会利用这些大概的信息,给我们匹配信息出来;

在 Postman 中,向 ES 服务器发 GET 请求 :
http://127.0.0.1:9200/student/_search

{
	"query": {
		"fuzzy": {
			"title": {
				"value": "zhangsan"
			}
		}
	}
}

模糊查询,我们输入字符的大概,ES就可以去根据输入的内容大概去匹配一下结果;

注意:他和我们在MySQL中的模糊查询还是有区别的,他有个偏移值;比如:当我们在京东中输入appla 的时候他会出现许多apple(苹果),就像它有个自动修正似的;它就是按照匹配的相似度来的;也就是说,一些信息,有对的也有错误的,它会利用这些大概的信息,给我们匹配信息出来;

他有几个属性,例如:设置保证前几个是不能出错,设置最大的偏移量(也就是可以错误几个值)

#模糊查询fuzzy
GET /book/novel/_search
{
  "query": {
    "fuzzy": {
      "name": {
        "value": "我的好",
        "fuzziness": 2     #偏差的个数
      }
    }
  }
}

解释:name字段中的数据和关键字**“我的好”,进行匹配;”fuzziness”:2 含义是允许匹配的数字与关键字有最多两个字的偏差**(不同);

#模糊查询fuzzy
GET /book/novel/_search
{
  "query": {
    "fuzzy": {
      "author": {
        "value": "滔滔滔",
        "prefix_length": 1  #指定前面几个字符是不允许出现错误的
      }
    }
  }
}

解释:author字段中的数据和关键字“滔滔滔”,进行匹配;”prefix_length”: 1 含义是指定前面几个字符是不允许出现错误的;

注意:prefix_length 和fuzziness这两个属性是进一步筛选的,如果有些词语查不出来,原因是就算当没有这两个属性的时候也无法进行匹配出来;所以加上了这两个属性,就更不能匹配出来;这里要注意;如果有问题,就先把这两个属性先去掉试试;

单字段排序

sort 可以让我们按照不同的字段进行排序,并且通过 order 指定排序的方式。desc 降序,asc 升序。

在 Postman 中,向 ES 服务器发 GET 请求 :
http://127.0.0.1:9200/student/_search

{
	"query": {
		"match": {
			"name": "zhangsan"
		}
	},
	"sort": [{
		"age": {
			"order": "desc"
		}
	}]
}

多字段排序

假定我们想要结合使用 age 和 _score 进行查询,并且匹配的结果首先按照年龄排序,然后按照相关性得分排序

在 Postman 中,向 ES 服务器发 GET 请求 :
http://127.0.0.1:9200/student/_search

{
	"query": {
		"match_all": {}
	},
	"sort": [{
			"age": {
				"order": "desc"
			}
		},
		{
			"_score": {
				"order": "desc"
			}
		}
	]
}

高亮查询

在进行关键字搜索时,搜索出的内容中的关键字会显示不同的颜色,称之为高亮

Elasticsearch 可以对查询内容中的关键字部分,进行标签和样式(高亮)的设置。 在使用 match 查询的同时,加上一个 highlight 属性:

pre_tags:前置标签

post_tags:后置标签

fields:需要高亮的字段

title:这里声明 title 字段需要高亮,后面可以为这个字段设置特有配置,也可以空

在 Postman 中,向 ES 服务器发 GET 请求 :
http://127.0.0.1:9200/student/_search

{
	"query": {
		"match": {
			"name": "zhangsan"
		}
	},
	"highlight": {
		"pre_tags": "<font color='red'>",
		"post_tags": "</font>",
		"fields": {
			"name": {}
		}
	}
}

分页查询

from:当前页的起始索引,默认从 0 开始。 from = (pageNum - 1) * size;size:每页显示多少条

在 Postman 中,向 ES 服务器发 GET 请求 :
http://127.0.0.1:9200/student/_search

{
	"query": {
		"match_all": {}
	},
	"sort": [{
		"age": {
			"order": "desc"
		}
	}],
	"from": 0,
	"size": 2
}

聚合查询

聚合允许使用者对 es 文档进行统计分析,类似与关系型数据库中的 group by,当然还有很多其他的聚合,例如取最大值、平均值等等。

对某个字段取最大值 max

在 Postman 中,向 ES 服务器发 GET 请求 :
http://127.0.0.1:9200/student/_search

{
  "aggs":{
    "max_age":{
      "max":{"field":"age"}
    }
  },
  "size":0
}

对某个字段取最小值 min

{
  "aggs":{
    "min_age":{
      "min":{"field":"age"}
    }
  },
  "size":0
}

对某个字段求和 sum

{
  "aggs":{
    "sum_age":{
      "sum":{"field":"age"}
    }
  },
  "size":0
}

对某个字段取平均值 avg

{
  "aggs":{
    "avg_age":{
      "avg":{"field":"age"}
    }
  },
  "size":0
}

对某个字段的值进行去重之后再取总数

{
  "aggs":{
    "distinct_age":{
      "cardinality":{"field":"age"}
    }
  },
  "size":0
}

State 聚合

stats 聚合,对某个字段一次性返回 count,max,min,avg 和 sum 五个指标

{
  "aggs":{
    "stats_age":{
      "stats":{"field":"age"}
    }
  },
  "size":0
}

桶聚合查询

桶聚和相当于 sql 中的 group by 语句

terms 聚合,分组统计

在 Postman 中,向 ES 服务器发 GET 请求 :
http://127.0.0.1:9200/student/_search

{
  "aggs":{
    "age_groupby":{
      "terms":{"field":"age"}
    }
  },
  "size":0
}

在 terms 分组下再进行聚合

在 Postman 中,向 ES 服务器发 GET 请求 :
http://127.0.0.1:9200/student/_search

{
	"aggs": {
		"age_groupby": {
			"terms": {
				"field": "age"
			},
            "aggs": {
			    "sum_age": {
				    "sum": {
					    "field": "age"
				    }
			    }
		    }
		}
		
	},
	"size": 0
}
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言