ElasticSearch之QueryDSL查询语法

目录

创建索引:

插入测试数据

QueryDSL用法

查询所有

排序

查询n条数据

分页查询

查询结果返回指定列

关键字term查询

范围查询(range)

前缀查询(prefix)

通配符查询(wildcard)

根据多个id查询

模糊查询(fuzzy)

高亮查询

自定义高亮标签


创建索引:

请求头
put 192.168.0.101:9200/log_index/


请求体:

{
    "mappings":{
        "log_type":{
           "properties":{
               "name":{
                   "type":"keyword"
               },
               "age":{
                   "type":"integer"
               },
               "birthday":{
                   "type": "date"
               }
           }
        }
    }
}

插入测试数据

请求头
PUT 192.168.0.101:9200/log_index/log_type/_bulk

请求体:
  {"index":{}}
  {"name":"小黑","age":23,"birthday":"2012-12-12"}
  {"index":{}}
  {"name":"王小黑","age":24,"birthday":"2012-12-13"}
   {"index":{}}
  {"name":"张小五","age":8,"birthday":"2012-12-14"}
  {"index":{}}
  {"name":"win7","age":9,"birthday":"2012-12-15"}
  {"index":{}}
  {"name":"梅超风","age":43,"birthday":"2012-12-16"}
   {"index":{}}
  {"name":"张无忌","age":59,"birthday":"2012-12-17"}

QueryDSL用法

查询所有

请求头:
GET 192.168.0.101:9200/log_index/log_type/_search

请求体:
{
    "query":{
       "match_all":{}
    }

}

注:match_all 而不是match-all中间是下划线

排序

说明:多字段排序,先按照出生日期降序排列,如果出生日期相同则按照年龄排序

请求头:
GET 192.168.0.101:9200/log_index/log_type/_search

请求体:
{
    "query":{
       "match_all":{}
    },
    "sort":{
       "birthday":"desc",
       "age":"asc"
    }

}

或者

请求头:
GET 192.168.0.101:9200/log_index/log_type/_search

请求体:
{
    "query":{
       "match_all":{ }
    },
    "sort": [
        {
        "birthday":{
            "order":"desc" }
        },
        {
           "age":{
               "order":"asc"
           }
        }
    ]
}

两种写法结果一样

查询n条数据

请求头:
GET 192.168.0.101:9200/log_index/log_type/_search

请求体:
{
    "query":{
       "match_all":{ }  
    },
    "size":2,
    "sort": [
        {
        "birthday":{
            "order":"desc" }
        },
        {
           "age":{
               "order":"asc"
           }

        }
    ]
}

注意:size的位置适合query关键字并列,而不是在query关键字内部

分页查询

请求头:
GET 192.168.0.101:9200/log_index/log_type/_search

请求体:

{
    "query":{
       "match_all":{ }  
    },
    "size":2,
    "from":1,
    "sort": [
        {
        "birthday":{
            "order":"desc" }
        },
        {
           "age":{
               "order":"asc"
           }

        }
    ]
}

同理:from和size是并列的,from表示从第几页查询,size表示每页几条数据

查询结果返回指定列

请求头:
GET 192.168.0.101:9200/log_index/log_type/_search

请求体:
{
    "query":{
       "match_all":{ }  
    },
    "size":2,
    "from":1,
    "_source":["name","age"]
   
}

注:关键字_source表示要显示的指定列,且指定列以数组的形式表现 

关键字term查询

请求头:
GET 192.168.0.101:9200/log_index/log_type/_search

请求体:

{
    "query":{
       "term":{
           "name":"梅超风"
       }
    },
    "_source":["name","age"]
}


或者

请求头:
GET 192.168.0.101:9200/log_index/log_type/_search

请求体:

{
    "query":{
       "term":{
           "name":{
                "value":"梅超风"
               }
       }
    },
    "_source":["name","age"]
}

注:使用term关键字查询是特别需要注意text类型和keywordl类型的字段 

NOTE1:  通过使用term查询得知ES中默认使用分词器为标准分词器(StandardAnalyzer),标准分词器对于英文单词分词,对于中文单字分词

NOTE2:  通过使用term查询得知,在ES的Mapping Type 中 keyword , date ,integer, long , double , boolean or ip 这些类型不分词**,**只有text类型分词

范围查询(range)

说明:查询年龄大于等于33小于等于35岁的文档数据

请求头:
GET 192.168.0.101:9200/log_index/log_type/_search

请求体:
{
    "query":{
      "range":{
        "age":{
              "gte":33,
              "lte":35
        }
      }
    },
    "_source":["name","age"]
}

注:其中gte表示大于等于,lte表示小于等于,gt表示大于,lt表示小于

注:关键字range在query内部,而查询的关键字在range内部

前缀查询(prefix)

请求头:
GET 192.168.0.101:9200/log_index/log_type/_search

请求体:
{
    "query":{
      "prefix":{
        "name":{
            "value":"梅超"
        }
      }
    },
    "_source":["name","age"]
}

注:这里和term关键字有所区别,我的name字段类型是keyword(keyword默认是不分词),如果是term查询结果则是无数据,而使用perfix查询时则表示查询name是“梅超”前缀的修饰的文档数据。

通配符查询(wildcard)

请求头:
GET 192.168.0.101:9200/log_index/log_type/_search

