-
Introduction
- 入门
- 分布式集群
- 数据
- 分布式增删改查
- 搜索
- 映射和分析
- 结构化查询
- 排序
- 分布式搜索
- 索引管理
- 深入分片
- 结构化搜索
- 全文搜索
- 多字段搜索
- 模糊匹配
- Partial_Matching
- Relevance
- Language intro
- Identifying words
- Token normalization
- Stemming
- Stopwords
- Synonyms
- Fuzzy matching
-
Aggregations
-
overview
-
circuit breaker fd settings
-
filtering
-
facets
-
docvalues
-
eager
-
breadth vs depth
-
Conclusion
-
concepts buckets
-
basic example
-
add metric
-
nested bucket
-
extra metrics
-
bucket metric list
-
histogram
-
date histogram
-
scope
-
filtering
-
sorting ordering
-
approx intro
-
cardinality
-
percentiles
-
sigterms intro
-
sigterms
-
fielddata
-
analyzed vs not
-
overview
- 地理坐标点
- Geohashe
- 地理位置聚合
- 地理形状
- 关系
- 嵌套
- Parent Child
- Scaling
- Cluster Admin
- Deployment
- Post Deployment
搜索选项
一些查询字符串(query-string)可选参数能够影响搜索过程。
preference(偏爱)
preference
参数允许你控制使用哪个分片或节点来处理搜索请求。她接受如下一些参数 _primary
, _primary_first
, _local
, _only_node:xyz
, _prefer_node:xyz
和_shards:2,3
。这些参数在文档搜索偏好(search preference)里有详细描述。
然而通常最有用的值是一些随机字符串,它们可以避免结果震荡问题(the bouncing results problem)。
结果震荡(Bouncing Results)
想像一下,你正在按照
timestamp
字段来对你的结果排序,并且有两个document有相同的timestamp。由于搜索请求是在所有有效的分片副本间轮询的,这两个document可能在原始分片里是一种顺序,在副本分片里是另一种顺序。这就是被称为_结果震荡(bouncing results)_的问题:用户每次刷新页面,结果顺序会发生变化。避免这个问题方法是对于同一个用户总是使用同一个分片。方法就是使用一个随机字符串例如用户的会话ID(session ID)来设置
preference
参数。
timeout(超时)
通常,协调节点会等待接收所有分片的回答。如果有一个节点遇到问题,它会拖慢整个搜索请求。
timeout
参数告诉协调节点最多等待多久,就可以放弃等待而将已有结果返回。返回部分结果总比什么都没有好。
搜索请求的返回将会指出这个搜索是否超时,以及有多少分片成功答复了:
...
"timed_out": true, (1)
"_shards": {
"total": 5,
"successful": 4,
"failed": 1 (2)
},
...
copy
(1) 搜索请求超时。
(2) 五个分片中有一个没在超时时间内答复。
如果一个分片的所有副本都因为其他原因失败了——也许是因为硬件故障——这个也同样会反映在该答复的_shards
部分里。
routing(路由选择)
在路由值那节里,我们解释了如何在建立索引时提供一个自定义的routing
参数来保证所有相关的document(如属于单个用户的document)被存放在一个单独的分片中。在搜索时,你可以指定一个或多个routing
值来限制只搜索那些分片而不是搜索index里的全部分片:
GET /_search?routing=user_1,user2
copy
这个技术在设计非常大的搜索系统时就会派上用场了。我们在规模(scale)那一章里详细讨论它。
search_type(搜索类型)
虽然query_then_fetch
是默认的搜索类型,但也可以根据特定目的指定其它的搜索类型,例如:
GET /_search?search_type=count
copy
count(计数)
count(计数)
搜索类型只有一个query(查询)
的阶段。当不需要搜索结果只需要知道满足查询的document的数量时,可以使用这个查询类型。
query_and_fetch(查询并且取回)
query_and_fetch(查询并且取回)
搜索类型将查询和取回阶段合并成一个步骤。这是一个内部优化选项,当搜索请求的目标只是一个分片时可以使用,例如指定了routing(路由选择)
值时。虽然你可以手动选择使用这个搜索类型,但是这么做基本上不会有什么效果。
dfs_query_then_fetch___ 和 ___dfs_query_and_fetch
dfs
搜索类型有一个预查询的阶段,它会从全部相关的分片里取回项目频数来计算全局的项目频数。我们将在relevance-is-broken(相关性被破坏)里进一步讨论这个。
scan(扫描)
scan(扫描)
搜索类型是和scroll(滚屏)
API连在一起使用的,可以高效地取回巨大数量的结果。它是通过禁用排序来实现的。我们将在下一节_scan-and-scroll(扫描和滚屏)_里讨论它。