前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ES系列九之常用查询api

ES系列九之常用查询api

作者头像
热心的大肚皮
发布2023-02-28 13:47:50
5280
发布2023-02-28 13:47:50
举报

一、term查询

代码语言:javascript
复制
{ 
    "query": {
        "term": {
            "title": "hello"
        }
    }
}

1.1、指定权重

代码语言:javascript
复制
{ 
    "query": {
        "term": {
            "title": {
                "value":"hello",
                "boost":10.0
             }
        }
    }
}

1.2.多term查询查询tags字段中包含novel或book

代码语言:javascript
复制
{ 
    "query": {
        "terms": {
            "tags": ["novel","book"]
        }
    }
}

二、常用词查询

2.1、cutoff_frequency查询低于这个概率的词

代码语言:javascript
复制
{ 
    "query": {
        "common": {
             "title":{
                 "query":"hello and hello",
                 "cutoff_frequency":0.001
             }
        }
    }
}

2.2、match查询( 不支持lucene查询语法,分词后再查询 )

查询title包含hello或and或like的文档

代码语言:javascript
复制
{ 
    "query": {
        "match": {
            "title": "hello and like"
        }
    }
}

2.3、operator操作符

要求and或者or匹配文本的分词

代码语言:javascript
复制
{ 
    "query": {
        "match": {
            "title": {
                 "query":"hello and like",
                 "operator":"and"
            }
        }
    }
}

2.4、短语查询

代码语言:javascript
复制
{ 
    "query": {
        "match_phrase": {
            "title": {
                 "query":"hello and like",
                 "slop":1
            }
        }
    }
}

2.5、前缀查询

对查询关键词的最后一个词条做前缀匹配

代码语言:javascript
复制
{ 
    "query": {
        "match_phrase_prefix": {
            "title": {
                 "query":"hello and like",
                 "slop":1,
                 "max_expansions":20
            }
        }
    }
}

2.6.multi_match( 针对多个字段查询 )

代码语言:javascript
复制
{ 
    "query": {
        "multi_match": {
             "query":"hello and like",
             "fields":["title","author"]
        }
    }
}

三、query_string查询( 支持lucene的查询语法 )

3.1、复合语法查询

title字段包含hello,且权重为10,也要包含like,但是otitle不包含cat,同事author字段包含Fyodor和dostoevsky。

代码语言:javascript
复制
{ 
    "query": {
        "query_string": {
             "query":"title:hello^10 +title:like -otitle:cat +author:(+Fyodor +dostoevsky)",
             "default_field":"title"
        }
    }
}

3.2、针对多字段查询

use_dis_max使用最大分查询,max指对于给定的关键词,只有最高分才会包括在最后的文档的评分中,而不是所有包含该词条的所有字段分数之和。

代码语言:javascript
复制
{ 
    "query": {
        "query_string": {
             "query":"hello and like",
             "fields":["title","author"],
              "use_dis_max":true
        }
    }
}

常见写法:

{“query”:{“query_string”:{“name:hello”}}}

name字段为hello

{“query”:{“query_string”:{“nam\\*:hello”}}}

存在一个nam开头的字段,值为hello

{“query”:{“query_string”:{“__missing__:name”}}}

name字段值为null的文档

{“query”:{“query_string”:{“__exists__:name”}}}

name字段值不为null的文档

{“query”:{“query_string”:{“name:(hello OR like)”}}}

name字段为hello或者like的文档

3.3、simple_query_string查询

解析出错时不抛异常,丢弃查询无效的部分

代码语言:javascript
复制
{ 
    "query": {
        "simple_query_string": {
             "query":"title:hello^10 +title:like -otitle:cat +author:(+Fyodor +dostoevsky)",
             "default_operator":"or"
        }
    }
}

3.4、标识符查询

代码语言:javascript
复制
{ 
    "query": {
        "ids": {
             "type":"book",
             "values":["1","2","3"]
        }
    }
}

3.5、前缀查询

前缀匹配给定的关键词

代码语言:javascript
复制
{ 
    "query": {
        "prefix": {
             "title":"cri"
        }
    }
}

指定权重

代码语言:javascript
复制
{ 
    "query": {
        "prefix": {
             "title":{
                 "value":"cri",
                 "boost":3.0
             }
        }
    }
}

3.6、fuzzy模糊查询

使用编辑距离的模糊查询,计算量较大,但是对用户拼写错的场景比较有用

代码语言:javascript
复制
{ 
    "query": {
        "fuzzy": {
             "title":"hello"
        }
    }
}

指定最小相似度偏差

