Elasticsearch学习笔记(五):ElasticSearch的搜索操作

111 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第21天,点击查看活动详情

导语

Elasticsearch 是一个分布式的开源搜索和分析引擎,目前被广泛使用,本文记录几种ES常用的搜索方式。

ES搜索

Query string search

以URL参数的形式提供搜索设置:

GET  /company/_search? 搜索参数

例如:查看所有文档

GET /company/_search

查看爱好中包含sing的员工并将其按年龄升序排列

GET /company/_search?q=hobby:sing&sort=age:asc

执行结果如下图所示

image.png

query DSL

第二种搜索方式叫做query DSL:Domain Specified Language,特定领域的语言,我们将请求的参数放在request body:请求体中,可以用json的格式来构建查询语法,比较方便,可以构建各种复杂的语法,比query string search强大许多。

比如查询全部文档的命令,

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

再比如,查看爱好中包含sing的员工并将其按年龄升序排列。相比于query string search,这种方式可读性高,功能也很强大,因而最为常用。

# 查看爱好中包含sing的员工并将其按年龄升序排列
GET /company/_search
{
  "query": {
    "match": {
      "hobby": "sing"
    }
  }
  , "sort": [
    {
      "age": {
        "order": "asc"
      }
    }
  ]
}

query filter

query filter,是说我们可以在请求中加入过滤项,通过一些布尔逻辑来过滤掉那些我们不想要的文档项。比如下面的例子,就是找出索引的爱好中有sing而且只保留年龄在18到25岁之前的员工就是这样的命令。需要在query中加入bool语句。

GET /company/_search
{
  "query": {
    "bool": {
      "must": [{
          "match": {
            "hobby": "sing"}
        }],
      "filter": {
        "range": {
          "age": {
            "gte": 18,
            "lte": 25
          }
        }
      }
}}}

full-text search

然后是全文检索这个概念。

全文检索是指对文档执行全文检索,包括单个或多个单词或词组查询,返回匹配条件的搜索结果全文检索会将输入的搜索串拆解开来,去倒排索引里面去一一匹配,只要能匹配上任意一个拆解后的单词,就可以作为结果返回。

假设我们的四个文档为:

Doc1:"rap"
Doc2:"football basketball sing"
Doc3:"basketball tennis sing"
Doc4:"dance sing rap"

使用查询语句如下:

GET /company/_search
{
  "query": {
    "match": {
      "hobby": "sing football"
    }
  }
}

其执行结果如下图所示:

image.png

全文检索返回的结果中会有一个打分情况,结果也是按照分数由高到低展示的,更多打分的细节可以参考下图(www.jianshu.com/p/bd7a09cef…

image.png

phrase search

然后是短语搜索,这个是要求要求输入的搜索串,必须在指定的字段文本中,完全包含一模一样的,也就是说必须是它的一个子串,才可以算匹配而作为结果返回。

GET /company/_search
{
  "query": {
    "match_phrase": {
      "hobby": "sing rap"
    }
  }
}

上面的例子只会精准匹配爱好为sing rap的文档作为返回结果,并不会对其进行任何分词。其执行结果如下图所示:

image.png

highlight search

最后是高亮搜索,这是一种非常常见的搜索形式。比如我们打开百度,搜索牙膏,就可以看到在所有的搜索结果中,牙膏这两个字就被标红了。比如这里搜索一个sing,使用高亮搜索的方式,搜索结果中,sing被em标签包裹了起来,这是es默认的高亮搜索方式,通过一些参数设置,我们就能改变包裹在sing外面的标签,从而在网页中显示出各种各样的效果。

执行结果如下图所示:

image.png