【Elastic Search权威指南 读书小记7】ES之索引管理

有道云排版好一点:https://note.youdao.com/ynoteshare1/index.html?id=c71c2939061bcd6d6bb156dcfbb1ba57&type=note

注意:ES的索引只的是INDEX,类似mysql的database,而不是mysql的索引key

1.创建删除

索引可以被添加时自动创建,也可以手动创建。也可以使用delete指令删除

2.索引设置

最重要的两个参数:主分片和复制分片设置

PUT /my_temp_index { "settings": { "number_of_shards": 1, "number_of_replicas": 0 } }

动态设置复制分片

PUT /my_temp_index/_settings { "number_of_replicas": 1 }

3.配置分析器

分析器也是比较重要的设置,默认standard对西方语系支持不错,但是不适合中文

在下面的例子中,我们创建了一个新的分析器,叫做 es_std ,并使用预定义的西班牙语停用词

PUT /spanish_docs { "settings": { "analysis": { "analyzer": { "es_std": { "type": "standard", "stopwords": "_spanish_" } } } } }

4.自定义分析器

分析器 是三个顺序执行的组件的结合(字符过滤器,分词器,标记过滤器)。实际工程中,不仅针对中文要选择好分析器,也要针对自己的场景

字符过滤器

字符过滤器是让字符串在被分词前变得更加“整洁”。例如,如果我们的文本是 HTML 格

式,它可能会包含一些我们不想被索引的 HTML 标签,诸如 <p> 或 <div> 。

我们可以使用 html_strip 字符过滤器 来删除所有的 HTML 标签,并且将 HTML 实体转

换成对应的 Unicode 字符,比如将 &Aacute; 转成 Á 。

一个分析器可能包含零到多个字符过滤器。

分词器

一个分析器 必须 包含一个分词器。分词器将字符串分割成单独的词(terms)或标记

(tokens)。 standard 分析器使用 standard 分词器将字符串分割成单独的字词,删除

大部分标点符号,但是现存的其他分词器会有不同的行为特征。

例如, keyword 分词器输出和它接收到的相同的字符串,不做任何分词处理。

[ whitespace 分词器]只通过空格来分割文本。[ pattern 分词器]可以通过正则表达式来

分割文本。

标记过滤器

分词结果的 标记流 会根据各自的情况,传递给特定的标记过滤器。

标记过滤器可能修改,添加或删除标记。我们已经提过 lowercase 和 stop 标记过滤

器,但是 Elasticsearch 中有更多的选择。 stemmer 标记过滤器将单词转化为他们的根

形态(root form)。 ascii_folding 标记过滤器会删除变音符号,比如从 très 转为

tres 。 ngram 和 edge_ngram 可以让标记更适合特殊匹配情况或自动完成。

5.创建自定义分析器

与索引设置一样,我们预先配置好 es_std 分析器,我们可以再 analysis 字段下配置字符过滤器,分词器和标记过滤器。

作为例子,我们来配置一个这样的分析器:

1. 用 html_strip 字符过滤器去除所有的 HTML 标签

2. 将 & 替换成 and ,使用一个自定义的 mapping 字符过滤器

