天天看点

Elasticsearch之创建索引、删除索引、索引设置、配置分析器、自定义分析器。创建索引删除索引索引设置配置分析器自定义分析器创建自定义分析器

创建索引

通过添加一个文档的方式创建一个索引。这个索引使用默认设置,新的属性通过动态映射添加到分类中。现在我们需要对这个过程有更多的控制:我们需要确保索引被创建在适当数量的分片上,在索引数据之前设置好分析器和类型映射。

为了达到目标,我们需要手动创建索引,在请求中加入所有设置和类型映射,如下所示:

Elasticsearch之创建索引、删除索引、索引设置、配置分析器、自定义分析器。创建索引删除索引索引设置配置分析器自定义分析器创建自定义分析器

事实上,你可以通过在config/elasticsearch.yml 中添加下面的配置来防止自动创建索引。

action.auto_create_index:false

NOTE:自动预先配置索引,这在索引日志数据时尤其有效:你将日志数据索引在一个以日期结尾的索引上,第二天,一个新的配置好的索引会自动创建好。

删除索引

使用以下的请求来删除索引:

DELETE /my_index

你也可以用下面的方式删除多个索引

DELETE /index_one,index_two

DELETE /index_*

你甚至可以删除所有索引

DELETE /_all

索引设置

你可以通过很多种方式来自定义索引行为,但是:

提示:Elasticsearch提供了优化好的默认配置。除非你明白这些配置的行为和为什么要这么做,请不要修改这些配置。

下面是两个最重要的设置:

number_of_shards

定义一个索引的主分片个数,默认值是“5”。这个配置在索引创建后不能修改。

number_of_replicas

每个主分片的复制分片个数,默认是“1”。这个配置可以随时在活跃的索引上修改。

例如,我们可以创建只有一个主分片,没有复制分片的小索引。

PUT /my_temp_index

{

"setting" : {

"number_of_shards" : 1,

"number_of_replicas" : 0

}

}

然后,我们可以用 update-index-settings API动态修改复制分片个数:

PUT /my_temp_index/_settings

{

"number_of_replicas" : 1

}

配置分析器

第三个重要的索引设置是 analysis 部分,用来配置已存在的分析器或创建自定义分析器来定制化你的索引。

standard 分析器是用于全文字段的默认分析器,对于大部分西方语言来说是一个不错的选择。它考虑了以下几点:

  • standard 分词器,在词层级上分割输入的文本。
  • standard 表征过滤器,被设计用来整理分词器触发的所有表征(但是目前什么都没做)。
  • lowercase 表征过滤器,将所有表征转换为小写。
  • stop 表征过滤器,删除所有可能会造成搜索歧义的停用词,如 a, the, and, is。

默认情况下,停用词过滤器是被禁用的。如需启用它,你可以通过创建一个基于standard分析器的自定义分析器,并且设置stopwords参数。可以提供一个停用词列表,或者使用一个特定语言的预定停用词列表。 在下面的例子中,我们创建了一个新的分词器,叫做 es_std,并使用预定义的西班牙语停用词: PUT /spanish_docs { "settings" : { "analysis" : { "analyzer" : { "es_std" : { "type" : "standard" , "stopwords" : "_spanish" } } } } } es_std分析器不是全局的,它仅仅存在于我们定义的 spanish_docs索引中。为了用 analyze API来测试他,我们需要使用特定的索引名。 GET /spanish_docs/_analyze?analyzer=es_std El veloz zorro marrón 下面简化的结果中显示停用词 El 被正确的删除了:

Elasticsearch之创建索引、删除索引、索引设置、配置分析器、自定义分析器。创建索引删除索引索引设置配置分析器自定义分析器创建自定义分析器

自定义分析器

虽然Elasticsearch内置了一系列的分析器,但是真正的强大之处在于定制你自己的分析器。你可以通过在配置文件中组合字符过滤器、分词器和表征过滤器,来满足特定数据的需求。 分析器是三个顺序执行的组件的结合(字符过滤器、分词器、表征过滤器)。 字符过滤器 字符过滤器是让字符串在被分词前变得更加“整洁”。例如,如果我们的文本是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 可以让表征更适合特殊匹配情况或自动完成。

创建自定义分析器

与索引设置一样,我们预先配置好 es_std 分析器,我们可以在 analysis 字段下配置字符过滤器、分词器和表征过滤器:

Elasticsearch之创建索引、删除索引、索引设置、配置分析器、自定义分析器。创建索引删除索引索引设置配置分析器自定义分析器创建自定义分析器

作为例子,我们来配置一个这样的分析器: 1、用html_strip 字符过滤器去除所有的HTML标签。 2、将&替换成 and,使用一个自定义的 mapping字符过滤器。 "char_filter" : { "&_to_and" : { "type" : "mapping", "mapping" : [ "&=>and" ] } } 1、使用standard 分词器分割单词 2、使用lowercase 表征过滤器将词转为小写 3、用stop 表征过滤器去除一些自定义停用词 "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  { "settings" : { "analysis" : { "char_filter" : { "&_to_and" : { "type" : "mapping" , "mapping" : [ "&=>and" ] }}, "filter" : { "my_stopwords" : { "type" : "stop", "stopwords" : [ "the" , "a" ] }}, "analyzer" : { "my_analyzer" : { "type" : "custom", "char_filter" : [ "html_strip", "&_to_and" ], "tokenizer" : "standard", "filter" : [ "lowercase", "mystopwords" ] } } } } } 创建索引后,用 analyze API 来测试新的分析器: GET /my_index/_analyze?analyzer=my_analyzer The quick & brown fox 下面的结果证明我们的分析器能正常工作了:

Elasticsearch之创建索引、删除索引、索引设置、配置分析器、自定义分析器。创建索引删除索引索引设置配置分析器自定义分析器创建自定义分析器

除非我们告诉Elasticsearch在哪里使用,否则分析器不会起作用。我们可以通过下面的映射将它应用在一个string类型的字段上: PUT /my_index/_mapping/my_type { "properties" : { "title" : { "type" : "string", "analyzer" : "my_analyzer" } } }

继续阅读