请注意:
本书基于 Elasticsearch 2.x 版本,有些内容可能已经过时。
本书基于 Elasticsearch 2.x 版本,有些内容可能已经过时。
搜索选项
edit搜索选项
edit有几个 查询参数可以影响搜索过程。
偏好
edit偏好这个参数 preference
允许 用来控制由哪些分片或节点来处理搜索请求。 它接受像 _primary
,
_primary_first
, _local
, _only_node:xyz
, _prefer_node:xyz
, 和
_shards:2,3
这样的值, 这些值在
search preference
文档页面被详细解释。
但是最有用的值是某些随机字符串,它可以避免 bouncing results 问题。
超时问题
edit通常分片处理完它所有的数据后再把结果返回给协同节点,协同节点把收到的所有结果合并为最终结果。
这意味着花费的时间是最慢分片的处理时间加结果合并的时间。如果有一个节点有问题,就会导致所有的响应缓慢。
参数 timeout
告诉 分片允许处理数据的最大时间。如果没有足够的时间处理所有数据,这个分片的结果可以是部分的,甚至是空数据。
搜索的返回结果会用属性 timed_out
标明分片是否返回的是部分结果:
超时仍然是一个最有效的操作,知道这一点很重要; 很可能查询会超过设定的超时时间。这种行为有两个原因:
- 超时检查是基于每文档做的。 但是某些查询类型有大量的工作在文档评估之前需要完成。 这种 "setup" 阶段并不考虑超时设置,所以太长的建立时间会导致超过超时时间的整体延迟。
- 因为时间检查是基于每个文档的,一次长时间查询在单个文档上执行并且在下个文档被评估之前不会超时。 这也意味着差的脚本(比如带无限循环的脚本)将会永远执行下去。
路由
edit在 路由一个文档到一个分片中 中, 我们解释过如何定制参数 routing
,它能够在索引时提供来确保相关的文档,比如属于某个用户的文档被存储在某个分片上。
在搜索的时候,不用搜索索引的所有分片,而是通过指定几个 routing
值来限定只搜索几个相关的分片:
GET /_search?routing=user_1,user2
这个技术在设计大规模搜索系统时就会派上用场,我们在 扩容设计 中详细讨论它。