"char_filter": {//字符过滤器 "&_to_and": { "type": "mapping", "mappings": ["&=> and "] } }

1. 使用 standard 分词器分割单词

2. 使用 lowercase 标记过滤器将词转为小写

3. 用 stop 标记过滤器去除一些自定义停用词。

"filter": {//标记过滤器 "my_stopwords": { "type": "stop", "stopwords": ["the", "a"] } }

合并

PUT /my_index { "settings": { "analysis": { "char_filter": {//字符过滤器 "&_to_and": { "type": "mapping", "mappings": ["&=> and "] } }, "filter": {//标记过滤器 "my_stopwords": { "type": "stop", "stopwords": ["the", "a"] } }, "analyzer": { "my_analyzer": { "type": "custom", "char_filter": ["html_strip", "&_to_and"], "tokenizer": "standard", "filter": ["lowercase", "my_stopwords"] } } } } }

查看配置成功

PUT /my_index/_mapping/my_type { "properties": { "title": { "type": "string", "analyzer": "my_analyzer" } } }

效果

GET /my_index/_analyze?analyzer=my_analyzer

The quick & brown fox

{ "tokens": [{ "token": "quick", "position": 2 }, { "token": "and", "position": 3 }, { "token": "brown", "position": 4 }, { "token": "fox", "position": 5 } ] }

 

6.一些重要概念

6.1根对象

映射的最高一层被称为 根对象,它可能包含下面几项:

1.一个 properties 节点,列出了文档中可能包含的每个字段的映射

2.多个元数据字段,每一个都以下划线开头,例如 _type , _id 和 _source

3.设置项,控制如何动态处理新的字段,例如 analyzer , dynamic_date_formats 和

dynamic_templates 。

4.其他设置,可以同时应用在根对象和其他 object 类型的字段上,例如 enabled ,

dynamic 和 include_in_all

6.2属性

三个最重要的设置

type : 字段的数据类型,例如 string 和 date

index : 字段是否应当被当成全文来搜索( analyzed ),或被当成一个准确的值

( not_analyzed ),还是完全不可被搜索( no )

analyzer : 确定在索引和或搜索时全文字段使用的分析器。

6.3元数据:_source 字段

用 JSON 字符串来表示文档主体保存在 _source 字段中。

可以通过put关闭(不建议)

6.4 文档 ID

文档唯一标识由四个元数据字段组成:

_id :文档的字符串 ID

_type :文档的类型名

_index :文档所在的索引

_uid : _type 和 _id 连接成的 type#id

_id 字段有一个你可能用得到的设置: path 设置告诉 Elasticsearch 它需要从文档本身的

哪个字段中生成 _id。有点像唯一索引的意思。

PUT /my_index { "mappings": { "my_type": { "_id": { "path": "doc_id" < 1 > }, "properties": { "doc_id": { "type": "string", "index": "not_analyzed" } } } } }

6.5 动态映射dynamic

为了控制映射,增加了dynamic可设置

通过 dynamic 设置来控制这些行为

true :自动添加字段(默认)

false :忽略字段

strict :当遇到未知字段时抛出异常

dynamic 设置可以用在根对象或任何 object 对象上。你可以将 dynamic 默认设置为

strict ,而在特定内部对象上启用它

 

7.自定义动态索引

如果你想在运行时的增加新的字段,你可能会开启动态索引。虽然有时动态映射的规则显得不那么智能,幸运的是我们可以通过设置来自定义这些规则。

1.日期检测可以通过在根对象上设置 date_detection 为 false 来关闭

2.动态模板:可以通过匹配来选择模板

例如,我们给 string 类型字段定义两个模板:

es : 字段名以 _es 结尾需要使用 spanish 分析器。

en : 所有其他字段使用 english 分析器。

PUT /my_index { "mappings": { "my_type": { "dynamic_templates": [{ "es": { "match": "*_es", < 1 > "match_mapping_type": "string", "mapping": { "type": "string", "analyzer": "spanish" } } }, { "en": { "match": "*", < 2 > "match_mapping_type": "string", "mapping": { "type": "string", "analyzer": "english" } } } ] } } }

3.默认映射 _default_

PUT /my_index { "mappings": { "_default_": { "_all": { "enabled": false } }, "blog": { "_all": { "enabled": true } } } }

 

8.重新索引数据

修改在已存在的数据最简单的方法是重新索引:创建一个新配置好的索引,然后将所有的文

档从旧的索引复制到新的上。

使用【scan-scoll】来批量读取旧索引的文档,然后将通过【bulk API】来将它们推送给新的索引。

批量重新索引:你可以在同一时间执行多个重新索引的任务,但是你显然不愿意它们的结果有重叠。所以,可以将重建大索引的任务通过日期或时间戳字段拆分成较小的任务:

GET /old_index/_search?search_type=scan&scroll=1m { "query": { "range": { "date": { "gte": "2014-01-01", "lt": "2014-02-01" } } }, "size": 1000 }

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值