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

来源:互联网 发布:手机淘宝不能登录原因 编辑:程序博客网 时间:2024/06/05 18:57

创建索引

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

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

事实上,你可以通过在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内置了一系列的分析器,但是真正的强大之处在于定制你自己的分析器。你可以通过在配置文件中组合字符过滤器、分词器和表征过滤器,来满足特定数据的需求。
分析器是三个顺序执行的组件的结合(字符过滤器、分词器、表征过滤器)。
字符过滤器
字符过滤器是让字符串在被分词前变得更加“整洁”。例如,如果我们的文本是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 字段下配置字符过滤器、分词器和表征过滤器:
作为例子,我们来配置一个这样的分析器:
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在哪里使用,否则分析器不会起作用。我们可以通过下面的映射将它应用在一个string类型的字段上:
PUT /my_index/_mapping/my_type
{
"properties" : {
"title" : {
"type" : "string",
"analyzer" : "my_analyzer"
}
}
}