【ES】学习2-搜索
1.空搜索
返回所有索引下的所有文档
GET /_search
设置超时。timeout
不是停止执行查询,它仅仅是告知正在协调的节点返回到目前为止收集的结果并且关闭连接。在后台,其他的分片可能仍在执行查询即使是结果已经被发送了。
GET /_search?timeout=10ms
2.多索引,多类型
/_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
类型
3.分页
在不指定数量时只会返回前10个文档。可以用size, from参数指定显示的文档数量
size
显示应该返回的结果数量,默认是 10
from
显示应该跳过的初始结果数量,默认是 0
GET /_search?size=5 GET /_search?size=5&from=5 GET /_search?size=5&from=10
深度分页问题:
理解为什么深度分页是有问题的,我们可以假设在一个有 5 个主分片的索引中搜索。 当我们请求结果的第一页(结果从 1 到 10 ),每一个分片产生前 10 的结果,并且返回给 协调节点 ,协调节点对 50 个结果排序得到全部结果的前 10 个。
现在假设我们请求第 1000 页--结果从 10001 到 10010 。所有都以相同的方式工作除了每个分片不得不产生前10010个结果以外。 然后协调节点对全部 50050 个结果排序最后丢弃掉这些结果中的 50040 个结果。
可以看到,在分布式系统中,对结果排序的成本随分页的深度成指数上升。这就是 web 搜索引擎对任何查询都不要返回超过 1000 个结果的原因。
4.轻量搜索
查询在 tweet
类型中 tweet
字段包含 elasticsearch
单词的所有文档
GET /_all/tweet/_search?q=tweet:elasticsearch
查询在 name
字段中包含 john
并且在 tweet
字段中包含 mary
的文档。
+name:john +tweet:mary
GET /_search?q=%2Bname%3Ajohn+%2Btweet%3Amary
+
前缀表示必须与查询条件匹配。类似地, -
前缀表示一定不与查询条件匹配。没有+
或者 -
的所有其他条件都是可选的
下面的查询针对tweents类型,并使用以下的条件:
name
字段中包含mary
或者john
date
值大于2014-09-10
_all_
字段包含aggregations
或者geo
+name:(mary john) +date:>2014-09-10 +(aggregations geo) ?q=%2Bname%3A(mary+john)+%2Bdate%3A%3E2014-09-10+%2B(aggregations+geo)