文档章节

《Elasticsearch: The Definitive Guide》读书笔记2

xiaorong919
 xiaorong919
发布于 2015/12/11 00:53
字数 1377
阅读 138
收藏 5

##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 field

    • 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, 下次请求需要带上。

© 著作权归作者所有

共有 人打赏支持
xiaorong919
粉丝 4
博文 7
码字总数 8209
作品 0
广州
私信 提问
Elasticsearch 版本控制version

Elasticsearch版本控制 1、为什么要进行版本控制 日常生产环境中,会频繁的对数据进行相关的操作,那么如何保证数据在多线程操作(有两个或两个以上的人在操作修改同一个数据)情况下的准确性...

菜花_Q
2018/04/23
0
0
Elastic Search学习笔记1——安装elasticsearch2.4.6

Elastic Search 简介 1.基于Apache Lucene的开源搜索引擎 2.采用Java编写 RESTful API风格 3.较容易的横向扩展 应用场景 1.海量数据分析引擎 2.数据搜索引擎 3.数据仓库 官网 https://www.el...

晨猫
2018/03/09
0
0
ElasticSearch学习笔记-相关度得分记录

最近想要修改调整一下ElasticSearch里面Doc的Score,于是在ES官网查阅了一下,相关的介绍和说明还是非常详细的,能做的修改调整也还是比较多的,需要根据具体的情形去选择相应的方式做合适的...

xiaomin0322
2018/07/02
0
0
快速上手 Elasticsearch 的几个建议

相信不少同学都听说过 Elasticsearch,作为目前最流行的搜索引擎实现方案,越来越多的公司在自己的架构中引入,而其应用场景也从搜索引擎扩展到了日志存储分析、大数据分析领域,本文尝试给初...

rockybean
2018/05/21
0
0
Elasticsearch中文分词研究

一、ES分析器简介 ES是一个实时搜索与数据分析引擎,为了完成搜索功能,必须对原始数据进行分析、拆解,以建立索引,从而实现搜索功能; ES对数据分析、拆解过程如下: 首先,将一块文本分成...

zhaipengfei1231
2018/04/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

技术复习-Spring事务

spring事务 1.事务传播机制 在spring中事务存在嵌套的情况,在这种情况下事务如何协调,spring在TransactionDefinition中设了七个规则,被称作事务的传播机制 1.TransactionDefinition.PROP...

Lubby
22分钟前
1
0
linux 虚拟机安装

一、虚拟化检查 1. 检查cpu是否支持 grep -E 'vmx|svm' /proc/cpuinfo 2. 检查虚拟化是否开启 lsmod |grep kvm 显示内容与截图一致,服务器已经开启了虚拟化的支持,如果没有前2条内容,...

小儿
22分钟前
2
0
Linux之系统日志简介

前言 日志在排查文件的时候至关重要,在Linux上一般跟系统相关的日志默认都会放到/var/log下面。 1、/var/log/boot.log 一般包含系统启动时的日志,包括自启动的服务。 2、/var/log/btmp 记录...

城市之雾
22分钟前
1
0
Android数据存储2 文件存储

1.内部存储(私有的,其他程序不能获取) a. 存:FileOutputStream fos = openFileOutput("file", MODE_PRIVATE); 读: FileInputStream fis = openFileInput("file"); 文件路径:data/data/当......

Coding缘
22分钟前
1
0
23种设计模式全解析

一、设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理...

嘿嘿嘿IT
23分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部