【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)

 

posted @ 2017-06-04 14:31  匡子语  阅读(307)  评论(0编辑  收藏  举报