zoukankan      html  css  js  c++  java
  • elasticsearch ik分词

    elasticsearch 默认并不支持中文分词,默认将每个中文字切分为一个词,这明显不符合我们的业务要求。这里就需要用到ik分词插件。
    本文主要囊括了以下几部分,ik插件安装、ik用法介绍、自定义词典使用


    ik插件安装

    1. 查找并下载对应elasticsearch版本的ik,解压
    2. 编写Dockerfile
    3. 运行测试 $docker-compose up -d

    新增ik插件功能配置实际上非常简单,仅需将解压后的elasticsearch-analysis-ik文件放置到es/plugins路径下即可。本文使用dockerfile来实现

    Dockerfile

    FROM docker.elastic.co/elasticsearch/elasticsearch:7.1.1
    ADD elasticsearch-analysis-ik-7.1.1 /usr/share/elasticsearch/plugins/elasticsearch-analysis-ik-7.1.1
    

    ik用法介绍

    1. ik_max_word: 会将文本做最细粒度的拆分,比如会将"中华人民共和国国歌"拆分为"中华人民共和国,中华人民,中华,华人,人民共和国,人民,人,民,共和国,共和,和,国国,国歌",会穷尽各种可能的组合;
    2. ik_smart: 会做最粗粒度的拆分,比如会将"中华人民共和国国歌"拆分为"中华人民共和国,国歌"。
      创建articles索引,设置mappings
    PUT /articles/
    {
        "settings":{
            "number_of_shards":5,
            "number_of_replicas":1
        },
        "mappings":{
                "properties":{
                    "title":{
                        "type":"text",
                        "analyzer":"ik_smart",
                        "search_analyzer":"ik_smart"
                    },
                    "info":{
                        "type":"text",
                        "analyzer":"ik_smart",
                        "search_analyzer":"ik_smart"
                    }
                }
        }
    }
    

    插入数据后,查看分词结果

    GET /${index}/${type}/${id}/_termvectors?fields=${fields_name} # 查看分词结果
    

    返回的结果

    "价值": {
              "term_freq": 1, # 词频
              "tokens": [
                {
                  "position": 14, # 位置
                  "start_offset": 22, # 启始位置
                  "end_offset": 24 # 结束位置
                }
              ]
            },
    

    自定义词典使用

    配置文件在es/plugins/ik/config目录下

    IKAnalyzer.cfg.xml:用来配置自定义词库
    main.dic:ik原生内置的中文词库,总共有27万多条,只要是这些单词,都会被分在一起
    quantifier.dic:放了一些单位相关的词
    suffix.dic:放了一些后缀
    surname.dic:中国的姓氏
    stopword.dic:英文停用词
    
    # ik原生最重要i的两个配置文件
    main.dic:包含了原生的中文词语,会按照这个里面的词语去分词
    stopword.dic:包含了英文的停用词
    

    一般像停用词,会在分词的时候,直接被干掉,不会建立在倒排索引中

    本地文件扩展词典

    1. 在该目录下新建mydict.dic文件
    2. 修改IKAnalyzer.cfg.xml配置文件文件
    3. 重启elasticsearch即可
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
    <properties>
    	<comment>IK Analyzer 扩展配置</comment>
    	<!--用户可以在这里配置自己的扩展字典 -->
    	<entry key="ext_dict">mydict.dic</entry>
    	 <!--用户可以在这里配置自己的扩展停止词字典-->
    	<entry key="ext_stopwords"></entry>
    	<!--用户可以在这里配置远程扩展字典 -->
    	<!-- <entry key="remote_ext_dict">words_location</entry> -->
    	<!--用户可以在这里配置远程扩展停止词字典-->
    	<!-- <entry key="remote_ext_stopwords">words_location</entry> -->
    </properties>
    

    远程扩展词典【生产环境下更方便】

    1. nginx部署一个mydict.dic的静态文件即可

    ik每分钟获取一次,优势在于无需重启elasticsearch

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
    <properties>
    	<comment>IK Analyzer 扩展配置</comment>
    	<!--用户可以在这里配置自己的扩展字典 -->
    	<entry key="ext_dict"></entry>
    	 <!--用户可以在这里配置自己的扩展停止词字典-->
    	<entry key="ext_stopwords"></entry>
    	<!--用户可以在这里配置远程扩展字典 -->
    	<entry key="remote_ext_dict">http://192.168.1.1/static/txt/mydict.dic</entry>
    	<!--用户可以在这里配置远程扩展停止词字典-->
    	<!-- <entry key="remote_ext_stopwords">words_location</entry> -->
    </properties>
    
    
  • 相关阅读:
    【HDU3032】Nim or not Nim?(博弈论)
    【BZOJ1022】小约翰的游戏(博弈论)
    【HDU1848】Fibonacci again and again(博弈论)
    【POJ1704】Georgia and Bob(博弈论)
    【BZOJ1299】巧克力棒(博弈论,线性基)
    【Luogu2197】NIM游戏(博弈论)
    【洛谷2252&HDU1527】取石子游戏(博弈论)
    【HDU1846】Brave Game(博弈论)
    【CF888G】Xor-MST(最小生成树,Trie树)
    长链剖分学习笔记
  • 原文地址:https://www.cnblogs.com/zenan/p/11008488.html
Copyright © 2011-2022 走看看