一、概念
es提供的以restful风格进行交互的DSL,请求体是JSON格式。
主要有两种类型:
第一种是叶子查询语句(Leaf Query),用于查询某个特定的字段,例如match,term,
第二种是复合查询语句,也就是组合了多个叶子查询或者嵌套了其它的复合查询的语句,例如bool组合查询、
fifter查询、range查询等等,是根据多个字段的查询组成。
二、Query and filter 的区别
query语句查询的时候,要计算匹配度(_score分数),fifter与会值关心是否匹配,不会计算得分。
GET /_search
{
"query": {
"bool": {
"": [
{
"match": {
"title": "Search" }},
{
"match": {
"content": "Elasticsearch" }}
],
"filter": [
{
"term": {
"status": "published" }},
{
"range": {
"publish_date": {
"gte": "2015-01-01" }}}
]
}
}
}
例子分析:
(1)、query参数在最外层,所以是处于整个query context中。
(2)、整个bool查询,都是query的子查询语句,所以里面的must、match会计算得分(匹配度)
(3)、bool子查询语句中的被filter包裹起来的部分,是处于fifter context中,不会计算得分。
三、查询语句
1、简单查询
(1)、GET /lib/user/_search : 查询lib索引下的user类型的全部数据
(2)、GET /lib/_search :查询lib索引下的全部类型的数据
(3)、GET /_search :查询全部索引下的数据
2、精确查找
如果需要按照精确值进行查询,最好是使用过滤器fifter,因为不会计算评分,而且容易被缓存。
结合term查询,也就是对查询条件不做分词处理,精确匹配,一般用于id/数值/日期/布尔类型的查询
constant_score,以非评分模式来执行term查询,将term转化为过滤器查询
(1)、精确查找数值:
GET /my_store/products/_search
{
"query" : {
"constant_score" : {
"filter" : {
"term" : {
"price" : 20
}
}
}
}
}
(2)、精确查找文本:
由于可能之间插入的时候,文本就已经分词存储了,但是term查询的时候又是精确查找,可能就找不到对应的
分词,所以如果文本要精确查找,mapping映射就要手动设置该文本字段不分词
DELETE my_store //先删除索引
PUT /my_store //手动指定映射
{
"mappings" : {
"products" : {
"properties" : {
"productID" : {
"type" : "string",
"index" : "not_analyzed" //不分词
}
}
}
}
}
(3)、多值精确匹配
通过terms指定多组值,可以指定返回的文档数量和字段
GET /my_store/products/_search
{
"from":0, //从第一文档开始
"size":2, //查询两个文档
"_source":["address","age"], //返回的字段
"query":{
"terms":{
"price":[20,10,30]
}
}
}
3、模糊查询
通过match查询,和term查询相反,会对搜索词语进行分词
(1)、match匹配(普通分词匹配)
GET /my_store/products/_search
{
"query" : {
"match" : {
"productID" : "XHDK-A-1293-#fJ3"
}
}
}
(2)、match_all查询所有 (普通分词匹配,无匹配条件,查询所有)
GET /my_store/products/_search
{
"query": {
"match_all": {
}
}
}
(3)、match_phrase(分词短语匹配)
短语匹配,对query条件里面的短语看成是一个整体,进行匹配,文档里面包含这个词项列表,
并且词项之间的顺序都是一样,也没有其它字符的间隔,就可以返回。
也可以使用slop这个关键字指定相隔的步长,也就是词项之间可以隔开的间隙,这样匹配规则就宽松一些。
GET /lib/user/_search
{
"query": {
"match_phrase": {
"address": "huibei,wuhan"
}
}
}
4、match 的细节和本质
(1)、match本质上是一种bool类型的查询,有一个默认隐藏的参数operator,
默认的值是OR,例如以下例子,本质上就是搜索满足hobbies字段匹配football 或者basketball的文档
operator还可以显式的设置为and
GET matchtest/