Elasticsearch 新手上路(二)——Query DSL查询

Query DSL

  • Elasticsearch最常用的搜索方式是试用Query DSL进行搜索。学习一下。

主要参考:

《Elasticsearch :权威指南》中文版

https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html

查询

由于暂时不需要我插入创建索引类型插入文档,只需要用到查询,所以先写查询。

基础查询:

查询头

空查询:返回数据库里所有数据
GET /_search
{} 

查询格式说明:上面一行的GET 是指查询,/_serach的位置是查询路径。

要在某一个或多个类型(表)里面查询的话,可以在_search前面写上路径。

GET /index*/type*/_search
{}

这里的index和table都可以用正则表示多个索引和类型(数据库和表),还可以用逗号分隔表示多个。例如 /table1,table2/_search或者 /tabel*/_search也是允许的。

查询参数介绍

在查询头下面使用json格式进行查询。

常用参数:

from:查询起点

size:返回查询文档的个数

sort:按照某一或多个字段排序,先按照写在前面的条件排,后面依次排序。

    多值字段sort排序可以使用mode参数:min/max/avg/sum

  • from和size可以用来对查询进行分页。
query参数:

query:具体的查询语句

  • 具体的查询语句用json的形式存放在query里面。
  • 一般来说非空查询一定有query。

一个简单的例子:

GET bid/_search
{
  "from": 30,
  "size": 10,
  "sort": [
    {
      "FIELD": {
        "order": "desc",
     "mode": "min" } } ], "query": { "match_all": {} } } }

 

基础匹配方式:

  • query参数下写的查询

term类查询:

  • term类查询的特点是完全匹配查询,不进行分词,只有整个字段都一模一样才能匹配上。
  • 比方说你要匹配“hello”,就不会匹配出"hello world",“hello!!!” 的条目,只有“hello”才会被匹配出来。

term查询:

GET /_search
{
  "query":
  {
  #这部分写搜索的json,之后的查询语句都在这里
    "term": {
      "FIELD(字段名)": {
        "value": "VALUE(匹配的值)"
      }
    }
  }
}

term的部分也可以写成:
    "term": {
      "FIELD":"VALUE"
    }
  •  如果term查询不到,那可能是建表方式有问题,在建表时使用"index" : "not_analyzed"参数禁止分词就可以了。

terms查询:

  • 和terms一样,但是允许进行多值匹配

 

    "terms": {
      "FIELD": [
        "VALUE1",
        "VALUE2"
      ]
    }

 

match类查询:

  • match类的匹配会对文字进行分词处理,利用倒排索引进行匹配。

match_all查询:

  • 匹配所有文档
  • 没有指定查询方式的时候是默认的查询
  • 据说常配合filter使用。但是我没用过。
    "match_all": {}

match查询:

  • 普通分词匹配,使用中文时会将text按字进行分词,匹配所有带这个字的词。
  • 例如输入“你好”,会将“ 你 今天吃 好 饭了吗”也匹配出来
  "match": {
      "FIELD": "TEXT"
    }

match_phrase查询:

  • 不分词,按照输入的短语来匹配,不拆分短语
  • 输入“你好”时只匹配“你好,今天天气怎么样”,“我问你好不好”之类的你好连在一起的词。
    "match_phrase": {
      "FIELD": "PHRASE"
    }

match_phrase_prefix查询:

  • 和match_phrase差不多,按照前缀查询。常用于自动补全的检索
    "match_phrase_prefix": {
      "FIELD": "PREFIX"
    }

multi_match查询:

  • 允许匹配多个字段。
    "multi_match": {
      "query": "TEXT",
      "fields": ["FIELD1","FIELD2"]
    }

range类查询:

  • 可以处理int类型数字和时间日期等类型的范围,按照范围查询。

符号转换:

>   gt

>=   gte

<   lt

<=    lte 

#20<=x<30
"
range": { "age": { "gte": 20, "lt": 30 }

exists查询和missing查询:

  • 用来处理那些有值或无值的文档。
  • 相当于SQL的 IS_NULL 和 NOT IS_NULL
    "exists":   {
        "field":    "title"
    }

 组合多查询

  • 在query下的参数

bool查询

  • 使用bool参数将基础匹配组合起来进行查询

bool查询接受的参数:

  must:文档必须包含的条件

  must_not:文档必须不包含的条件

  should:满足这些条件的话增加评分权重

  filter:文档必须包含的条件,但是写在这里的过滤不影响权重评分,单纯过滤。

    filter里面可以使用exists查询missing查询和range查询,不可以用普通的match等查询

    "bool": {
      "must": [
        {"match": {
          "FIELD": "TEXT"
        }}
      ], 
      "should": [
        {"match": {
          "FIELD": "TEXT"
        }}
      ]
      , "filter": {"exists": {
        "field": "FIELD_NAME"
      }}
    }

constant_score查询

  • 专用于只有fliter的bool查询
    "constant_score": {
      "filter": {
        "exists": {
          "field": "FIELD_NAME"
        }
      },
      "boost": 1.2
    }

 

先到这里,以后再更新。

posted @ 2019-08-22 16:32  佐助家的兰兰  阅读(450)  评论(0)    收藏  举报