elasticsearch手册(5)索引管理
创建索引
迄今为止,我们简单的通过添加一个文档的方式创建了一个索引。这个索引使用默认设置,新的属性通过动态映射添加到分类中。现在我们需要对这个过程有更多的控制:我们需要确保索引被创建在适当数量的分片上,在索引数据之前设置好分析器和类型映射。
为了达到目标,我们需要手动创建索引,在请求中加入所有设置和类型映射,如下所示:
1 2 3 4 5 6 7 8 |
PUT /my_index { "settings": { ... any settings ... }, "mappings": { "type_one": { ... any mappings ... }, "type_two": { ... any mappings ... }, ... } |
事实上,你可以通过在 config/elasticsearch.yml 中添加下面的配置来防止自动创建索引。
action.auto_create_index: false
NOTE
今后,我们将介绍怎样用【索引模板】来自动预先配置索引。这在索引日志数据时尤其有效: 你将日志数据索引在一个以日期结尾的索引上,第二天,一个新的配置好的索引会自动创建好。
删除索引
使用以下的请求来删除索引:
DELETE /my_index
你也可以用下面的方式删除多个索引
DELETE /index_one,index_twoDELETE /index_*
你甚至可以删除所有索引
DELETE /_all
设置索引
你可以通过很多种方式来自定义索引行为,你可以阅读Index Modules reference documentation,但是:
提示: Elasticsearch 提供了优化好的默认配置。除非你明白这些配置的行为和为什么要这么做,请不要修改这些配置。
下面是两个最重要的设置:
number_of_shards
定义一个索引的主分片个数,默认值是 5
。这个配置在索引创建后不能修改。
number_of_replicas
每个主分片的复制分片个数,默认是 1
。这个配置可以随时在活跃的索引上修改。
例如,我们可以创建只有一个主分片,没有复制分片的小索引。
1 2 3 4 5 6 7 |
PUT /my_temp_index { "settings": { "number_of_shards" : 1, "number_of_replicas" : 0 } } |
然后,我们可以用 update-index-settings API 动态修改复制分片个数
1 2 3 4 |
PUT /my_temp_index/_settings { "number_of_replicas": 1 } |
配置分析器
第三个重要的索引设置是 analysis 部分,用来配置已存在的分析器或创建自定义分析器来定制化你的索引。
在【分析器介绍】中,我们介绍了一些内置的分析器,用于将全文字符串转换为适合搜索的倒排索引。
standard 分析器是用于全文字段的默认分析器,对于大部分西方语系来说是一个不错的选择。它考虑了以下几点:
- standard 分词器,在词层级上分割输入的文本。
- standard 标记过滤器,被设计用来整理分词器触发的所有标记(但是目前什么都没做)。
- lowercase 标记过滤器,将所有标记转换为小写。
- stop 标记过滤器,删除所有可能会造成搜索歧义的停用词,如 a,the,and,is。
默认情况下,停用词过滤器是被禁用的。如需启用它,你可以通过创建一个基于 standard 分析器的自定义分析器,并且设置 stopwords 参数。可以提供一个停用词列表,或者使用一个特定语言的预定停用词列表。
在下面的例子中,我们创建了一个新的分析器,叫做 es_std,并使用预定义的西班牙语停用词:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
PUT /spanish_docs { "settings": { "analysis": { "analyzer": { "es_std": { "type": "standard", "stopwords": "_spanish_" } } } } } |
es_std 分析器不是全局的,它仅仅存在于我们定义的 spanish_docs 索引中。为了用 analyze API 来测试它,我们需要使用特定的索引名。
GET /spanish_docs/_analyze?analyzer=es_stdEl veloz zorro marrón下面简化的结果中显示停用词 El 被正确的删除了
1 2 3 4 5 6 7 |
{ "tokens" : [ { "token" : "veloz", "position" : 2 }, { "token" : "zorro", "position" : 3 }, { "token" : "marrón", "position" : 4 } ] } |
自定义分析器
虽然 Elasticsearch 内置了一系列的分析器,但是真正的强大之处在于定制你自己的分析器。你可以通过在配置文件中组合字符过滤器,分词器和标记过滤器,来满足特定数据的需求。
在 【分析器介绍】 中,我们提到 分析器 是三个顺序执行的组件的结合(字符过滤器,分词器,标记过滤器)。
字符过滤器
字符过滤器是让字符串在被分词前变得更加“整洁”。例如,如果我们的文本是 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 可以让标记更适合特殊匹配情况或自动完成。
在【深入搜索】中,我们将举例介绍如何使用这些分词器和过滤器。但是首先,我们需要阐述一下如何创建一个自定义分析器
创建自定义分析器
与索引设置一样,我们预先配置好 es_std 分析器,我们可以再 analysis 字段下配置字符过滤器,分词器和标记过滤器:
1 2 3 4 5 6 7 8 9 10 11 |
PUT /my_index { "settings": { "analysis": { "char_filter": { ... custom character filters ... }, "tokenizer": { ... custom tokenizers ... }, "filter": { ... custom token filters ... }, "analyzer": { ... custom analyzers ... } } } } |
作为例子,我们来配置一个这样的分析器:
- 用 html_strip 字符过滤器去除所有的 HTML 标签
- 将 & 替换成 and,使用一个自定义的 mapping 字符过滤器
1 2 3 4 5 6 |
"char_filter": { "&_to_and": { "type": "mapping", "mappings": [ "&=> and "] } } |
- 使用 standard 分词器分割单词
- 使用 lowercase 标记过滤器将词转为小写
- 用 stop 标记过滤器去除一些自定义停用词。
1 2 3 4 5 6 |
"filter": { "my_stopwords": { "type": "stop", "stopwords": [ "the", "a" ] } } |
根据以上描述来将预定义好的分词器和过滤器组合成我们的分析器:
1 2 3 4 5 6 7 8 |
"analyzer": { "my_analyzer": { "type": "custom", "char_filter": [ "html_strip", "&_to_and" ], "tokenizer": "standard", "filter": [ "lowercase", "my_stopwords" ] } } |
用下面的方式可以将以上请求合并成一条:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
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" ] }} }}} |
创建索引后,用 analyze API 来测试新的分析器:
GET /my_index/_analyze?analyzer=my_analyzerThe quick & brown fox下面的结果证明我们的分析器能正常工作了
1 2 3 4 5 6 7 8 |
{ "tokens" : [ { "token" : "quick", "position" : 2 }, { "token" : "and", "position" : 3 }, { "token" : "brown", "position" : 4 }, { "token" : "fox", "position" : 5 } ] } |
除非我们告诉 Elasticsearch 在哪里使用,否则分析器不会起作用。我们可以通过下面的映射将它应用在一个 string 类型的字段上
1 2 3 4 5 6 7 8 9 |
PUT /my_index/_mapping/my_type { "properties": { "title": { "type": "string", "analyzer": "my_analyzer" } } } |
发表评论