请求体:
{
    "query":{
      "wildcard":{
        "name":{
            "value":"梅*"
        }
      }
    },
    "_source":["name","age"]
}

请求头:
GET 192.168.0.101:9200/log_index/log_type/_search

请求体:
{
    "query":{
      "wildcard":{
        "name":{
            "value":"梅?"
        }
      }
    },
    "_source":["name","age"]
}

注:*表示可以匹配一个或多个字符,而?只能匹配零个或一个,同时通配符要放到索引词的后面

根据多个id查询

请求头:
GET 192.168.0.101:9200/log_index/log_type/_search

请求体:
{
    "query":{
      "ids":{
           "values":["AXnciHtbCxsROukG0JQu","AXnciHtbCxsROukG0JQv"]
      }
    },
    "_source":["name","age"]
}

注:这里ids和values都是关键字(千万不要写成id或value!!!!),且values的值是数组的形式展现

模糊查询(fuzzy)

请求头:
GET 192.168.0.101:9200/log_index/log_type/_search

请求体:

{
    "query":{
      "fuzzy":{
           "name":{
               "value":"梅花风"
           }
      }
    },
    "_source":["name","age"]
}

注:fuzzy 模糊查询  最大模糊错误 必须在0-2之间
        # 搜索关键词长度为 2 不允许存在模糊 0
        # 搜索关键词长度为3-5 允许一次模糊 0 1 
       # 搜索关键词长度大于5 允许最大2模糊

如上梅超风三个字,则允许出现一个错误(官方文档这样定义的),因此查询梅花风也是能查询到数据的

bool查询

说明: 用来组合多个条件实现复杂查询

> ​    **must: 相当于&& 同时成立**

> ​    **should: 相当于|| 成立一个就行**

> ​    **must_not: 相当于!  不能满足任何一个**

说明:查询年龄大于等于33小于等于35并且名称是小黑1的文档信息

请求头:
GET 192.168.0.101:9200/log_index/log_type/_search

请求体:

{
    "query":{
      "bool":{
          "must":[
              { 
                "term":{
                "name":{
                    "value":"小黑1"
                 }
               }
            } ,
            {
               "range":{
               "age":{
                     "gte":33,
                     "lte":35
               }
            }
            }
          ]
      }
    },
    "_source":["name","age"]
}

注意的是多个条件查询是比如must后面则是数组格式(内部是json格式的对象),而单个条件查询时则是json对象如下图

请求头:
GET 192.168.0.101:9200/log_index/log_type/_search

请求体:

{
    "query":{
      "bool":{
          "must": {
               "range":{
               "age":{
                     "gte":33,
                     "lte":35
               }
            }
          }
      }
    },
    "_source":["name","age"]
}

高亮查询

说明:关键字梅超风,所有字段含有梅超风的文档数据都高亮显示

请求头:
GET 192.168.0.101:9200/log_index/log_type/_search

请求体:
{
    "query":{
      "bool":{
          "must": {
               "term":{
               "name":{
                     "value":"梅超风"
               }
            }
          }
      }
    },
    "highlight":{
        "fields":{
        "*":{}
        }
    },
    "_source":["name","age"]
}

 

自定义高亮标签

请求头:
GET 192.168.0.101:9200/log_index/log_type/_search

请求体:
{
    "query":{
      "bool":{
          "must": {
               "term":{
               "name":{
                     "value":"梅超风"
               }
            }
          }
      }
    },
    "highlight":{
        "pre_tags": ["<span style='color:red'>"],
        "post_tags": ["</span>"],
        "fields":{
        "*":{}
        }
    },
    "_source":["name","age"]
}

多字段查询

说明:在desc和content字段中查询名称是北京的文档数据(这里的desc,content都是text类型,name是keyword类型)。

请求头:
GET 192.168.0.101:9200/log_index/log_type/_search

请求体
{
    "query":{
      "multi_match":{
          "query": "北京",
          "fields":["desc","content"]

      }
    },
    "_source":["name","age","desc","content"]
}


请求头:
GET 192.168.0.101:9200/log_index/log_type/_search

请求体

{
    "query":{
      "multi_match":{
          "query": "北京",
          "fields":["desc","content","name"]

      }
    },
    "_source":["name","age","desc","content"]
}

 1.多字段查询时需要注意字段类型,这里的age定义的是integer类型因此这样查询报错

请求头:
GET 192.168.0.101:9200/log_index/log_type/_search

请求体
{
    "query":{
      "multi_match":{
          "query": "北京",
          "fields":["desc","content","name","age"]

      }
    },
    "_source":["name","age","desc","content"]
}

请求头:
GET 192.168.0.101:9200/log_index/log_type/_search

请求体

{
    "query":{
      "multi_match":{
          "query": "北京欢迎",
          "fields":["desc","content","name"]

      }
    },
    "_source":["name","age","desc","content"]
}

注:如果对搜索的字段分词(即搜索的字段是text),则对query先分词在搜索,如果对搜索的字段不分词则直接使用query整体进行搜索。

多字段分词查询

请求头:
GET 192.168.0.101:9200/log_index/log_type/_search

请求体
{
    "query":{
      "query_string":{
          "query": "北京",
          "fields":["desc","content","name"]

      }
    },
    "_source":["name","age","desc","content"]
}

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值