本章内容概述
1、基本查询(QUERY查询)
2、结构化查询
1、基本查询(QUERY查询)
1.1 数据准备
先插入数据,以备测试使用
### 创建索引
PUT /lib3
PUT /lib3/user/1
{
"name":"zhaoliu",
"address":"hei long jiang tie ling shi",
"age":50,
"birthday":"1970-12-12",
"interests":"hejiu,duanlian,lvyou"
}
PUT /lib3/user/2
{
"name":"zhaoming",
"address":"bei jing shi hai dian qu",
"age":20,
"birthday":"1998-10-12",
"interests":"hejiu,changge,wanyouxi"
}
PUT /lib3/user/3
{
"name":"lisi",
"address":"bei jing shi chao yang qu",
"age":28,
"birthday":"1990-01-11",
"interests":"biancheng,shuijiao,wanyouxi"
}
PUT /lib3/user/4
{
"name":"wangwu",
"address":"bei jing shi fang shan qu",
"age":26,
"birthday":"1993-01-11",
"interests":"changge,tingyinyue,wanyouxi"
}
PUT /lib3/user/5
{
"name":"zhangsan",
"address":"zheng zhou shi er qi qu",
"age":32,
"birthday":"1988-05-11",
"interests":"tiaowu,tingyinyue"
}
1.2 基本条件查询
根据id进行查询
GET /lib3/user/id值[比如7]
查询当前所有类型的文档
GET /lib3/user/_search
根据多个ID批量查询
GET /lib3/user/_mget
{
"ids":["3","5"]
}
根据姓名查询
GET /lib3/user/_search?q=name:li si
GET /lib3/user/_search?q=interests:跳舞 查询不到内容
根据年龄查询:查询年龄21
GET /lib3/user/_search?q=age:21
根据年龄区间查询:查询年龄30岁-60岁之间
GET /lib3/user/_search?q=age[30 TO 60]
注意:TO 一定要大写
根据年龄区间查询,并且降序排列:查询年龄30岁-60岁之间 并且年龄降序
GET /lib3/user/_search?q=age[30 TO 60]&sort=age:desc
1.3 控制查询返回数量
根据年龄区间查询,降序排列并展示指定数据[分页]:查询年龄30岁-60岁之间 并且年龄降序、从0开始,显示2条数据
GET /lib3/user/_search?q=age[30 TO 60]&sort=age:desc&from=0&size=1
根据年龄区间查询,降序排列并展示指定数据[分页],展示直接列:查询年龄30岁-60岁之间 并且年龄降序、从0开始,显示2条数据,
展示name和age字段
GET /lib3/user/_search?q=age[30 TO 60]&sort=age:desc&from=0&size=2&_source=name,age
2、结构化查询
ES中的查询请求有两种方式,一种是简易版的查询,另外一种是使用JSON完整的请求体,叫做结构化查询(DSL)。
由于DSL查询更为直观也更为简易,所以大都使用这种方式。
DSL查询是POST过去一个json,由于post的请求是json格式的,所以存在很多灵活性,也有很多形式。
2.1 查询案例
2.1.1 term查询
term query 会去倒排索引中寻找确切的term,不进行分词器分析,文档中必须包含整个搜索的词汇,这种查询适合keyword,mumeric
date等。
1、根据名称精确查询姓名
GET /lib3/user/_search
{
"query": {
"term": {
"name": "li si"
}
}
}
"query":{} 定义查询条件
"term":{} 定义精确查询
"name": "li si" 定义精确查询的字段和对应值
2、根据爱好查询
GET /lib3/user/_search
{
"query":{
"term":{
"interests":"changge"
}
}
}
2.1.2 terms查询
terms: 查询某个字段中含有多个关键词的文档
1、查询爱好包含hejiu 或 changge的
GET /lib3/user/_search
{
"query":{
"terms":{
"interests":["changge","hejiu"]
}
}
}
只要包含关键词的一个,都会被查询出来
2.1.3 match模糊查询
match query 知道分词器的存在,会对字段进行分词操作,然后再查询
1、根据名称模糊查询
GET /lib3/user/_search
{
"query": {
"match": {
"name": "zhaoming zhaoliu"
}
}
}
"match":{} 定义模糊查询,类似于like
match查询相当于模糊匹配,只包含其中一部分关键词就行
2、多条件模糊查询 multi_match
GET /lib3/user/_search
{
"query": {
"multi_match": {
"query": "changge",
"fields": ["interests","name"]
}
}
}
"query" 后面是跟要查询的内容
"fields" 要查询的字段
2.1.4 结构化分页查询
1、分页查询
GET /lib3/user/_search
{
"from": 0,
"size": 2,
"query": {
"match": {
"interests": "changge"
}
}
}
"from" 开始下标
"size" 数量
注:类似于limit限定查询
2.1.5 控制显示字段
我们之前的查询是把所有的字段都显示出来,我们可以通过_source来控制要显示的字段:
GET /lib3/user/_search
{
"_source":["name","interests"],
"query":{
"match":{
"interests":"changge"
}
}
}
也可以通过includes和excludes来实现:
GET /lib3/user/_search
{
"_source":{
"includes": ["name","interests"],
"excludes": ["birthday","age"]
},
"query":{
"match":{
"interests":"changge"
}
}
}
也可以使用通配符来匹配指定的字段:
GET /lib3/user/_search
{
"_source":{
"includes": "a*",
"excludes": ["name","birthday"]
},
"query":{
"match":{
"interests":"changge"
}
}
}
2.1.6 排序
使用sort实现排序, desc 降序 asc 升序
GET /lib3/user/_search
{
"sort": [
{
"age": {
"order": "asc"
}
}
]
}
2.1.7 前缀匹配
匹配以指定前缀开始的字段
GET /lib3/user/_search
{
"query": {
"match_phrase_prefix": {
"name": "zhao"
}
}
}
2.1.8 范围查询
根据生日范围查询
GET /lib3/user/_search
{
"query": {
"range": {
"birthday": {
"gte": "1990-10-10",
"lte": "2018-05-01"
}
}
}
}
当然,也有人喜欢使用from to
GET /lib3/user/_search
{
"query": {
"range": {
"birthday": {
"from": "1990-10-10",
"to": "2018-05-01"
}
}
}
}
我们可以设置是否包含最大或最小
GET /lib3/user/_search
{
"query": {
"range": {
"age": {
"gte": 20,
"lte": 32,
"include_lower":true,
"include_upper":false
}
}
}
}
gt 相当于 >
lt 相当于 <
gte 相当于 >=
lte 相当于 <=
2.1.9 wildcard查询
允许使用通配符*和?来进行查询
* 代表0个或多个字符
? 代表任意一个字符
查询姓名以zhao开头后面任意的
GET /lib3/user/_search
{
"query": {
"wildcard": {
"name": "zhao*"
}
}
}
查询前面是li第三个字符任意,第四个字符是i的
GET /lib3/user/_search
{
"query": {
"wildcard": {
"name": "li?i*"
}
}
}
2.1.10 fuzzy实现模糊查询
当我们对于字段值不太记得时,我们可以通过fuzzy进行大致查询,找到对应匹配的值
GET /lib3/user/_search
{
"query": {
"fuzzy": {
"name": "zholiu"
}
}
}
GET /lib3/user/_search
{
"query": {
"fuzzy": {
"interests": {
"value":"change"
}
}
}
}
2.1.11 高亮搜索结果
GET /lib3/user/_search
{
"query":{
"match":{
"interests":"changge"
}
},
"highlight": {
"fields": {
"interests": {}
}
}
}
更多Kibana查询请参考: http://www.mamicode.com/info-detail-2107610.html
2.2 term与match区别
term查询不会对字段进行分词查询,会采用精确匹配。
match会根据该字段的分词器,进行分词查询。
ib3/user/_search
{
“query”: {
“fuzzy”: {
“interests”: {
“value”:“change”
}
}
}
}
### 2.1.11 高亮搜索结果
GET /lib3/user/_search
{
“query”:{
“match”:{
“interests”:“changge”
}
},
“highlight”: {
“fields”: {
“interests”: {}
}
}
}
更多Kibana查询请参考: http://www.mamicode.com/info-detail-2107610.html
## 2.2 term与match区别
term查询不会对字段进行分词查询,会采用精确匹配。
match会根据该字段的分词器,进行分词查询。