ElasticSearch搜索-Request Body

前面一篇文章提到过,ES的搜索方式有2种,本篇要讲述的是POST Body 的方式。我们可以通过如下的方式,来查询my_user索引的数据:

POST /my_user/_search
{
  "profile": "true",
  "query": {
    "match_all": {} // 查询所有文档
  }
}

分页

和关系型数据库类似,查询的起始位置越靠后,其性能会下降。下面从id=2 开始取2条数据,如下所示:

POST /my_user/_search
{
  "from": 1,
  "size": 2, 
  "query": {
    "match_all": {} 
  }
}

排序

排序最好在数字型或日期型字段上进行,如my_user 的 birthday:

POST /my_user/_search
{
  "sort": [
    {
      "birthday": "desc"
    }
  ],
  "query": {
    "match_all": {}
  }
}

source 过滤

// 可以通过指定_source 的部分字段,只返回指定列
POST /my_user/_search
{
  "_source": ["name","birthday"], 
  "query": {
    "match_all": {}
  }
}

脚本字段

脚本字段可以计算出新的字段,如跨境电商中的,不同汇率金额,换算成统一的标准,然后排序。

// 下面仅展示字符拼接
POST /my_user/_search
{
  "script_fields": {
    "full_username": {
      "script": {
        "lang": "painless",
        "source": "doc['birthday'].value+'Moguhu'"
      }
    }
  }, 
  "query": {
    "match_all": {}
  }
}

Match 查询

// 查询 age=26 的用户
POST /my_user/_search
{
  "query": {
    "match": {
      "age": 26
    }
  }
}
// 查询name 包含 ma 和 jack 的用户
POST /my_user/_search
{
  "query": {
    "match": {
      "name": {
        "query": "ma jack",
        "operator": "AND"
      }
    }
  }
}

Match Phase 查询

// jacky 和 pudong 之间可以有1个其他词
POST /my_user/_search
{
  "query": {
    "match_phrase": {
      "username": {
        "query": "jacky pudong",
        "slop": 1
      }
    }
  }
}

搜索结果如下:

{
  "took" : 974,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 0.87818426,
    "hits" : [
      {
        "_index" : "my_user",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : 0.87818426,
        "_source" : {
          "name" : "Jack Xue",
          "age" : 35,
          "birthday" : "1975/12/03",
          "username" : "Jacky Shanghai Pudong"
        }
      }
    ]
  }
}


参考:《ElasticSearch技术解析与实战》、《极客时间:ElasticSearch核心技术与实战》