关于什么是es的分析器,以及如何工作的,我想百度要说的比我明白,简而言之,es在对text数据进行索引的时候支持选择分析器,而分析器是字符过滤器,分词器,以及分词过滤器的统称
es默认支持一下集中分析器
名称 | 功能 |
---|---|
standard 标准分词器 | 英文按照空格分词,中文则按照单个汉字分词 |
simple 分析器 | 按照非字母字符进行词语拆分,并将所有词语转换为小写 |
language分析器 | 语言分析器 |
whitespace分析器 | 按照空白字符拆分词语 |
pattern分析器 | 使用正则表达式将文本拆分成词语 |
建立索引时指定分析器
- 全局设置
PUT hotel
{
"settings": {
"analysis": {
"analyzer": {
"default":
{
"type":"standard"
}
}
}
},
"mappings": {
"properties": {
"title":
{
"type": "text"
},
"sup_env":
{
"type": "text"
}
}
}
}
- 单字段设置
PUT hotel
{
"mappings": {
"properties": {
"title":
{
"type": "text",
"analyzer": "standard"
},
"sup_env":
{
"type": "text",
"analyzer": "standard"
}
}
}
}
自定义分析器
假定我们创建的hotel index中sup_env 存的数据格式是APP,H5,… ,是以逗号分割的,搜索的时候希望根据用户输入进行过滤,比如输入H5,则需要查询包含H5的hotel,则可以使用pattern 进行自定义分析器
PUT hotel
{
"settings": {
"analysis": {
"analyzer": {
"custom_analyzer":{ #自定义分析器
"tokenizer":"custom_tokenizer" #使用custom_tokenizer分词器
}
},
"tokenizer": {#定义分词器
"custom_tokenizer":{
"type":"pattern",
"pattern":","#指定切分使用的分割符
}
}
}
},
"mappings": {
"properties": {
"title":
{
"type": "text",
"analyzer": "whitespace"
},
"sup_env":
{
"type": "text",
"analyzer": "custom_analyzer"
}
}
}
}
POST /_bulk
{"index":{"_index":"hotel"}}
{"title":"金都嘉怡假日酒店","sup_env":"APP,H5"}
{"index":{"_index":"hotel"}}
{"title":"金都欣欣酒店","sup_env":"WX,H5"}
{"index":{"_index":"hotel"}}
{"title":"金都酒店","sup_env":"WX"}
GET hotel/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"sup_env": "H5,WX"
}
}
]
}
}
}