您当前的位置: 首页 > 

java持续实践

暂无认证

  • 1浏览

    0关注

    746博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

es 7.x 进阶 文档分析

java持续实践 发布时间:2022-02-27 11:06:14 ,浏览量:1

文章目录
      • 文档分析的过程
      • 测试分词器
          • 测试标准的分词器
      • 指定分析器
        • 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": "",
            "position": 0
        },
        {
            "token": "to",
            "start_offset": 5,
            "end_offset": 7,
            "type": "",
            "position": 1
        },
        {
            "token": "analyze",
            "start_offset": 8,
            "end_offset": 15,
            "type": "",
            "position": 2
        }
    ]
}
指定分析器 IK 分词器

如果使用默认的分词器, 使用中文, 那么就会是如下的效果. 把中文分成了一个一个的单字. 在这里插入图片描述 采用 IK 中文分词器,下载地址为: https://github.com/medcl/elasticsearch-analysis-ik/releases/tag/v7.8.0 解压后放到es 的pluins 目录下, 之后重新启动es 在这里插入图片描述 发送post请求, http://localhost:9200/_analyze , 请求体如下.

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

结果可以看到对词语进行了分词 在这里插入图片描述 ik_max_word : 最细粒度拆分 ik_smart: 最粗粒度的拆分 两种分词器的拆分区别如下. ik_max_word 拆分更为细致. 在这里插入图片描述 在这里插入图片描述

IK 分词器扩展词汇

在ik分词器的目录下, 在这里插入图片描述 新建custom.dic文件. 文件内容填写如下的词语 弗雷尔卓德

IKAnalyzer.cfg.xml 中进行修改. 设置扩展词汇的位置 在这里插入图片描述 之后重启es, 对其进行测试 { “text”:“弗雷尔卓德”, “analyzer”:“ik_max_word” } 结果如下, 成功对扩展词关联. 在这里插入图片描述

自定义分析器

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

使用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": "",
            "position": 1
        },
        {
            "token": "and",
            "start_offset": 10,
            "end_offset": 11,
            "type": "",
            "position": 2
        },
        {
            "token": "brown",
            "start_offset": 12,
            "end_offset": 17,
            "type": "",
            "position": 3
        },
        {
            "token": "fox",
            "start_offset": 18,
            "end_offset": 21,
            "type": "",
            "position": 4
        }
    ]
}

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

关注
打赏
1658054974
查看更多评论
立即登录/注册

微信扫码登录

0.0431s