文章目录

  • 文档分析的过程
  • 测试分词器
  • 测试标准的分词器
  • 指定分析器
  • IK 分词器
  • IK 分词器扩展词汇
  • 自定义分析器


文档分析的过程

  1. 将文档分成适合于倒排索引的独立的词条.
  2. 将词条统一化为标准格式, 例如英语中去除时态

分析器执行上面的内容, 实际上是将上面的功能封装到了包里.
字符过滤器 : 将字符串按顺序通过每个字符过滤器, 在分词前整理字符串, 一个字符过滤器用来去掉html, 或者将 & 转化为 and
分词器: 字符串被分词器分为单个的词条, 一个简单的分词器遇到空格和标点符号的时候, 会将文本拆分为词条.
token 过滤器: 词条按顺序通过每个 token 过滤器. 可能会改变词条, 小写化, 删除无用词条, 增加同义词等.

es 内置的分析器:
标准分析器
简单分析器
空格分析器
语言分析器

分析器的使用场景 :
把文本进行拆解.
索引一个文档, 这个文档的全文域被分析成词条, 用以创建倒排索引,
搜索的时候, 把查询字符串通过相同的分析过程, 以保证搜索的词条格式与索引中的词条一致.

测试分词器

测试标准的分词器

启动windows 的es , 发送如下的get请求 :
http://localhost:9200/_analyze 请求体如下

{
 "analyzer": "standard",
 "text": "Text to analyze"
}

得到的响应如下. 可以看到被分成了一个一个单词.

{
    "tokens": [
        {
            "token": "text",
            "start_offset": 0,
            "end_offset": 4,
            "type": "<ALPHANUM>",
            "position": 0
        },
        {
            "token": "to",
            "start_offset": 5,
            "end_offset": 7,
            "type": "<ALPHANUM>",
            "position": 1
        },
        {
            "token": "analyze",
            "start_offset": 8,
            "end_offset": 15,
            "type": "<ALPHANUM>",
            "position": 2
        }
    ]
}

指定分析器

IK 分词器

如果使用默认的分词器, 使用中文, 那么就会是如下的效果.

把中文分成了一个一个的单字.

es7怎么配置密码 es7中文文档_大数据


采用 IK 中文分词器,下载地址为:

https://github.com/medcl/elasticsearch-analysis-ik/releases/tag/v7.8.0
解压后放到es 的pluins 目录下, 之后重新启动es

es7怎么配置密码 es7中文文档_big data_02


发送post请求, http://localhost:9200/_analyze , 请求体如下.

{
    "text":"测试单词",
    "analyzer":"ik_max_word"
}

结果可以看到对词语进行了分词

es7怎么配置密码 es7中文文档_大数据_03


ik_max_word : 最细粒度拆分

ik_smart: 最粗粒度的拆分

两种分词器的拆分区别如下. ik_max_word 拆分更为细致.

es7怎么配置密码 es7中文文档_big data_04


es7怎么配置密码 es7中文文档_分词器_05

IK 分词器扩展词汇

在ik分词器的目录下,

es7怎么配置密码 es7中文文档_es7怎么配置密码_06


新建custom.dic文件. 文件内容填写如下的词语

弗雷尔卓德在IKAnalyzer.cfg.xml 中进行修改. 设置扩展词汇的位置

es7怎么配置密码 es7中文文档_分词器_07


之后重启es, 对其进行测试

{

“text”:“弗雷尔卓德”,

“analyzer”:“ik_max_word”

}

结果如下, 成功对扩展词关联.

es7怎么配置密码 es7中文文档_big data_08

自定义分析器

自己设置字符过滤器, 分词器, 词汇单元过滤器, 来创建自定义的分析器.

使用put请求, 创建如下的索引, 知道分析器相关配置
http://localhost:9200/my_index 请求体如下 :

{
    "settings":{
        "analysis":{
            "char_filter":{
                "&_to_and":{
                    "type":"mapping",
                    "mappings":[
                        "&=> and "  // 把& 转化为 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"
                    ]
                }
            }
        }
    }
}

测试:

# GET http://127.0.0.1:9200/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
        }
    ]
}

可以看到 the 没有被分词, 因为它是停用词.
并且 & 变成了 and