ES分词器插件工作机制原理

什么是分词器插件?

        分词器是ES中提供对文本内容进行按语种进行分词的插件系统。不同的语言的文字分词规则是不一样的。而ES提供的插件机制就可以很好的集成各种语种的分词器。

分词器插件的作用?

        分词器主要作用是把文本拆成一个个最小粒度的单词然后给ES系统作为索引系统的词条使用。不同语种拆分单词规则也是不一样的。如:中国人民共和国 应该被拆分成:中国、中国人民、人民、共和国、人民共和国、中国人民共和国。而不能拆分成:中、国、人、民、共、和、国。被拆分后的词就可以作为索引词条来构建索引系统。这样就可以使用部分内容进行搜索了

分词器插件工作流程?

1、ES在启动过程中会读取plugins/分词器/plugin-descriptor.properties文档

2、读取配置文件并获取分词器插件的类信息并初始化(属性classname指向的类路径)

3、在分词器插件启动类必须继承AnalysisPlugin,这样ES可以调用我们自定义的类来获取分词器对象

4、在ES调用分词进行分词时会实例化analyzerProvider对象,该对象中有get()可以获取到我们自定义的Analyzer对象,同时内部tokenStream()方法会条用createComponents()方法实例化我们自定义的Tokenizer对象。

5、Tokenizer是自定义分词器的核心组件。核心方法有4个

    ① incrementToken():用来判断分词集合列表中是否还存在没读取的词条信息。以及设置term的基础属性如:长度,起始偏移量,结束偏移量,词条等

    ② reset():重置默认数据和加载自定义模型来处理用户输入的字符串数据并进行分词处理。加入到分词集合列表

    ③ end():设置当分词结束的偏移量信息

    ④ Close(): 销毁输入流对象和自定义的数据

6、Tokenizer对象每次完成一次用户输入文本的分词过程都会进行上述4步方法调用

分词器验证

1、可以下载一个ES程序包。只安装一个节点就可以验证

2、安装分词器

3、执行bin/elasticsearch启动ES

4、验证分词器

curl --location --request GET '172.16.80.24:9200/_analyze' \

--header 'Content-Type: application/json' \

--data-raw '{

  "analyzer": "stanford-core-nlp",

  "text": ["中国人民共和国"]

}'

5、新建索引
 

curl --location --request PUT '172.16.80.24:9200/zww-email-test1' \

--header 'Content-Type: application/json' \

--data-raw '{

    "mappings": {

        "default": {

            "properties": {

                "commonText": {

                    "properties": {

                        "cn": {

                            "type": "text",

                            "analyzer": "stanford-core-nlp"

                        }

                    }

                },

                "email": {

                    "type": "text",

                    "analyzer": "stanford-core-nlp",

                    "fields": {

                        "keyword": {

                            "type": "keyword",

                            "ignore_above": 256

                        }

                    }

                },

                "ip": {

                    "type": "text",

                    "fields": {

                        "keyword": {

                            "type": "keyword",

                            "ignore_above": 256

                        }

                    }

                },

                "phone": {

                    "type": "long"

                }

            }

        }

    }

}'

6、写入数据测试
 

curl --location --request PUT '172.16.80.24:9200/zww-email-test1/default/13' \

--header 'Content-Type: application/json' \

--data-raw '{

  "commonText.cn":"中华人民共和国",

  "email":"zhangweiwei@semptian.com",

  "phone":17605888987,

  "ip":"192.168.80.154"

}'

7、查询
 

curl --location --request GET '172.16.80.24:9200/zww-email-test1/_search' \

--header 'Content-Type: application/json' \

--data-raw '{

  "query": {

    "bool": {

      "must": [

        {

          "query_string": {

            "query": "人民"

          }

        }

      ]

    }

  }

}'
 

分词器插件Demo

https://gitee.com/xfbyxq/semptian-analyzer.git

遇到的坑
        使用语言模型在分词后要保证分出的词起始偏移量不能是-1,结尾偏移量>=起始偏移量, 多个词之间的起始偏移量要从小到大排序。不能出现后一个的起始偏移量比前面的起始偏移量小,否则是提示偏移量错误导致整个数据无法插入
  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

~轩辕三易~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值