开始搜索
当您已经将一些数据导入并在Elasticsearch中建立索引后,就可以通过发送请求到_search节点完成搜索。要使用搜索套件的全部功能,您可以使用Elasticsearch Query DSL来指定搜索的过滤条件在请求体中。 您可以在请求URI中指定要搜索的索引分片名。
比如,以下请求能攻从bank索引分片中获取所有文档并按照account_number进行排序:
GET /bank/_search
{
"query": { "match_all": {} },
"sort": [
{ "account_number": "asc" }
]
}
默认情况下, 响应报文中的hits节点只展示前10分符合搜索过滤条件的文档:
{
"took" : 20,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1000,
"relation" : "eq"
},
"max_score" : null,
"hits" : [
{
"_index" : "bank",
"_type" : "_doc",
"_id" : "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"
},
"sort" : [
0
]
},...
}
]
}
}
响应报文中同时也提供了关于搜索请求的以下信息:
- took - Elasticsearch进行查询所用的时间,单位:毫秒
- 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_phase来替换match就可以实现。 比如, 下面这个搜索查询的是地址中包含mill lane这个短语的客户信息:
GET /bank/_search
{
"query": {"match_phrase": {"address": "mill lane"}}
}
您还可以通过bool查询构建组合多个查询过滤条件来完成更加复杂的查询。您可以根据必须(must match)、最好(should match)、不要(must not match)来指定过滤条件。
比如,下面这个查询请求搜索bank索引分片中哪些40岁但是不是ID(Idaho 爱达荷州)客户的账户信息 :
GET /bank/_search
{
"query": {"bool": {
"must": [
{"match": { "age": "40"}}
],
"must_not": [
{"match": {"state": "ID"}}
]
}}
}
每个must、should、must_not元素都称为布尔查询中的一个查询子句。文档符合筛选条件中的must、should子句的程度会对文档相关性评分产生直接影响。评分越高,那么这个文档就越符合你的查询条件。默认情况下,elasticsearch返回文档是按照相关性高低进行排序的。
在must_not子句中的过滤条件是视为一个filter过滤器。它影响的是一个文档是否在结果集中出现,但是不对文档评分产生任何影响。你可以显式的在结构化的数据中指定这个过滤条件来将某些文档包含或者排除在结果集。
譬如,下面这个请求通过使用range过滤器来限制结果集中账户的余额要在30,000(包括)之间。
GET /bank/_search
{
"query": {"bool": {
"must": [
{"match_all": {}}
],"filter": {"range": {
"balance": {
"gte": 20000,
"lte": 30000
}
}}
}}
}