概述
在es中,可以对text字段进行分析,那么文本分析是什么意思?本文主要对该阶段的工作过程进行描述。
简单而言,文本分析发生在2个阶段:
- 建立索引
- 搜索阶段
建立索引时,分析的结果存到倒排索引中,其实这就是文档存在索引中的内容,便于后续的检索,搜索阶段和建立索引阶段分析过程是一样的。在搜索时候,本质上是对建立的倒排索引进行查询,而非文本本身。
分析器
一个分析器主要由3个部分构成:0个或多个字符过滤器、1个分词器、0个或多个分词过滤器。es已经提供一些官方的分析器,每个分析器包含对应的字符过滤器、分词器以及分词过滤器。另外,用户还可以根据自身需要定制化自己的分析器,这对搜索质量的提高极为重要。
- 字符过滤阶段
在该阶段可以对输入的字符流进行增删改操作,比如过滤些敏感词或者html的标签等字符。
例如
"<head>Hello, 深圳<head>" -> [Hello深圳]
常用的字符过滤器有:
类别 | 作用 |
---|---|
HTML Strip Character Filter | 去除html的标记,如head |
Mapping Character Filter | 将匹配到的字符串映射为指定的字符串 |
Pattern Replace Character Filter | 将正则匹配到的内容替换为指定字符串 |
- 分词阶段
一般而言,一个分析器中仅有一个分词器,该分词器会将字符串切分成多个分词(token),并记录分词的起始位置,方便后续的,高亮和模糊搜索操作。
_analyze
{
"tokenizer" : "standard"
"text" : "Hello深圳"
}
返回的结果如下:
{
"tokens" : [
{
"token" : "hello",
"start_offset" : 0,
"end_offset" : 5,
"type" : <ALPHANUM>,
"position": 0
}
...
]
}
常见的分词器有:
类别 | 作用 |
---|---|
Standard Tokenizer | 去除些表点符号,适用于大部分语言 |
Lowercase Tokenizer | 非字母时分割文本 |
... | … |
- 分词过滤
该阶段和字符过滤类似,只是该阶段的输入是分词输入流进行转换操作(增删改),而非字符输入流。常见的有去掉停用词、增加同义词等。
_analyze
{
"tokenizer" : "standard"
"text" : "Hello深圳"
}
常见的分词过滤器有:
类别 | 作用 |
---|---|
Length Token Filter | 过滤太长或太短的分词 |
Standard Tokenizer | 不做处理,占坑的 |
... | … |
总结
在调试搜索问题时(如搜索不到文档),经常需要根据分析器的工作原理进行定位,如根据_analyze接口,配备对应的参数来逐步锁定问题。
网友评论