ElasticSearch全文搜索引擎之查询API篇

目录

一、简介

二、ES查询API及其使用方法

三、总结


一、简介

前面一篇文章我们已经介绍了关于Elasticsearch提供的Restful接口API,并通过详细的示例说明了简单的创建索引、插入文档数据、修改文档、删除文档等操作,本篇文章主要总结es查询相关的一些API。

二、ES查询API及其使用方法

  • (一)、 简单查询

【a】首先往es中创建索引user,类型info,并插入了三条数据,相关命令如下:

PUT /user/info/1
{
  "name": "张三",
  "age": 20,
  "desc": "美人",
  "tag": ["交友","旅游","渣男"]
}

PUT /user/info/2
{
  "name": "李四",
  "age": 30,
  "desc": "丑人",
  "tag": ["读书","旅游","暖男"]
}

PUT /user/info/3
{
  "name": "王五",
  "age": 40,
  "desc": "美人",
  "tag": ["打篮球","跑步"]
}

插入完成后,在es-head插件中查看索引数据,可以看到数据成功被插入。 

最简单的搜索命令如下:

GET /user/info/1

上述命令用于获取一条数据,如下图所示:

下面来看一个带简单条件的查询: 查询姓名name为"张三"的数据。

GET /user/info/_search?q=name:张三

 查询结果如下图所示:

  • (二)、复杂查询

【a】查询所有数据

在es中,通过match_all来查询出所有数据出来,我们来看一个示例:

查询user索引里面的所有数据,相关命令如下:

GET /user/info/_search
{
  "query": {
    "match_all": {}
  }
}

  • query:定义个查询;
  • match_all:运行简单类型查询指定索引中的所有文档;

如果只想返回前n条件数据,那么使用size指定即可,如只想返回两条数据回来,可以通过下面的命令实现:

GET /user/info/_search
{
  "query": {
    "match_all": {}
  },
  "size": 2
}

 如果不指定size,默认是返回10条文档信息。

【b】查询姓名name中带有"张三"的数据

GET /user/info/_search
{
  "query": {
    "match": {
      "name": "张三"
    }
  }
}

查询结果如下图:

【c】查询姓名匹配"张三"并且年龄是20岁的数据

在es中,通过关键字must来表示"且"的关系,相当于我们关系型数据库中的"and"。

select  * from xxx where name = '张三'  and age = 20

我们通过构建一个bool(布尔值)查询来实现如上查询。

布尔查询可以接受一个must参数(等价于AND),一个must_not参数(等价于NOT),以及一个should参数(等价于OR)。

相关命令如下:

GET /user/info/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "张三"
          }
        },
        {
          "match": {
            "age": "20"
          }
        }
      ]
    }
  }
}

must其实就相当于sql里面的and查询,所有条件都必须满足,满足条件才返回结果。

当然es肯定还有类似数据库or查询,那就是should,我们来看一个should的例子。

【d】查询姓名匹配"李四"或者年龄是40岁的数据

前面我们使用must实现了且查询,这里我们使用should实现或查询。

select * from xxx where name = '李四' or age = 40

GET /user/info/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "name": "李四"
          }
        },
        {
          "match": {
            "age": "40"
          }
        }
      ]
    }
  }
}

查询结果如下: 

可以看到,成功查询出两条数据,should其实就是多个条件满足其一即可返回数据

【e】查询年龄不是20岁的数据

select * from xxx where age != 20

GET /user/info/_search
{
  "query": {
    "bool": {
      "must_not": [
        {
          "match": {
            "age": "20"
          }
        }
      ]
    }
  }
}

查询结果如下:

【f】查询姓名匹配"张三"并且年龄大于20岁的信息

select * from xxx where name = '张三' and age > 20

GET /user/info/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "张三"
          }
        }
      ],
      "filter": {
        "range": {
          "age": {
            "gt": 10
          }
        }
      }
    }
  }
}

在es中,范围查询使用的是filter过滤结合range范围查询,并且有四种关系运算符,如下所示: 

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

【g】查询标签包含"男"或者"交友"的数据

select * from xxx where tags like "%男%" or tags like "%交友%"

GET /user/info/_search
{
  "query": {
    "match": {
      "tag": "男 交友"
    }
  }
}

 

 注意:同一个字段的多个值查询条件使用空格隔开即可。

【h】精确查询

  • term:代表完全匹配,也就是精确查询,搜索前不会再对搜索词进行分词拆解。
  • match :会使用分词器进行解析,即先分析文档,然后根据解析出来的文档进行查询。

查询姓名中带有"张"的数据:

GET /user/info/_search
{
  "query": {
    "term": {
      "name": "张"
    }
  }
}

【i】结果过滤

何为结果的过滤,即只返回特定的字段回来,不返回所有字段。在es中,通过_source指定需要返回的字段。

select name,age from xxx

GET /user/info/_search
{
  "query": {
    "match": {
      "name": "张三"
    }
  },
  "_source": [
    "name",
    "age"
  ]
}

【j】结果排序

对查询出来的结果进行排序,在es中,通过sort指定字段的排序方式是升序asc还是降序desc。

select * from xxx order by age desc

GET /user/info/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "age": {
        "order": "desc"
      }
    }
  ]
}

 【k】分页查询

select * from xxx limit 0,10

GET /user/info/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "age": {
        "order": "desc"
      }
    }
  ],
  "from": 0,
  "size": 2
}

  • from:指定文档索引从哪里开始,默认从0开始; 
  • size:从from开始,返回多个文档 ;

【l】高亮显示查询

何为高亮?我们打开京东网站,搜索关键字"笔记本电脑":

可以看到,"笔记本电脑"被拆分为很多个词,然后搜索之后,只要匹配到就会高亮显示出来。在es中,使用highlight实现高亮显示,下面看一个示例:

搜索名字匹配"张三",并且name字段高亮显示。

GET /user/info/_search
{
  "query": {
    "match": {
      "name": "张三"
    }
  },
  "highlight": {
    "fields": {
      "name": {}
    }
  }
}

搜索相关的结果可以高亮显示,可以看到,默认拼接的标签是<em>xxx</em>,当然es也允许我们自己指定自定义标签,自定义样式style、样式class等等。

GET /user/info/_search
{
  "query": {
    "match": {
      "name": "张三"
    }
  },
  "highlight": {
    "fields": {
      "name": {}
    },
    "pre_tags": "<b>",
    "post_tags": "</b>"
  }
}

【m】查询姓名/标签/描述中带有关键字"华"的数据,并按照年龄倒序排序

首先插入几条测试数据:

PUT /user/info/4
{
  "name": "刘德华",
  "age": 50,
  "desc": "刘德华",
  "tag": [
    "刘德华"
  ]
}

PUT /user/info/5
{
  "name": "吕德华",
  "age": 80,
  "desc": "吕德华",
  "tag": [
    "吕德华"
  ]
}

GET /user/info/_search
{
  "query": {
    "bool": {
      "must": {
        "multi_match": {
          "query": "华",
          "fields": [
            "name",
            "desc",
            "tag"
          ],
          "type": "phrase"
        }
      }
    }
  },
  "sort": [
    {
      "age": {
        "order": "desc"
      }
    }
  ]
}

注意,multi_match查询是种分词查询,带有关键字"华" 是指分词后带有"华",所有"i live 华"可以匹配到,但是"ilove华"是匹配不到的。

三、总结

本篇文章主要总结了关于es中查询相关的一些API,并且结合示例讲解,当然es还提供了很多查询命令,感兴趣的小伙伴可以到官网学习查看。由于笔者水平有限,如文中有不对之处,还望指正,相互学习,一起进步!

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页
实付 19.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值