ElasticSearch 查询练习

发布时间 2023-09-23 15:53:27作者: liuzonglin

?查询练习

1. 写入数据

# 文档操作
PUT /liuzonglin/user/1
{
  "name": "liuzonglin",
  "age": 26,
  "desc": "天天都在学习,还算有点进步",
  "tages": ["技术仔", "好色", "指南"]
  
}

PUT /liuzonglin/user/2
{
  "name": "张三",
  "age": 26,
  "desc": "还算有点进步",
  "tages": ["技术仔", "渣男"]
  
}

PUT /liuzonglin/user/3
{
  "name": "李四",
  "age": 26,
  "desc": "还算有点进步",
  "tages": ["技术仔"]
  
}


2. 查询数据

GET _cat/indices?v
GET /liuzonglin/user/3

3. 更新数据

# 文档更新操作不加”_update“会跟put 命令一样效果,覆盖原有数据
POST /liuzonglin/user/1/
{
  "doc": {
    "name": "liuzonglin",
    "age": 26,
    "desc": "天天都在学习,还算有点进步",
    "tages": ["技术仔", "擅长java", "指南学习"]
  }
}

POST /liuzonglin/user/1/_update
{
  "doc": {
    "name": "liuzonglin",
    "age": 26,
    "desc": "天天都在学习,还算有点进步",
    "tages": ["技术仔", "擅长java", "指南学习"]
  }
}

PUT /liuzonglin/user/1
{
  "name": "张三",
  "age": 26,
  "desc": "还算有点进步",
  "tages": ["技术仔", "渣男"]
}

get 查询某个字段

GET liuzonglin/_search
{
  "query": {
    "match": {
      "name": "棕"
    }
  }
}

# 错误语句:不支持在搜索请求中指定类型。
GET liuzonglin/_doc/_search
{
  "query": {
    "match": {
      "name": "棕"
    }
  }
}

get 通过 age 进行排序

GET liuzonglin/_search
{
  "query": {
    "match": {
      "name": "棕"
    }
  },
  "sort": [
    {
      "age": {
        "order": "desc" # 降序 ; asc 升序 
      }
    }
  ]
}

GET 分页查询

GET liuzonglin/_search
{
  "query": {
    "match": {
      "name": "棕"
    }
  },
  "sort": [
    {
      "age": {
        "order": "desc"
      }
    }
  ],
  "from": 0, # 从第几个开始
  "size": 20 # 每页面数据个数
}

数据索引下标还是从 0 开始的

GET 布尔值查询(多条件精确查询)

1. must (and) 所有条件都要符合

GET liuzonglin/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "刘" # 模糊匹配
          }
        },
        {
          "match": {
            "age": 26 # age 相当于唯一标识
          }
        }
      ]
    }
  }
}

2. should(or)只要满足一条

GET liuzonglin/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "name": "刘" # 模糊匹配
          }
        },
        {
          "match": {
            "age": 26 # age 相当于唯一标识
          }
        }
      ]
    }
  }
}

3. must_not(no)返回不满足的信息

GET liuzonglin/_search
{
  "query": {
    "bool": {
      "must_not": [
        {
          "match": {
            "age": 2 # age 相当于唯一标识
          }
        }
      ]
    }
  }
}

4. filter 数据过滤

GET liuzonglin/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "刘"
          }
        },
        {
          "match": {
            "age": 26
          }
        }
      ],
      "filter": [
        {
          "range": {
            "age": {
              "gte": 10, # 大于等于 10
              "lte": 20  # 小于等于 20
            }
          }
        }
      ]
    }
  }
}

参数说明:

  • gt 大于
  • gte 大于等于
  • lt 小于
  • lte 小于等于

5. 匹配多个条件

GET liuzonglin/_search
{
  "query": {
    "match": {
      "tags": "天 三"
    }
  }
}

多个参数用空格分开

6. term 精确查询

关于分词:

  • term 直接精确查询
  • match 使用分词器解析(先分析文档,然后通过分析的文档进行查询)

text 可以分分词 keyword 不会被分词

7. term 精确多个值查询

GET liuzonglin/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "term": {
            "t1": 2 
          }
        },
        {
          "term": {
            "t1": 3 
          }
        }
      ]
    }
  }
}

8. 高亮查询

GET liuzonglin/_search
{
  "query": {
    "match": {
      "name": "棕"
    }
  },
  "highlight": {
    "fields": {
      "name": {}
    }
  }
}