虽然 Elasticsearch 带有一些现成的分析器,然而在分析器上 Elasticsearch 真正的强大之处在于,你可以通过在一个适合你的特定数据的设置之中组合<mark>字符过滤器、分词器、词汇单元过滤器</mark>来创建自定义的分析器。
<br/>
一个分析器就是在一个包里面组合了三种函数的一个包装器, 三种函数按照如下顺序被执行:
**1. 字符过滤器**
字符过滤器用来整理一个尚未被分词的字符串。
* html 清除字符过滤器
如果我们的文本是 HTML 格式的,它会包含像` <p>` 或者 `<div>` 这样的 HTML 标签,这些标签是我们不想索引的。我们可以使用html清除字符过滤器来移除掉所有的 HTML 标签,并且像把 `Á`这样的字符转换为相对应的 Unicode 字符 Á 这样转换 为HTML 实体。
一个分析器可能有 0 个或者多个字符过滤器。
**2. 分词器**
一个分析器必须有一个唯一的分词器。 分词器把字符串分解成单个词条或者词汇单元。
* 标准分词器:标准分析器里使用的标准分词器把一个字符串根据单词边界分解成单个词条,并且移除掉大部分的标点符号。
* 关键词分词器:完整地输出接收到的同样的字符串,并不做任何分词。
* 空格分词器:只根据空格分割文本 。
* 正则分词器:根据匹配正则表达式来分割文本 。
**3. 词单元过滤器**
经过分词,作为结果的词单元流会按照指定的顺序通过指定的词单元过滤器 。词单元过滤器可以修改、添加或者移除词单元。
* lowercase词过滤器:将分词规范化为小写,它通过language参数支持希腊语、爱尔兰语和土耳其语小写标记过滤器。
* 词干过滤器:把单词遏制为词干。
* ascii_folding 过滤器:移除变音符,把一个像 `très` 这样的词转换为 `tres`。
* ngram 和 edge_ngram 词单元过滤器:可以产生适合用于部分匹配或者自动补全的词单元。
<br/>
如下创建自定义分析器:
```json
# my_index是创建的索引
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"
]
}
}
}
}
}
```
测试结果如下,表明该分析器可用。
```json
GET /my_index/_analyze
{
"text":"The quick & brown fox",
"analyzer": "my_analyzer"
}
响应结果如下:
{
"tokens" : [
{
"token" : "quick",
"start_offset" : 4,
"end_offset" : 9,
"type" : "<ALPHANUM>",
"position" : 1
},
{
"token" : "and",
"start_offset" : 10,
"end_offset" : 11,
"type" : "<ALPHANUM>",
"position" : 2
},
{
"token" : "brown",
"start_offset" : 12,
"end_offset" : 17,
"type" : "<ALPHANUM>",
"position" : 3
},
{
"token" : "fox",
"start_offset" : 18,
"end_offset" : 21,
"type" : "<ALPHANUM>",
"position" : 4
}
]
}
```
- Elasticsearch是什么
- 全文搜索引擎
- Elasticsearch与Solr
- 数据结构
- 安装Elasticsearch
- Linux单机安装
- Windows单机安装
- 安装Kibana
- Linux安装
- Windows安装
- es基本语句
- 索引操作
- 文档操作
- 映射操作
- 高级查询
- es-JavaAPI
- maven依赖
- 索引操作
- 文档操作
- 高级查询
- es集群搭建
- Linux集群搭建
- Windows集群搭建
- 核心概念
- 索引(Index)
- 类型(Type)
- 文档(Document)
- 字段(Field)
- 映射(Mapping)
- 分片(Shards)
- 副本(Replicas)
- 分配(Allocation)
- 系统架构
- 分布式集群
- 单节点集群
- 故障转移
- 水平扩容
- 应对故障
- 路由计算
- 分片控制
- 写流程
- 读流程
- 更新流程
- 多文档操作流程
- 分片原理
- 倒排索引
- 文档搜索
- 动态更新索引
- 近实时搜索
- 持久化变更
- 段合并
- 文档分析
- 内置分析器
- 分析器使用场景
- 测试分析器
- 指定分析器
- 自定义分析器
- 文档处理
- 文档冲突
- 乐观并发控制
- 外部系统版本控制
- es优化
- 硬件选择
- 分片策略
- 合理设置分片数
- 推迟分片分配
- 路由选择
- 写入速度优化
- 批量数据提交
- 优化存储设备
- 合理使用合并
- 减少Refresh的次数
- 加大Flush设置
- 减少副本的数量
- 内存设置
- 重要配置
- es常见问题
- 为什么要使用Elasticsearch
- master选举流程
- 集群脑裂问题
- 索引文档流程
- 更新和删除文档流程
- 搜索流程
- ES部署在Linux时的优化方法
- GC方面ES需要注意的点
- ES对大数据量的聚合实现
- 并发时保证读写一致性
- 字典树
- ES的倒排索引
- Spring Data Elasticsearch
- 环境搭建
- 索引操作
- 文档操作