ES上手:开始搜索

将一些数据塞到Elasticsearch索引后,你就可以通过将请求发送到_search端点来进行搜索。要获得全套搜索功能,你可以使用Elasticsearch Query DSL在请求体中指定搜索条件,在请求URI中指定索引名称。

比如,下面这个请求查询bank索引中的所有文档并按账号排序:

GET /bank/_search
{
  "query": { "match_all": {} },
  "sort": [
    { "account_number": "asc" }
  ]
}

默认地,返回值中的hits字段包含了搜索条件命中的前10个文档:

{
  "took" : 63,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
        "value": 1000,
        "relation": "eq"
    },
    "max_score" : null,
    "hits" : [ {
      "_index" : "bank",
      "_type" : "_doc",
      "_id" : "0",
      "sort": [0],
      "_score" : null,
      "_source" : {"account_number":0,"balance":16623,"firstname":"Bradshaw","lastname":"Mckenzie","age":29,"gender":"F","address":"244 Columbus Place","employer":"Euron","email":"bradshawmckenzie@euron.com","city":"Hobucken","state":"CO"}
    }, {
      "_index" : "bank",
      "_type" : "_doc",
      "_id" : "1",
      "sort": [1],
      "_score" : null,
      "_source" : {"account_number":1,"balance":39225,"firstname":"Amber","lastname":"Duke","age":32,"gender":"M","address":"880 Holmes Lane","employer":"Pyrami","email":"amberduke@pyrami.com","city":"Brogan","state":"IL"}
    }, ...
    ]
  }
}

返回值也提供了以下关于请求的信息:

  • took - ES执行搜索用了多少毫秒
  • time_out - 搜索是否超时
  • _shards - 搜索了多少个分片,以及成功、失败或跳过了多少个分片
  • max_score - 搜索结果中相关度最高的文档的分数
  • hits.total.value - 搜索匹配到的文档总数
  • hits.sort - 文档在搜索结果中的排序序号(当不按相关性得分排序的时候)
  • hits. _score - 文档的相关性得分(使用match_all时不适用)

每个搜索请求都是独立的:Elasticsearch不会在请求中维护任何状态信息。 要翻阅搜索结果,需要在请求中指定fromsize参数。

例如,下面这个请求指定了搜索第10到19个:

GET /bank/_search
{
  "query": { "match_all": {} },
  "sort": [
    { "account_number": "asc" }
  ],
  "from": 10,
  "size": 10
}

你应该已经会使用基本的搜索请求,现在可以开始构造比match_all更有趣的请求了。

要在字段中搜索特定关键词,可以使用match语句。 例如,以下请求可以搜索address字段包含 milllane关键词的客户:

GET /bank/_search
{
  "query": { "match": { "address": "mill lane" } }
}

要搜索短语而不是单个关键词,需使用match_phrase而不是match。 例如,以下请求仅匹配包含短语 mill lane的地址:

GET /bank/_search
{
  "query": { "match_phrase": { "address": "mill lane" } }
}

要构造更复杂的查询,可以使用bool布尔查询来组合多个查询条件。 您可以指定以下搜索条件:必须有(必须匹配),可以有(可能匹配)或必没有(必须不匹配)。

例如,以下请求查询bank索引,找到年纪为40岁、不住在爱达荷州(ID)的客户账号:

GET /bank/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "age": "40" } }
      ],
      "must_not": [
        { "match": { "state": "ID" } }
      ]
    }
  }
}

布尔查询中的每个mustshouldmust_not元素都称为查询子句。 文档对每个mustshould子句中条件的匹配程度有助于提高文档的相关性得分。 分数越高,文档就越符合搜索条件。 默认情况下,Elasticsearch返回按这些相关性得分排序的文档。

must_not子句中的条件被视为过滤器。 它决定文档是否包括在结果中,但不会影响文档的得分。 你还可以显式指定任意的过滤器,以基于结构化数据指定包含或排除文档。

例如,以下请求使用区间过滤器将结果限制为余额在2w刀到3w刀(含)的账户。

GET /bank/_search
{
  "query": {
    "bool": {
      "must": { "match_all": {} },
      "filter": {
        "range": {
          "balance": {
            "gte": 20000,
            "lte": 30000
          }
        }
      }
    }
  }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。