《Elasticsearch: The Definitive Guide》读书笔记2
2015-12-11 00:00
766 查看
摘要: 《Elasticsearch: The Definitive Guide》读书笔记2
##Routing a document to a shard
shard = hash(routing) % number_of_primary_shards
通过散列函数,计算出document存储的主分片,所以主分片数不能被修改。
routing默认是_id,也可以自定义(传参routing)。
##creating,indexing,deleting a document
可选参数
replication
默认是sync,即同步写入主分片后等待写入副本分片成功后才返回。可以设成async,异步写入副本分片,不知道是否成功。不推荐async,容易因异步操作过多而使es过载(overload)。
consistency
默认主分片需要(主和副本分片中的)大多数分片正常运行(active),才能正常执行写操作,这个值称为quorum。
quorum=int((primary + number_of_replicas)/2) + 1
例如,设置副本数是1,那么至少需要2个节点,才能进行写操作。
这个参数可以设置 one(只要主分片),all(所有主副分片)或者默认的quorum。
timeout
如果副本分片不足,那么es会等待更多的副本分片出现。默认等待1分钟,这个参数可以设置等待超时时间。
##retrieving a document
接收请求的节点会轮流地(round-robin)把请求指向其他拥有目标分片的节点,来达到负载均衡。
一个可能的情况是,当一个document正在索引(indexing),它会先写到主分片,但副本分片还没有同步过去,这时把读请求转发给一个副本分片节点会返回数据不存在。
##searching
GET /_search?timeout=10ms
这里的timeout不会停止查询的执行,而是告诉分片把到timeout为止的数据返回并断开连接,虽然分片已经返回结果但是在后台分片可能仍然在处理查询。
GET /index1,index2/type1,type2/_search
深分页问题(deep paging)
"""
GET /_search?size=10&from=10000
"""
也就是搜索10条一页,返回第10001到10010条数据,这时index的每个分片都需要搜索top 10010条数据,然后合并排序再返回第10001到10010条数据,实际上另外的(number_of_primary_shards * 10010) - 10条数据都只是中间数据,只有10条数据是有效结果,所以搜索成本(cost)很大,应该尽量避免这样的查询。
_all Field
当索引一个document时,es会把所有的field的值连接起来组成一个大的字符串(big string),然后作为_all的值,当查询不指定field时,es会使用_all来查询。
##分词analysis
对一个string类型的field,es自动分词
##mapping
field types
string
number:byte,short,integer,long
float,double
boolean
date
string mapping
index
analyzed:分词、默认
not_analyzed:不分词
no:不索引
analyzer
分词器,默认standard analyzer
mapping在创建索引的时候指定
"""
PUT /index
{
"mappings":{
"type_name":{
"properties":{
"field":{
"type":"string",
"index":"not_analyzed"
}
}
}
}
}
"""
mapping中已经存在的field不能被修改,但可以新增field
"""
PUT /index/_mapping/type_name
{
"properties":{
"field_new":{
"type":"string",
"index":"not_analyzed"
}
}
}
"""
array
数组的元素的类型必须一致,es会以数组的第一个元素的类型作为这个field的类型,数组是无序的。
Empty fie
3ff0
ld
null,[],[null]
空值的field不会被索引
##Query DSL
performance
query 找到匹配的document,而且计算相关度_score,不能被cache;用于全文搜索或需要计算相关度的地方。
filter 仅仅找到匹配的document,不计算相关度没有_score,花费内存1 bit/doc,可以被cache;用于任何不需要相关度的地方。
term filter
精确匹配field
"""
{"term":{"field":"value"}}
"""
terms filter
多值精确匹配field
"""
{"terms":{"field":["value1","value2","value3"]}}
"""
range,exists,missing,bool
match
可用于全文搜索,也可用于精确搜索。
检验query
"""
GET /index/type/_validate/query?explain
{...}
"""
explain参数,可以返回错误原因。
##排序
默认按_score降序;其他field默认升序
{"sort":{"date":{"order":"desc"}}}
多值的field
mode:min,max,avg,sum
分词与不分词并存
"""
"field":{
"type":"string",
"analyzer":"english",
"fields":{
"raw":{
"type":"string",
"index":"not_analyzed"
}
}
}
"""
使用 field.raw
对分词的field排序会非常耗内存
相关度计算
TF/IDF:在一个document的field中的词频/在index的文档中出现的频率
fielddata
排序时,es加载整个index的所有document的values到内存,而不仅仅是查询到的document。
主要用于
一个field的排序
对field的聚合
固定数据集的过滤,比如geolocation filters
scripts that refer to fields
非常耗内存,尤其是具有很多不同值的field
##distributed search execution
结果跳跃(bouncing results problem)
因为主从分片同步延迟,使从主分片读和从副本分片读的结果不一样。
使用preference参数可以控制从哪个分片或者节点搜索。
timeout
指定等待分片返回结果的时间,如果超时,分片马上返回已经搜索到的结果。
routing
指定分片路由
search_type
query_then_fetch
默认
count
获取统计结果
query_and_fetch
仅用于单分片,query和fetch作为一步操作
dfs_query_then_fetch,dfs_query_and_fetch
用于计算相关度
scan
与scroll API一起使用,用于获取大量数据,禁止排序
scan,scroll
分批(batch)获取数据,直到取完所有数据,不排序因此高效。
scroll:类似mysql的浮标cursor
用法
"""
GET /index/_search?search_type=scan&scroll=1m
{
"query":{"match_all":{}},
"size":1000
}
"""
返回 _scroll_id:base-64 encoded string
"""
GET /_search/scroll?scroll=1m
_scroll_id
"""
scroll=1m 这个过期时间每次请求都会刷新,所以只要足够处理一批的数据就行。
每批数据条数是 size * number_of_primary_shards
每次请求scroll, 都会返回一个新的 _scroll_id, 下次请求需要带上。
##Routing a document to a shard
shard = hash(routing) % number_of_primary_shards
通过散列函数,计算出document存储的主分片,所以主分片数不能被修改。
routing默认是_id,也可以自定义(传参routing)。
##creating,indexing,deleting a document
可选参数
replication
默认是sync,即同步写入主分片后等待写入副本分片成功后才返回。可以设成async,异步写入副本分片,不知道是否成功。不推荐async,容易因异步操作过多而使es过载(overload)。
consistency
默认主分片需要(主和副本分片中的)大多数分片正常运行(active),才能正常执行写操作,这个值称为quorum。
quorum=int((primary + number_of_replicas)/2) + 1
例如,设置副本数是1,那么至少需要2个节点,才能进行写操作。
这个参数可以设置 one(只要主分片),all(所有主副分片)或者默认的quorum。
timeout
如果副本分片不足,那么es会等待更多的副本分片出现。默认等待1分钟,这个参数可以设置等待超时时间。
##retrieving a document
接收请求的节点会轮流地(round-robin)把请求指向其他拥有目标分片的节点,来达到负载均衡。
一个可能的情况是,当一个document正在索引(indexing),它会先写到主分片,但副本分片还没有同步过去,这时把读请求转发给一个副本分片节点会返回数据不存在。
##searching
GET /_search?timeout=10ms
这里的timeout不会停止查询的执行,而是告诉分片把到timeout为止的数据返回并断开连接,虽然分片已经返回结果但是在后台分片可能仍然在处理查询。
GET /index1,index2/type1,type2/_search
深分页问题(deep paging)
"""
GET /_search?size=10&from=10000
"""
也就是搜索10条一页,返回第10001到10010条数据,这时index的每个分片都需要搜索top 10010条数据,然后合并排序再返回第10001到10010条数据,实际上另外的(number_of_primary_shards * 10010) - 10条数据都只是中间数据,只有10条数据是有效结果,所以搜索成本(cost)很大,应该尽量避免这样的查询。
_all Field
当索引一个document时,es会把所有的field的值连接起来组成一个大的字符串(big string),然后作为_all的值,当查询不指定field时,es会使用_all来查询。
##分词analysis
对一个string类型的field,es自动分词
##mapping
field types
string
number:byte,short,integer,long
float,double
boolean
date
string mapping
index
analyzed:分词、默认
not_analyzed:不分词
no:不索引
analyzer
分词器,默认standard analyzer
mapping在创建索引的时候指定
"""
PUT /index
{
"mappings":{
"type_name":{
"properties":{
"field":{
"type":"string",
"index":"not_analyzed"
}
}
}
}
}
"""
mapping中已经存在的field不能被修改,但可以新增field
"""
PUT /index/_mapping/type_name
{
"properties":{
"field_new":{
"type":"string",
"index":"not_analyzed"
}
}
}
"""
array
数组的元素的类型必须一致,es会以数组的第一个元素的类型作为这个field的类型,数组是无序的。
Empty fie
3ff0
ld
null,[],[null]
空值的field不会被索引
##Query DSL
performance
query 找到匹配的document,而且计算相关度_score,不能被cache;用于全文搜索或需要计算相关度的地方。
filter 仅仅找到匹配的document,不计算相关度没有_score,花费内存1 bit/doc,可以被cache;用于任何不需要相关度的地方。
term filter
精确匹配field
"""
{"term":{"field":"value"}}
"""
terms filter
多值精确匹配field
"""
{"terms":{"field":["value1","value2","value3"]}}
"""
range,exists,missing,bool
match
可用于全文搜索,也可用于精确搜索。
检验query
"""
GET /index/type/_validate/query?explain
{...}
"""
explain参数,可以返回错误原因。
##排序
默认按_score降序;其他field默认升序
{"sort":{"date":{"order":"desc"}}}
多值的field
mode:min,max,avg,sum
分词与不分词并存
"""
"field":{
"type":"string",
"analyzer":"english",
"fields":{
"raw":{
"type":"string",
"index":"not_analyzed"
}
}
}
"""
使用 field.raw
对分词的field排序会非常耗内存
相关度计算
TF/IDF:在一个document的field中的词频/在index的文档中出现的频率
fielddata
排序时,es加载整个index的所有document的values到内存,而不仅仅是查询到的document。
主要用于
一个field的排序
对field的聚合
固定数据集的过滤,比如geolocation filters
scripts that refer to fields
非常耗内存,尤其是具有很多不同值的field
##distributed search execution
结果跳跃(bouncing results problem)
因为主从分片同步延迟,使从主分片读和从副本分片读的结果不一样。
使用preference参数可以控制从哪个分片或者节点搜索。
timeout
指定等待分片返回结果的时间,如果超时,分片马上返回已经搜索到的结果。
routing
指定分片路由
search_type
query_then_fetch
默认
count
获取统计结果
query_and_fetch
仅用于单分片,query和fetch作为一步操作
dfs_query_then_fetch,dfs_query_and_fetch
用于计算相关度
scan
与scroll API一起使用,用于获取大量数据,禁止排序
scan,scroll
分批(batch)获取数据,直到取完所有数据,不排序因此高效。
scroll:类似mysql的浮标cursor
用法
"""
GET /index/_search?search_type=scan&scroll=1m
{
"query":{"match_all":{}},
"size":1000
}
"""
返回 _scroll_id:base-64 encoded string
"""
GET /_search/scroll?scroll=1m
_scroll_id
"""
scroll=1m 这个过期时间每次请求都会刷新,所以只要足够处理一批的数据就行。
每批数据条数是 size * number_of_primary_shards
每次请求scroll, 都会返回一个新的 _scroll_id, 下次请求需要带上。
相关文章推荐
- 巧用mysql提示符prompt清晰管理数据库的方法
- 两大步骤教您开启MySQL 数据库远程登陆帐号的方法
- phpmyadmin 4+ 访问慢的解决方法
- linux系统下实现mysql热备份详细步骤(mysql主从复制)
- CentOS 5.5下安装MySQL 5.5全过程分享
- MySQL复制的概述、安装、故障、技巧、工具(火丁分享)
- MySQL中删除重复数据的简单方法
- 使用ElasticSearch+LogStash+Kibana+Redis搭建日志管理服务
- ElasticSearch的安装配置
- ElasticSearch REST API
- 网站基于ElasticSearch搜索的优化笔记 PHP
- elasticsearch安装与调试
- elasticsearch建立geo search
- elasticsearch在NAS上的部署和使用
- 关于ElasticSearch的一些肤浅的思考
- 通过Crontab调用HIVE语句对ElasticSearch索引读写操作
- Elasticsearch Install
- Talking to Elasticsearch
- elasticsearch 基础
- 开源搜索引擎评估:lucene sphinx elasticsearch