代码语言:javascript
复制
{ 
    "query": {
        "fuzzy": {
             "title":{
                 "value":"hello",
                 "min_similarity":1
              }
        }
    }
}

3.7、通配符查询

支持*和?等通配符

代码语言:javascript
复制
{ 
    "query": {
        "wildcard": {
             "title": "he?lo"
        }
    }
}

?:任意字符

*:0个或任意多个字符

性能差,必须扫描整个倒排索引,才ok

3.8、范围查询

只能针对单个字段,可以是数值型的,也可以是基于字符串的。

代码语言:javascript
复制
{ 
    "query": {
        "range": {
             "year": {
                  "gte" :1890,
                  "lte":1900
              }
        }
    }
}

3.9、正则表达式查询

查询性能取决于正则表达式

代码语言:javascript
复制
{ 
    "query": {
        "regexp": {
             "title": {
                  "value" :"cr.m[ae]",
                  "boost":10.0  //配置评分乘以10
              }
        }
    }
}

K[A-Z].+

[0-9]:指定范围内的数字

[a-z]:指定范围内的字母

.:一个字符

+:前面的正则表达式可以出现一次或多次

wildcard和regexp,与prefix原理一致,都会扫描整个索引,性能很差

四、布尔查询( 组合查询 )

代码语言:javascript
复制
{
    "query": {
        "bool": {
            "must": {
                "term": {
                    "title": "hello"
                }
            }, 
            "should": {
                "range": {
                    "year": {
                        "from": 1900, 
                        "to": 2000
                    }
                }
            }, 
            "must_not": {
                "term": {
                    "otitle": "nothing"
                }
            }
        }
    }
}

mus:必须包含的条件,must not:不包含 ,should:包含的话会更匹配

搜索多个条件:

代码语言:javascript
复制
GET test*/_search
{
  "size":3,
  "query": {
    "bool":{
      "must": [
          {"match":{"message": "学生"}},
          {"match":{"message": "所有"}}
        ],
      "should": [
          {"match": {"port": "53198"}},
          {"match": {"@timestamp":"2018-09-17T17:49:25.991Z"}}
        ],
      "must_not": [
          {"match": {"port": "64273"}},
          {"match": {"port":"1234"}}
        ]
    }
  }
}

结果:

代码语言:javascript
复制
{
  "took": 25,
  "timed_out": false,
  "_shards": {
    "total": 35,
    "successful": 35,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 14,
    "max_score": 17.026089,
    "hits": [
      {
        "_index": "test-name",
        "_type": "doc",
        "_id": "Ff0g6GUBPXqEl7zCsbQb",
        "_score": 17.026089,
        "_source": {
          "@timestamp": "2018-09-17T15:23:06.878Z",
          "appname": "test-name",
          "level": "INFO",
          "port": 55714,
          "thread_name": "main",
          "level_value": 20000,
          "appName": "test-name",
          "@version": 1,
          "host": "192.168.1.100",
          "logger_name": "com.example.service.StudentService",
          "@metdata": {
            "ip_address": "192.168.1.100"
          },
          "message": "查询所有学生,pageNo1,pageSize1"
        }
      },
      {
        "_index": "test-name",
        "_type": "doc",
        "_id": "WFOm6GUBlATfpgHyvD55",
        "_score": 16.024178,
        "_source": {
          "@timestamp": "2018-09-17T17:49:25.991Z",
          "appname": "test-name",
          "level": "INFO",
          "port": 53198,
          "thread_name": "main",
          "level_value": 20000,
          "appName": "test-name",
          "@version": 1,
          "host": "192.168.1.100",
          "logger_name": "com.example.service.StudentService",
          "@metdata": {
            "ip_address": "192.168.1.100"
          },
          "message": "查询所有学生,pageNo1,pageSize1"
        }
      },
      {
        "_index": "test-name",
        "_type": "doc",
        "_id": "nAMg42UBRHcv2wBhnFDg",
        "_score": 14.024178,
        "_source": {
          "@timestamp": "2018-09-16T16:04:54.948Z",
          "appname": "test-name",
          "level": "INFO",
          "port": 58709,
          "thread_name": "main",
          "level_value": 20000,
          "appName": "test-name",
          "@version": 1,
          "host": "172.20.10.6",
          "logger_name": "com.example.service.StudentService",
          "@metdata": {
            "ip_address": "172.20.10.6"
          },
          "message": "查询所有学生,pageNo1,pageSize1"
        }
      }
    ]
  }
}

这个是一般我们使用的api 了,不知道为啥发了很多次都发不出去。难。。。。。。

本文参与?腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-07-08,如有侵权请联系?cloudcommunity@tencent.com 删除

本文分享自 程序猿日常笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com