程序员

elastic search in action

2016-04-11  本文已影响1041人  shamumu

此文是关于elasticsearch in action书部分重点读书笔记。

Chapter 2 Diving into elasticsearch

物理布局VS逻辑布局

2.1 理解逻辑布局:documents,types,indices

当你index一个文档在es,你把它放在一个type在一个index里。

get-together包含两个类型:event和group。 这些types包含documents,比如标签为1。label 1 是document的ID。

2.2 理解物理布局:nodes和shards

默认,每个index由5各shards组成,每个shard有一个replica,总共10个shards 当访问一个Document,根据document id hash到某个shard

elasticsearch index vs. lucene index
一个es index被分解成chunks:shards。一个shard是一个lucene index,因此一个elasticsearch index由多个lucene indices组成。

get-together index包含的信息 存储原始文档的内容和额外信息,比如term dictionary,term frequency来帮助索引 一个es index由一个或多个primary shard和0-多个 replica shard组成

2.2.3 分布shards在一个cluster

最简单的es cluster只有一个节点。

为了提高性能,可以垂直scale也可以水平scale 默认,documents均匀分布在shards。一旦目标shard被决定了,当前节点转发document到节点holding那个shard。随后,indexing操作重放被那个shard的所有replica。索引命令成功但会在可提供的replicas结束索引文档。 搜索请求转发到primary/replica shards包含数据的完备集合。 结果然后被聚集发送回客户端。

默认,primary 和 replica shards击中用round-robin算法。也可以组织数据或配置shards来组织更慢的节点变成一个瓶颈。

2.3 indexing new data

document uri在es中

man curl 来看关于curl的帮助信息

如果你喜欢图形界面,可以用几个工具

2.3.2 创建index和mapping type

只要求返回name,location

如果想要在特定field运行,比如q=name:elasticsearch。
实际上,es默认用field:_all,所有field的内容都被index。
一个搜索的三个重要方面:

2.4.2 回复的content

一个单独文档的搜索返回两个域

默认搜索timeout时间是永久不timeout,但可以指定timeout时间

当一个shard down,会返回shard fail的数目

document的score默认用TF-IDF (term frequency-inverse document frequency)算法。
默认,es限制返回的数目是10,用size参数改变返回结果的数目。
每个匹配文档有它的index和type,ID,分数。
如果你不想指定显示什么域,_source域被用。
也可以用source filtering.

setting query string options

% curl 'localhost:9200/get-together/group/_search?pretty' -d '{
  "query": {
    "query_string": {
      "query": "elasticsearch san francisco",
      "default_field": "name",
      "default_operator": "AND"
    }
  }
}'

另一种方式是指定field和操作子在query string本身:

"query": "name:elasticsearch AND name:san AND name:francisco"
  "aggregations" : {
    "organizers" : {
      "terms" : { "field" : "organizer" }
    }
  }
}'

2.4.4 getting documents by ID

要获取某个特定document,必须知道它属于的index,type,ID。

