最近正在看ElasticSearch方面的东西,下面来记录并分享下ElasticSearch的分析器与过滤器是如何使用的:
一、简介
分析器就是以某种我们需要的方式来分析数据或查询语句(例如当我们基于空格和小写字母来划分单词时,可以不用担心用户输入的下划线和大写字母)。在创建索引及搜索时ElasticSearch允许使用不同的分析器,因此可以在搜索的各个阶段选择不同的数据处理方式。使用分析器时只需在相应的字段属性中指定分析器的名称即可,故而我们可以指定要用的分析器。
二、内置分析器
ElasticSearch内置了许多分析器可供使用:
1)standard:方便大多数欧洲语言使用的标准分析器。
2)simple:基于非字母字符进行分词并转换为小写字母的分析器。
3)whitespace:基于空格进行分词的分析器。
4)stop:与simple分析器相类似,增加了停用词过滤功能。
5)keyword:该分析器非常简单,它只是将提供的取值全部放行。也可以把相应的字段指定为not_analyzed达到相同的目的。
6)pattern:该分析器允许利用正则表达式对文本进行灵活的划分。
7)language:这是为特定语言所设计的分析器。
8)snowball:与standard分析器相类似,另外还提供了stemming提取算法。
三、自定义分析器
ElasticSearch允许自定义新的分析器。 自定义分析器时需要在映射文件中添加一个setting部分,它保存ElasticSearch创建索引时所需的信息。settings自定义如下:
"settings":{
"index":{
"analysis":{
"analyzer":{
"en":{
"tokenizer":"standard",
"filter":[
"asciifolding",
"lowercase",
"ourEnglishFilter"
]
}
},
"filter":{
"ourEnglishFilter":{
"type":"kstem"
}
}
}
}
}
如上所示,我们指定自己想要一个名为en的新分析器。每个分析器由一个分词和多个过滤器组成。en分析器由standard分词器和3个过滤器组成:asciifolding、lowercase(默认情况下可用)和ourEnglishFilter(自定义过滤器)。
定义一个过滤器,需要指定过滤器的名字、类型(type属性),以及该类型所需的其它参数。
带有自定义分析器的映射如下所示:
{
“settings”:{
"index":{
"analysis":{
"analyzer":{
"en":{
"tokenizer":"standard",
"filter":[
"asciifolding",
"lowercase",
"ourEnglishFilter"
]
}
},
"filter":{
"ourEnglishFilter":{
"type":"kstem"
}
}
}
}
},
"mappings":{
"post":{
"properties":{
"id":{"type":"long", "store":"yes", "percision_step":"0"},
"name":{"type":"string","store":"yes","index":"analyzed", "analyzer":"en"}
}
}
}
}
四、_analyzer字段
用来指定一个字段值,该值可以用于作为解析该字段所属文档的分析器的名称。假设有一些运行着的软件,用来检测某文档的撰写语言,并且将该信息存储在文档的language字段,并且希望该信息选择正确的分析器,实现这些仅需要在映射文件中添加如下语句:
"_analyzer":{
"path":"language"
}
整个映射文件变成如下样式:
{
“mappings”:{
"post":{
"_analyzer":{
"path":"language"
},
"properties":{
"id":{"type":"long", "store":"yes","precision_step":"0"},
"name":{"type":"string","store":"yes","index":"analyzed"},
"language":{"type":"string", "store":"yes", "index":"not_analyzed"}
}
}
}
}
注:需定义一个与language字段值同名的分析器。
五、默认分析器
指定一个分析器为默认分析器,如果未指明用哪个分析器,则使用默认分析器。与在映射文件的settings中配置一个定制分析器的方式相同,只不过是使用default关键字替代指定分析器的名称,为了使我们上面定义的分析器默认使用,我们可以将en分析器改为如下样式:
{
“settings”:{
"index":{
"analysis":{
"analyzer":{
"default":{
"tokenizer":"standard",
"filter":[
"asciifolding",
"lowercase",
"ourEnglishFilter"
]
}
},
"filter":{
"ourEnglishFilter":{
"type":"kstem"
}
}
}
}
}
}