|
| 1 | +##搜索选项 |
| 2 | + |
| 3 | +一些查询字符串(query-string)可选参数能够影响搜索过程。 |
| 4 | + |
| 5 | +####preference(偏爱) |
| 6 | + |
| 7 | +`preference`参数允许你控制使用哪个分片或节点来处理搜索请求。她接受如下一些参数 `_primary`, `_primary_first`, `_local`, `_only_node:xyz`, `_prefer_node:xyz`和`_shards:2,3`。这些参数在文档[搜索偏好(search preference)](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-request-preference.html)里有详细描述。 |
| 8 | + |
| 9 | +然而通常最有用的值是一些随机字符串,它们可以避免结果震荡问题(the _bouncing results_ problem)。 |
| 10 | + |
| 11 | +#####结果震荡(Bouncing Results) |
| 12 | + |
| 13 | +* 想像一下,你正在按照`timestamp`字段来对你的结果排序,并且有两个document有相同的timestamp。由于搜索请求是在所有有效的分片副本间轮询的,这两个document可能在原始分片里是一种顺序,在副本分片里是另一种顺序。 |
| 14 | + |
| 15 | +* 这就是被称为_结果震荡(bouncing results)_的问题:用户每次刷新页面,结果顺序会发生变化。避免这个问题方法是对于同一个用户总是使用同一个分片。方法就是使用一个随机字符串例如用户的会话ID(session ID)来设置`preference`参数。 |
| 16 | + |
| 17 | +###timeout(超时) |
| 18 | +通常,协调节点会等待接收所有分片的回答。如果有一个节点遇到问题,它会拖慢整个搜索请求。 |
| 19 | + |
| 20 | +`timeout`参数告诉协调节点最多等待多久,就可以放弃等待而将已有结果返回。返回部分结果总比什么都没有好。 |
| 21 | + |
| 22 | + |
| 23 | +搜索请求的返回将会指出这个搜索是否超时,以及有多少分片成功答复了: |
| 24 | + |
| 25 | +``` js |
| 26 | + ... |
| 27 | + "timed_out": true, (1) |
| 28 | + "_shards": { |
| 29 | + "total": 5, |
| 30 | + "successful": 4, |
| 31 | + "failed": 1 (2) |
| 32 | + }, |
| 33 | + ... |
| 34 | +``` |
| 35 | +-------------------------------------------------- |
| 36 | +(1) 搜索请求超时。 |
| 37 | + |
| 38 | +(2) 五个分片中有一个没在超时时间内答复。 |
| 39 | + |
| 40 | +如果一个分片的所有副本都因为其他原因失败了——也许是因为硬件故障——这个也同样会反映在该答复的`_shards`部分里。 |
| 41 | + |
| 42 | +### routing(路由选择) |
| 43 | +在路由值那节里,我们解释了如何在建立索引时提供一个自定义的`routing`参数来保证所有相关的document(如属于单个用户的document)被存放在一个单独的分片中。在搜索时,你可以指定一个或多个`routing` 值来限制只搜索那些分片而不是搜索index里的全部分片: |
| 44 | + |
| 45 | +``` js |
| 46 | +GET /_search?routing=user_1,user2 |
| 47 | +``` |
| 48 | +这个技术在设计非常大的搜索系统时就会派上用场了。我们在规模(scale)那一章里详细讨论它。 |
| 49 | +
|
| 50 | +### search_type(搜索类型) |
| 51 | +虽然`query_then_fetch`是默认的搜索类型,但也可以根据特定目的指定其它的搜索类型,例如: |
| 52 | +
|
| 53 | +``` js |
| 54 | +GET /_search?search_type=count |
| 55 | +``` |
| 56 | +
|
| 57 | +___count(计数)___ |
| 58 | +
|
| 59 | +`count(计数)`搜索类型只有一个`query(查询)`的阶段。当不需要搜索结果只需要知道满足查询的document的数量时,可以使用这个查询类型。 |
| 60 | +
|
| 61 | +
|
| 62 | +___query_and_fetch(查询并且取回)___ |
| 63 | +
|
| 64 | +`query_and_fetch(查询并且取回)`搜索类型将查询和取回阶段合并成一个步骤。这是一个内部优化选项,当搜索请求的目标只是一个分片时可以使用,例如指定了`routing(路由选择)`值时。虽然你可以手动选择使用这个搜索类型,但是这么做基本上不会有什么效果。 |
| 65 | +
|
| 66 | +
|
| 67 | +___dfs_query_then_fetch___ 和 ___dfs_query_and_fetch___ |
| 68 | +
|
| 69 | +`dfs`搜索类型有一个预查询的阶段,它会从全部相关的分片里取回项目频数来计算全局的项目频数。我们将在relevance-is-broken(相关性被破坏)里进一步讨论这个。 |
| 70 | +
|
| 71 | +
|
| 72 | +___scan(扫描)___ |
| 73 | +
|
| 74 | +`scan(扫描)`搜索类型是和`scroll(滚动)`API连在一起使用,使得可以高效地取回巨大数量的结果。它是通过禁用排序来实现的。我们将在下一节_scan-and-scroll(扫描和滚动)_里讨论它。 |
| 75 | +
|
| 76 | +
|
| 77 | +
|
| 78 | +<!-- |
1 | 79 | === Search Options
|
2 | 80 |
|
3 | 81 | A few ((("search options")))optional query-string parameters can influence the search process.
|
@@ -119,3 +197,5 @@ sorting. We discuss _scan-and-scroll_ in the next section.
|
119 | 197 |
|
120 | 198 |
|
121 | 199 |
|
| 200 | +
|
| 201 | +--> |
0 commit comments