% curl 'localhost:9200/get-together/group/1?pretty'
{
  "_index" : "get-together",
  "_type" : "group",
  "_id" : "1",
  "_version" : 1,
  "found" : true,
  "_source" : {
  "name": "Denver Clojure",
  "organizer": ["Daniel", "Lee"]
….

2.5 配置es

默认,新的节点发现存在的clusters通过多播——发送ping到所有的主机监听特定multicast address。如果一个cluster被发现,新的节点加入它如果它有相同的cluster名字。你需要自定义cluster名字放置默认配置的实例加入到cluster。改变cluster name:
cluster.name:elasticsearch-in-action
改变cluster名字后,重启es。

如果改变cluster ,原来索引数据不存在。

2.5.2 指定verbose logging通过logging.yml

elasticsearch log 入口是三种类型的文件:

2.5.3 调整JVM设置

es用的绝大多数内存叫做heap。如果你的操作超过了1GB,这些操作会失败你会看到内存不足的信息。

2.6 增加节点到cluster

在增加节点前,需要检查cluster状态来可视化当前分配数据。
如果没有plugin装,可以用

% curl 'localhost:9200/_cat/shards?v'

Chapter 3. Indexing, updating, and deleting data

Chapter 3. Indexing, updating, and deleting data

3.1. Using mappings to define kinds of documents

3.1.1. Retrieving and defining mappings

curl 'localhost:9200/get-together/group/_mapping?pretty'

3.1.2. Extending an existing mapping
3.2. Core types for defining your own fields in documents
3.2.1. String
3.2.2. Numeric
3.2.3. Date
3.2.4. Boolean
3.3. Arrays and multi-fields
3.3.1. Arrays
3.3.2. Multi-fields
3.4. Using predefined fields
3.4.1. Controlling how to store and search your documents
3.4.2. Identifying your documents
3.5. Updating existing documents
3.5.1. Using the update API
3.5.2. Implementing concurrency control through versioning
3.6. Deleting data
3.6.1. Deleting documents
3.6.2. Deleting indices
3.6.3. Closing indices
3.6.4. Re-indexing sample documents
3.7. Summary
Chapter 4. Searching your data
4.1. Structure of a search request
4.1.1. Specifying a search scope
4.1.2. Basic components of a search request
4.1.3. Request body–based search request
4.1.4. Understanding the structure of a response
4.2. Introducing the query and filter DSL
4.2.1. Match query and term filter
4.2.2. Most used basic queries and filters
4.2.3. Match query and term filter
4.2.4. Phrase_prefix query
4.3. Combining queries or compound queries
4.3.1. bool query
4.3.2. bool filter
4.4. Beyond match and filter queries
4.4.1. Range query and filter
4.4.2. Prefix query and filter
4.4.3. Wildcard query
4.5. Querying for field existence with filters
4.5.1. Exists filter
4.5.2. Missing filter
4.5.3. Transforming any query into a filter
4.6. Choosing the best query for the job
4.7. Summary

Chapter 5. Analyzing your data

5.1. What is analysis?

5.1.1. Character filtering
5.1.2. Breaking into tokens
5.1.3. Token filtering
5.1.4. Token indexing
5.2. Using analyzers for your documents
5.2.1. Adding analyzers when an index is created
5.2.2. Adding analyzers to the Elasticsearch configuration
5.2.3. Specifying the analyzer for a field in the mapping
5.3. Analyzing text with the analyze API
5.3.1. Selecting an analyzer
5.3.2. Combining parts to create an impromptu analyzer
5.3.3. Analyzing based on a field’s mapping
5.3.4. Learning about indexed terms using the terms vectors API
5.4. Analyzers, tokenizers, and token filters, oh my!
5.4.1. Built-in analyzers
5.4.2. Tokenization
5.4.3. Token filters
5.5. Ngrams, edge ngrams, and shingles
5.5.1. 1-grams
5.5.2. Bigrams
5.5.3. Trigrams
5.5.4. Setting min_gram and max_gram
5.5.5. Edge ngrams
5.5.6. Ngram settings
5.5.7. Shingles
5.6. Stemming
5.6.1. Algorithmic stemming
5.6.2. Stemming with dictionaries
5.6.3. Overriding the stemming from a token filter
5.7. Summary
Chapter 6. Searching with relevancy
6.1. How scoring works in Elasticsearch
6.1.1. How scoring documents works
6.1.2. Term frequency
6.1.3. Inverse document frequency
6.1.4. Lucene’s scoring formula
6.2. Other scoring methods
6.2.1. Okapi BM25
6.3. Boosting
6.3.1. Boosting at index time
6.3.2. Boosting at query time
6.3.3. Queries spanning multiple fields
6.4. Understanding how a document was scored with explain
6.4.1. Explaining why a document did not match
6.5. Reducing scoring impact with query rescoring
6.6. Custom scoring with function_score
6.6.1. weight
6.6.2. Combining scores
6.6.3. field_value_factor
6.6.4. Script
6.6.5. random
6.6.6. Decay functions
6.6.7. Configuration options
6.7. Tying it back together
6.8. Sorting with scripts
6.9. Field data detour
6.9.1. The field data cache
6.9.2. What field data is used for
6.9.3. Managing field data
6.10. Summary
Chapter 7. Exploring your data with aggregations
7.1. Understanding the anatomy of an aggregation
7.1.1. Structure of an aggregation request
7.1.2. Aggregations run on query results
7.1.3. Filters and aggregations
7.2. Metrics aggregations
7.2.1. Statistics
7.2.2. Advanced statistics
7.2.3. Approximate statistics
7.3. Multi-bucket aggregations
7.3.1. Terms aggregations
7.3.2. Range aggregations
7.3.3. Histogram aggregations
7.4. Nesting aggregations
7.4.1. Nesting multi-bucket aggregations
7.4.2. Nesting aggregations to get result grouping
7.4.3. Using single-bucket aggregations
7.5. Summary
Chapter 8. Relations among documents
8.1. Overview of options for defining relationships among documents
8.1.1. Object type
8.1.2. Nested type
8.1.3. Parent-child relationships
8.1.4. Denormalizing
8.2. Having objects as field values
8.2.1. Mapping and indexing objects
8.2.2. Searching in objects
8.3. Nested type: connecting nested documents
8.3.1. Mapping and indexing nested documents
8.3.2. Searches and aggregations on nested documents
8.4. Parent-child relationships: connecting separate documents
8.4.1. Indexing, updating, and deleting child documents
8.4.2. Searching in parent and child documents
8.5. Denormalizing: using redundant data connections
8.5.1. Use cases for denormalizing
8.5.2. Indexing, updating, and deleting denormalized data
8.5.3. Querying denormalized data
8.6. Application-side joins
8.7. Summary

Chapter 9. Scaling out
9.1. Adding nodes to your Elasticsearch cluster
9.1.1. Adding nodes to your cluster
9.2. Discovering other Elasticsearch nodes
9.2.1. Multicast discovery
9.2.2. Unicast discovery
9.2.3. Electing a master node and detecting faults
9.2.4. Fault detection
9.3. Removing nodes from a cluster
9.3.1. Decommissioning nodes
9.4. Upgrading Elasticsearch nodes
9.4.1. Performing a rolling restart
9.4.2. Minimizing recovery time for a restart
9.5. Using the _cat API
9.6. Scaling strategies
9.6.1. Over-sharding
9.6.2. Splitting data into indices and shards
9.6.3. Maximizing throughput
9.7. Aliases
9.7.1. What is an alias, really?
9.7.2. Alias creation
9.8. Routing
9.8.1. Why use routing?
9.8.2. Routing strategies
9.8.3. Using the _search_shards API to determine where a search is performed
9.8.4. Configuring routing
9.8.5. Combining routing with aliases
9.9. Summary
Chapter 10. Improving performance
10.1. Grouping requests


这部分介绍是读第一遍时候阅读。

  1. 搜索引擎的综述,可以用来解决什么问题。
  2. 关于主要功能介绍:索引文档,搜索,分析数据通过聚集,缩放到多个节点。
  3. 索引时的选项,更新,和删除数据。你可以学习到什么类型数据你可以有在你的Documents中,什么发生当你写它们。
  4. 深入到全文本搜索。你会发现查询的重要类型,filters,它们如何工作和何时用它们。
  5. 如何分些文本从查询和文本中用来搜索。你会学习如何用不同类型的analyser-你如何建立你自己的analyser-为了完全实现es的全文本搜索能力。
  6. 帮助你完成全文本搜索能力聚焦在相关性上。你会学习因子影响文档的分数如何操作他们用不同得分算法,boosting一个特别的查询或域,或用文档值本身——比如喜欢或转发的树木——来加速得分。
  7. 展示如何用聚集来完成实时分析。你会学习如何去耦合聚集在查询中,如何嵌套它们为了在haystack找到needle。
  8. 处理关系型数据,比如bands和albums。会学习如何用es特征-比如嵌套文档和父子关系-和一般的nosql技术(比如去正交化和应用层连接)来索引和搜索数据不稳的。

第二部分帮助你理解核心功能到声场。需要学习每个特征如何使用,和在性能和缩放性上的影响。

  1. 处理缩放到多个节点上。如何shard或者复制索引——oversharding或者基于时间索引。
  2. 挤压cluster更多性能。es如何用缓存写数据到磁盘。
  3. 如何监管数据在production中。

Chapter 1.Introducing elastic search

1.2 确保相关性结果

相关性得分,简单就直接排序。默认用来计算文档相关性的算法叫做TF-IDF。代表术语frequency-inverse document frequency,两个因子影响相关性得分

1.2.1 用es作为主要的后端

传统上来说,搜索引擎建立在很好建立的数据仓库中来提供快速的和相关的搜索能力。因为历史搜索没有提供可持续存储或者其它需要特征,比如统计学。
es是可以提供可持续存储的一个现代例子。推荐用es作为唯一的数据仓库。
和其它nosql数据仓库类似,es不支持交易。在第三章,会找到如何用版本来控制并发,但是如果需要transaction,考虑用另一个数据库作为真实源。

1.2.4 主要es特征

es允许你方便获取lucene的功能用来索引和搜索数据。在索引段,有很多选择如何处理文本和如何存储处理后的文本。当搜索时候,有很多查询和filters来选择。es暴露了很多这样的功能通过rest api,允许你结构化查询在json,调整绝大部分配置通过相同的api。
在lucene之上,es提供它高层功能,从缓存到实时分析。在第七章,你会学习如何做这些分析通过聚集,给你结果比如最受欢迎blog tags,特定组的post的平均受欢迎程度,无穷尽的结合比如post对于每个标签的受欢迎程度。
另一个层次的抽象是你可以组织文档的方式:多个索引可以分开或一起搜索,你能放置多个类型的文档在一个索引中。
最后,es是弹性的。它是clustered的,你能叫他一个cluster即使你允许在一个单独的server上—你可以增加更多的服务器来增加capacity或者容错率。

1.2.5 扩展lucene能力

es一个显著特征是它是很好结构化的rest api。你也可以看到用filters来包括或者排除结果在一个便宜的和可缓存的方式。json搜索可以包括查询和filter,和聚集,产生统计学从匹配文档中。
通过相同rest api你能读取和改变很多设置,和文档索引的方式。

apache solr

是一个开源的,分布式搜索引擎基于lucene。

1.2.6 在es中结构化数据

Chapter 2. 深入了解功能

所有操作都会用cURL完成,一个简单命令行工具对于http请求。通过这一章,你可以做一些配置改变和开启es的新实例,可以体验多个节点的cluster。
开始描述数据组织。为了理解数据如何在es组织,看如下两个方面:

2.1 理解逻辑布局:文档、类型和索引

当你在es索引一个文件,你放置一个类型在一个index中。types包含documents。index-type-ID 结合独特性鉴定一个文档在es设置中。当你搜索,当你搜索时,你能查看documents在那个特点类型中,或者跨越多个type,甚至多个indices。

2.1.1 Documents

es是面向文档的,索引数据的最小单元是documents。一个文档有若干重要属性:

一个document经常是数据的json代表。json通过http是最常用的方式来和es交互。document在es是schema-free,每个域的类型还是重要的,es保持一个映射你所有的域和他们类型和其它设置。这个映射是特定的对于每个索引的每个类型。这是类型有时叫做mapping types的原因在es术语中。

2.1.2 Types

类型是文档的逻辑包含器,类似于表格是行的容器。
当你搜索域不是在json document的root上,必须指定路径。
新域的自动检测有负面影响因为es可能猜错了。安全的方式是定义映射在索引数据前。
映射类型只在逻辑上划分文档。物理上,文档从相同索引写到disk不管他们属于什么映射类型。

2.1.3 indices

indices是映射类型的容器。es映射是文档的独立块,很像关系数据库:每个索引存储在disk,在相同文件集合中。存储所有域从所有映射类型在那里,有自己的设置。举例,每个缩影由一个设置叫做refresh_interval,定义了索引文档更新间隔。
index-specific设置包括了shards的数目。一个index可以有一个或多个chunk叫做shard组成。这对scalability很好,可以运行es在多台服务器上,相同索引的shard在他们上都有。看如何es的shard工作。

2.2理解物理布局:nodes和shards

2.3索引新数据

2.3.1 索引一个文档用cURL

对于这本书大多数片段,用cURL snippets.cURL是一个命令号工具用于传输数据基于http。用curl命令来做出http请求,成为一个惯例用cURL对于es代码片段。
有很多方式用curl发出请求,允许man curl来查看。curl使用惯例:

2.3.2 创建索引和映射类型

cur命令工作因为es自动增加get-together索引给你,也创建了一个新的映射对于类型组。这个映射包含了你的域作为字符串的定义。es可以默认帮你处理它。让你开始索引不需要任何配置,你也可以改变默认行为。

2.5 配置es

Chapter 3. 索引,更新和删除数据

这章节主要包括让数据进出es。
看域的三种类型:

3.1 用映射来定义文档的类型

每个document属于一个类型,反过来属于一个index。作为数据的逻辑划分,你可以认为indices是数据库,类型是表格。
types包含每个域的定义,映射包含所有域可能出现在文档中,告诉es如何索引改域在文档中。距离,如果包含日期,可以告诉何种格式是可接受的。

types只提供逻辑划分。

所有文档在一个es索引中,不管类型,归结到相同文件集合属于相同shards。在一个shard里,是一个lucene索引,type的名字是一个域,所有映射的所有域一起作为fields在lucene索引中。
type的概念是层抽象特定对于es但不是对于lucene,让你很方便又不同类型documents在相同index中。es负责分开这些文档,距离,通过过滤文档属于一个类型你可以只在那个类型中搜索。
这个方法创建一个问题当相同域名字在多个类型中出现。

3.1.1 获取和定义映射

Chapter 4.搜索数据

chapter 5.分析数据

5.1 什么是分析

分析是es处理文档的主体在文档被发送去inverted index 处理

5.2 在文档上用你的分析器

有两种方式指定解释器被你的fields所有

不管你指定你自定义解释器的方式,你需要指定哪个域用那个解释器在你索引映射中,或者通过指定映射当索引创建或者用put mapping api来指定在随后时机中。

5.2.1增加解释器当一个索引被创建

5.3 分析文本用分析API

用分析API来测试分析过程可能很有用当追踪信息如何在es索引中存储。这api允许你发送任意文本到es,指定何种解释器,符号化,token filter要用,得到分析的tokens。

5.3.3 分析基于一个域的映射

es允许你分析基于域映射已经被建立。

5.3.4学习索引属于用术语向量API

5.5 ngrams,dege ngrams, and shingles

Chapter 6.和相关度一起搜索

Chapter 7.探索数据用聚集

Chapter 8.文档间的关系

一些数据本质上是关联的。

8.1 选项的综述对于定义文档间的关系

来快速定义这些方法:

用object定义Document关系:pros和cons

Chapter 9.Scaling out

Chapter 10.Improving performance

10.2 优化lucene segement的处理

上一篇 下一篇

猜你喜欢

热点阅读