ElasticSearch高级查询QueryDSL

2022-09-06 ElasticSearchSpringBoot

搜索引擎ElasticSearch中提供了一种强大的检索数据方式,这种检索方式称之为Query DSL,Query DSL是利用Rest API传递JSON格式的请求体(Request Body)数据与ES进行交互,这种方式的丰富查询语法让ES检索变得更强大,更简洁。

GET /索引名/_doc/_search {json格式请求体数据}

# 测试数据

# 1.创建索引 映射
PUT /products/
{
  "mappings": {
    "properties": {
      "title":{
        "type": "keyword"
      },
      "price":{
        "type": "double"
      },
      "created_at":{
        "type":"date"
      },
      "description":{
        "type":"text"
      }
    }
  }
}
# 2.测试数据
PUT /products/_doc/_bulk
{"index":{}}
  {"title":"iphone12 pro","price":8999,"created_at":"2020-10-23","description":"iPhone 12 Pro采用超瓷晶面板和亚光质感玻璃背板,搭配不锈钢边框,有银色、石墨色、金色、海蓝色四种颜色。宽度:71.5毫米,高度:146.7毫米,厚度:7.4毫米,重量:187克"}
{"index":{}}
  {"title":"iphone12","price":4999,"created_at":"2020-10-23","description":"iPhone 12 高度:146.7毫米;宽度:71.5毫米;厚度:7.4毫米;重量:162克(5.73盎司) [5]  。iPhone 12设计采用了离子玻璃,以及7000系列铝金属外壳。"}
{"index":{}}
  {"title":"iphone13","price":6000,"created_at":"2021-09-15","description":"iPhone 13屏幕采用6.1英寸OLED屏幕;高度约146.7毫米,宽度约71.5毫米,厚度约7.65毫米,重量约173克。"}
{"index":{}}
  {"title":"iphone13 pro","price":8999,"created_at":"2021-09-15","description":"iPhone 13Pro搭载A15 Bionic芯片,拥有四种配色,支持5G。有128G、256G、512G、1T可选,售价为999美元起。"}

# 查询所有[match_all]

返回索引中的全部文档,第一行都是GET /products/_search,后面的案例将只展示json格式的数据,查询时第一行记得写。

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

# 关键词查询[term]

  • 通过使用term查询得知ES中默认使用分词器为`标准分词器(StandardAnalyzer),标准分词器对于英文单词分词,对于中文单字分词,所以说对中文的分词并不友好。
  • 过使用term查询得知,在ES的MappingType中keyword, date, integer, long, double, boolean OR ip 这些类型不分词,只有text类型分词。
{
 "query": {
   "term": {
     "price": {
       "value": 4999
     }
   }
 }
}

# 范围查询[range]

用来指定查询指定范围内的文档,gte代表大于,lte代表小于

{
  "query": {
    "range": {
      "price": {
        "gte": 1400,
        "lte": 9999
      }
    }
  }
}

# 前缀查询[prefix]

用来检索含有指定前缀的关键词的相关文档

{
  "query": {
    "prefix": {
      "title": {
        "value": "ipho"
      }
    }
  }
}

# 通配符查询[wildcard]

通配符查询:?用来匹配一个任意字符,*用来匹配多个任意字符

{
  "query": {
    "wildcard": {
      "description": {
        "value": "iphon*"
      }
    }
  }
}

# 多id查询[ids]

ids 关键字 : 值为数组类型,用来根据一组id获取多个对应的文档

{
  "query": {
    "ids": {
      "values": ["verUq3wBOTjuBizqAegi","vurUq3wBOTjuBizqAegk"]
    }
  }
}

# 模糊查询[fuzzy]

用来模糊查询含有指定关键字的文档

{
  "query": {
    "fuzzy": {
      "description": "iphooone"
    }
  }
}
  • 搜索关键词长度为 2 不允许存在模糊
  • 搜索关键词长度为3-5 允许一次模糊
  • 搜索关键词长度大于5 允许最大2模糊

# 布尔查询[bool]

用来组合多个条件实现复杂查询.

  1. must: 相当于&& 同时成立
  2. should: 相当于|| 成立一个就行
  3. must_not: 相当于! 不能满足任何一个
{
  "query": {
    "bool": {
      "must": [
        {"term": {
          "price": {
            "value": 4999
          }
        }}
      ]
    }
  }
}

# 多字段查询[multi_match]

GET /products/_search
{
  "query": {
    "multi_match": {
      "query": "iphone13 毫",
      "fields": ["title","description"]
    }
  }
}
注意: 字段类型分词,将查询条件分词之后进行查询改字段  如果该字段不分词就会将查询条件作为整体进行查询
上次更新: 1 年前