有道云排版好一点: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 字符,比如将 Á 转成 Á 。
一个分析器可能包含零到多个字符过滤器。
分词器
一个分析器 必须 包含一个分词器。分词器将字符串分割成单独的词(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 }