将一些数据塞到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不会在请求中维护任何状态信息。 要翻阅搜索结果,需要在请求中指定from
和size
参数。
例如,下面这个请求指定了搜索第10到19个:
GET /bank/_search
{
"query": { "match_all": {} },
"sort": [
{ "account_number": "asc" }
],
"from": 10,
"size": 10
}
你应该已经会使用基本的搜索请求,现在可以开始构造比match_all
更有趣的请求了。
要在字段中搜索特定关键词,可以使用match
语句。 例如,以下请求可以搜索address
字段包含 mill
或lane
关键词的客户:
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" } }
]
}
}
}
布尔查询中的每个must
,should
和must_not
元素都称为查询子句。 文档对每个must
或should
子句中条件的匹配程度有助于提高文档的相关性得分。 分数越高,文档就越符合搜索条件。 默认情况下,Elasticsearch返回按这些相关性得分排序的文档。
must_not
子句中的条件被视为过滤器。 它决定文档是否包括在结果中,但不会影响文档的得分。 你还可以显式指定任意的过滤器,以基于结构化数据指定包含或排除文档。
例如,以下请求使用区间过滤器将结果限制为余额在2w刀到3w刀(含)的账户。
GET /bank/_search
{
"query": {
"bool": {
"must": { "match_all": {} },
"filter": {
"range": {
"balance": {
"gte": 20000,
"lte": 30000
}
}
}
}
}
}