第二十三节 ES的DSL查询

亮子 2024-03-28 00:16:18 17134 0 0 0

1、简单查询

1)查询索引列表

GET _cat/indices

图片alt

2)查询安装的插件

GET _cat/plugins

图片alt

3)、创建映射

PUT rs_user_info
{
  "mappings": {
      "properties" : {
        "createTime" : {
          "type" : "date",
          "format" : "yyyy-MM-dd HH:mm:ss"
        },
        "nickName" : {
          "type" : "text",
          "analyzer" : "ik_max_word"
        },
        "userAge" : {
          "type" : "integer"
        },
        "userAvatar" : {
          "type" : "keyword",
          "index" : false
        },
        "userHobby" : {
          "type" : "text",
          "analyzer" : "ik_max_word"
        },
        "userId" : {
          "type" : "keyword"
        },
        "userName" : {
          "type" : "keyword"
        }
      }
  }
}

图片alt

4)查看索引的映射

GET rs_user_info

图片alt

5)、删除索引

图片alt

6)查询所有数据

GET tb_user_info/_search
{
  "query": {
    "match_all": {}
  }
}

图片alt

7)根据昵称查询

GET tb_user_info/_search
{
  "query": {
    "match": {
      "nickName": "花花"
    }
  }
}

图片alt

8)根据昵称查询,根据年龄排序

GET tb_user_info/_search
{
  "query": {
    "match": {
      "nickName": "花花"
    }
  }
  , "sort": [
    {
      "age": {
        "order": "desc"
      }
    }
  ]
}

图片alt

9)根据昵称查询,根据年龄、时间排序

GET tb_user_info/_search
{
  "query": {
    "match": {
      "nickName": "花花"
    }
  }
  , "sort": [
    {
      "age": {
        "order": "desc"
      },
      "createTime": {
        "order": "asc"
      }
    }
  ]
}

图片alt

10)分页查询

GET tb_user_info/_search
{
  "query": {
    "match": {
      "nickName": "花花"
    }
  }
  , "sort": [
    {
      "age": {
        "order": "desc"
      },
      "createTime": {
        "order": "asc"
      }
    }
  ],
  "from": 0,
  "size": 5
}

图片alt

11)指定查询结果字段(field)

GET tb_user_info/_search
{
  "query": {
    "match": {
      "nickName": "花花"
    }
  }
  , "sort": [
    {
      "age": {
        "order": "desc"
      },
      "createTime": {
        "order": "asc"
      }
    }
  ],
  "from": 0,
  "size": 5,
  "_source": [
    "userName",
    "nickName"
  ]
}

图片alt

12)分词查询(match_phrase)

索引中必须有 同时 有这两个单词的才会在结果中。

GET es_user_info/_search
{
  "query": {
    "match_phrase": {
      "nickName": "梦里的画"
    }
  }
}

图片alt

2、复杂查询

图片alt

1)对结果进行区间过滤

GET tb_user_info/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "nickName": "花花"
          }
        }
      ],
      "filter": [
        {
          "range": {
            "age": {
              "gte": 20,
              "lte": 30
            }
          }
        }
      ]
    }
  }
}

图片alt

2)Highlight Search 高亮搜索

GET es_user_info/_search
{
  "query": {
    "match_phrase": {
      "nickName": "花花"
    }
  },
  "highlight": {
    "fields": {
      "nickName": {}
    }
  }
}

图片alt

3)必须满足分词结果中所有的词

GET es_user_info/_search
{
  "query": {
    "match": {
      "nickName": {
        "query": "花花世界",
        "operator": "and"
      }

    }
  },
  "highlight": {
    "fields": {
      "nickName": {}
    }
  }
}

图片alt

4)必须满足分词结果中百分比的词

match 还还有一种情况,就是必须满足分词结果中百分比的词,比如搜索词被分成这样子:java 程序员 书 推荐,这里就有 4 个词,假如要求 50% 命中其中两个词就返回,我们可以这样:

当然,这种需求也可以用 must、must_not、should 匹配同一个字段进行组合来查询

GET es_user_info/_search
{
  "query": {
    "match": {
      "nickName": {
        "query": "花花世界",
        "minimum_should_match": "50%"
      }

    }
  },
  "highlight": {
    "fields": {
      "nickName": {}
    }
  }
}

图片alt

5)匹配多个字段(multi_match)

GET es_user_info/_search
{
  "query": {
    "multi_match": {
      "query": "花花",
      "fields": ["nickName","hobby"]
    }
  }
}

图片alt

3、聚合查询

elasticsearch高级功能之聚合查询,是比较复杂的的高级功能,其中包含相关的统计功能,比如最大值、最小值、平均值、求和等,又比如筛选完数据后,还需要过滤筛选项,今天我们详细分析一下:

1)、聚合指标

1、基本的统计指标

1.1、计算基本类型的平均值

GET es_user_info/_search
{
  "size": 0, 
  "aggs": {
    "ageAve": {
      "avg": {
        "field": "age"
      }
    }
  }
}

图片alt

1.2、返回多个统计数据

GET es_user_info/_search
{
  "size": 0, 
  "aggs": {
    "mystatus": {
      "stats": {
        "field": "age"
      }
    }
  }
}

图片alt

2)、桶聚合查询

  1. 单维度桶聚合查询

1.1 按照用户性别聚合查询

GET es_user_info/_search
{
  "size": 0,
  "aggs": {
    "myaggs": {
      "terms": {
        "field": "gender"
      }
    }
  }
}

图片alt

1.2、范围聚合查询

GET /es_user_info/_search
{
  "size": 0,
  "aggs": {
    "my_agg": {
       "range": {
         "field": "age",
         "ranges": [
           {
             "to": 20
           },
           {
             "from": 20, 
             "to": 30
           },
           {
             "from": 30, 
             "to": 100
           }
         ]
       }
    }
  }
}

图片alt

1.3、按照性别维度聚合查询平均年龄

GET /es_user_info/_search
{
  "size": 0,
  "aggs": {
    "my_agg": {
       "terms": {
         "field": "gender"
       },
       "aggs": {
         "my_sum": {
           "avg": {
             "field": "age",
             "missing": 100
           }
         }
       }
    }
  }
}

图片alt

3)、聚合方式

1、先查询在聚合

GET /es_user_info/_search
{
  "size": 0,
  "query": {
    "term": {
      "gender": {
        "value": "woman"
      }
    }
  }, 
  "aggs": {
    "my_agg": {
      "avg": {
        "field": "age"
      }
    }
  }
}

图片alt

参考文章