1. 空搜索
最基本的搜索API表单是空搜索(empty search),它没有指定任何的查询条件,只返回集群索引中的所有文档:
2. 响应内容
上面的响应内容(为了编辑简洁)类似于这样:
2.1 hits
响应中最重要的部分是 hits ,它包含了 total 字段来表示匹配到的文档总数, hits 数组还包含了匹配到的前10条数据。
hits 数组中的每个结果都包含 _index 、 _type 和文档的 _id 字段。
每个节点都有一个_score 字段,这是相关性得分(relevance score),它衡量了文档与查询的匹配程度。默认的,返回的结 果中关联性最大的文档排在首位;这意味着,它是按照 _score 降序排列的
空搜索的情况下,我们没有指定任何查询,所以所有 文档的相关性是一样的,因此所有结果的 _score 都是取得一个中间值 1
max_score 指的是所有文档匹配查询中 _score 的最大值。
2.2 took
took 告诉我们整个搜索请求花费的毫秒数。
2.3 shards
_shards 节点告诉我们参与查询的分片数( total 字段),有多少是成功的( successful 字段),有多少的是失败的 ( failed 字段)
如果我们遭受一些重大的故障导致主分片和复制分片都 故障,那这个分片的数据将无法响应给搜索请求。这种情况下,Elasticsearch将报告分片 failed ,但仍将继续返回剩余分片上的结果。
2.4 timeout
time_out 值告诉我们查询超时与否。
如果响应速度比完整的结果更重要,你可以定 义 timeout 参数为 10 或者 10ms (10毫秒),或者 1s (1秒)
Elasticsearch将返回在请求超时前收集到的结果。
3. 多索引和多类别
你可能想搜索一个或几个自定的索引或类型,我们能通过定义URL中的索引或类型达到这个目的
/_search
在所有索引的所有类型中搜索
/gb/_search
在索引 gb 的所有类型中搜索
/gb,us/_search
在索引 gb 和 us 的所有类型中搜索
/g*,u*/_search
在以 g 或 u 开头的索引的所有类型中搜索
/gb/user/_search
在索引 gb 的类型 user 中搜索
/gb,us/user,tweet/_search
在索引 gb 和 us 的类型为 user 和 tweet 中搜索
/_all/user,tweet/_search
在所有索引的 user 和 tweet 中搜索 search types user and tweet in all indices
4. 分页
和SQL使用 LIMIT 关键字返回只有一页的结果一样,Elasticsearch接受 from 和 size 参数:
size : 果数,默认 10
from : 跳过开始的结果数,默认 0
例:如果你想每页显示5个结果,页码从1到3,那请求如下
应该当心分页太深或者一次请求太多的结果。结果在返回前会被排序。但是记住一个搜索请求常常涉及多个分片。每个分片 生成自己排好序的结果,它们接着需要集中起来排序以确保整体排序正确。
5. 简易搜索
search API有两种表单:
- 一种是“简易版”的查询字符串(query string)将所有参数通过查询字符串定义,
- 另一种版本使用 JSON完整的表示请求体(request body),这种富搜索语言叫做结构化查询语句(DSL)
查询字符串搜索对于在命令行下运行点对点(ad hoc)查询特别有用。
例:
查询所有类型为 tweet 并在 tweet 字段中 包含 elasticsearch 字符的文档:
查找 name 字段中包含 “john” 和 tweet 字段包含 “mary” 的结果。实际的查询只需要:
但是url编码 需要将查询字符串参数变得更加神秘:
“+” 前缀表示语句匹配条件必须被满足。类似的 “-” 前缀表示条件必须不被满足。所有条件如果没有 + 或 - 表示是可选的 ——匹配越多,相关的文档就越多。
6. _all 字段
返回包含 “mary” 字符的所有文档的简单搜索:
6.1 _all field
编码后的查询字符串