精华内容
下载资源
问答
  • es中文分词器ik

    2018-04-14 18:23:59
    es中文分词器ikes中文分词器ikes中文分词器ikes中文分词器ikes中文分词器ik
  • 因为es本身的分词器中文不是特别友好,所以使用ik分词器,分为 两种 模式,一种是粗 模式,一种是细模式,还希望能帮助到刚刚接触的人
  • es中文分词器ik的安装

    千次阅读 2018-04-10 10:20:13
    首先下载相应的版本的ik分词器安装包,下载路径ik分词器下载解压到ik文件夹下把ik文件夹放到es的plugins目录下,重启es测试输入curl -XGET 'http://localhost:9200/_analyze?pretty&analyzer=ik_max_word' -...

    首先下载相应的版本的ik分词器安装包,下载路径ik分词器下载

    解压到ik文件夹下

    把ik文件夹放到es的plugins目录下,重启es测试

    输入curl -XGET 'http://localhost:9200/_analyze?pretty&analyzer=ik_max_word' -d '联想是全球最大的笔记本厂商

    返回结果

    {
      "tokens" : [
        {
          "token" : "联想",
          "start_offset" : 0,
          "end_offset" : 2,
          "type" : "CN_WORD",
          "position" : 0
        },
        {
          "token" : "是",
          "start_offset" : 2,
          "end_offset" : 3,
          "type" : "CN_CHAR",
          "position" : 1
        },
        {
          "token" : "全球",
          "start_offset" : 3,
          "end_offset" : 5,
          "type" : "CN_WORD",
          "position" : 2
        },
        {
          "token" : "最大",
          "start_offset" : 5,
          "end_offset" : 7,
          "type" : "CN_WORD",
          "position" : 3
        },
        {
          "token" : "的",
          "start_offset" : 7,
          "end_offset" : 8,
          "type" : "CN_CHAR",
          "position" : 4
        },
        {
          "token" : "笔记本",
          "start_offset" : 8,
          "end_offset" : 11,
          "type" : "CN_WORD",
          "position" : 5
        },
        {
          "token" : "笔记",
          "start_offset" : 8,
          "end_offset" : 10,
          "type" : "CN_WORD",
          "position" : 6
        },
        {
          "token" : "本厂",
          "start_offset" : 10,
          "end_offset" : 12,
          "type" : "CN_WORD",
          "position" : 7
        },
        {
          "token" : "厂商",
          "start_offset" : 11,
          "end_offset" : 13,
          "type" : "CN_WORD",
          "position" : 8
        }
      ]

    }


    ik分词器安装成功

    展开全文
  • 简介 IK Analyzer是一个开源的,基于Java语言开发的轻量级的中文分词工具包; 最初,它是以开源项目Luence 为应用主体的,结合词典分词和...本篇就介绍如何给ES安装插件,以及使用ik中文分词器进行搜索,最后介绍一下

    简介

    1. IK Analyzer是一个开源的,基于Java语言开发的轻量级的中文分词工具包;
    2. 最初,它是以开源项目Luence 为应用主体的,结合词典分词和文法分析算法的中文分词组件;从 3.0 版本开始,IK 发展为面向 Java 的公用分词组件,独立亍 Lucene 项目,同时提供了对 Lucene 的默认优化实现。在 2012 版本中,IK 实现了简单的分词歧义排除算法,标志着 IK 分词器从单纯的词典分词向模拟语义分词衍化;

    本篇就介绍如何给ES安装插件,以及使用ik中文分词器进行搜索,最后介绍一下如何热加载自定义词库。

    ELK系列(一)、安装ElasticSearch+Logstash+Kibana+Filebeat-v7.7.0

    ELK系列(二)、在Kibana中使用RESTful操作ES库

    ELK系列(三)、安装Logstash插件及打包离线安装包

    ELK系列(四)、Logstash读取nginx日志写入ES中

    ELK系列(五)、Logstash修改@timestamp时间为日志的产生时间

    ELK系列(六)、修改Nginx日志为Json格式并使用Logstash导入至ES

    ELK系列(七)、Filebeat+Logstash采集多个日志文件并写入不同的ES索引中

    ELK系列(八)、使用Filebeat+Redis+Logstash收集日志数据

    ELK系列(九)、配置ES和Kibana的用户密码

    ---------------------------------------ES中文分词器ik-----------------------------------------

    安装

    下载

    https://github.com/medcl/elasticsearch-analysis-ik

    https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.7.0/elasticsearch-analysis-ik-7.7.0.zip

    我使用的es7.7.0,所以我下载ik7.7.0,版本和es一一对应的。

    安装

    传到服务器上执行下面的命令解压:

    mkdir ik
    
    mv elasticsearch-analysis-ik-7.7.0.zip ik/
    
    cd ik
    
    unzip elasticsearch-analysis-ik-7.7.0.zip
    rm -rf elasticsearch-analysis-ik-7.7.0.zip

     然后将该目录移动到$ES_HOME/plugins目录下,重启ES即可:

    mv ik /opt/app/elasticsearch-7.7.0/plugins/
    sudo -u elk nohup $ES_HOME/bin/elasticsearch >> $ES_HOME/output.log 2>&1 &
    

    使用

    建索引

    在ES中建索引以及mapping:

    #建索引
    PUT /csdn
    
    #建mapping
    POST /csdn/_mapping
    {
      "properties": {
        "content":{
          "type": "text", 
          "analyzer": "ik_max_word",
          "search_analyzer": "ik_max_word"
        }
      }
    }
    
    #查看mapping
    GET /csdn/_mapping
    
    
    #建没有使用分词器的索引对比
    PUT /wyk

    造数据

    例子:同时往csdnwyk两个索引中插入同样的数据

    POST /csdn/_doc/1
    {
      "content":"特朗普暴打川普"
    }
    
    POST /csdn/_doc/2
    {
      "content":"特朗普和本拉登的爱恨情仇"
    }
    
    POST /csdn/_doc/3
    {
      "content":"美国白宫里有头猪会说普通的english"
    }
    
    POST /csdn/_doc/4
    {
      "content":"川普!=川建国"
    }
    
    POST /wyk/_doc/1
    {
      "content":"特朗普暴打川普"
    }
    
    POST /wyk/_doc/2
    {
      "content":"特朗普和本拉登的爱恨情仇"
    }
    
    POST /wyk/_doc/3
    {
      "content":"美国白宫里有头猪会说普通的english"
    }
    
    POST /wyk/_doc/4
    {
      "content":"川普!=川建国"
    }

    查询

    使用命令查看分词的效果,三种模式:

    如,查看"中华人民共和国" 在ik分词下的效果和默认情况的效果:

    #ik分词 max模式 "细粒度"
    GET /csdn/_analyze
    {
      "text":"普通的",
      "tokenizer": "ik_max_word"
    }
    
    #ik分词 smart模式 "粗粒度"
    GET /csdn/_analyze
    {
      "text":"普通的",
      "tokenizer": "ik_smart"
    }
    
    #ES默认,中文每个字符一个词
    GET /csdn/_analyze
    {
      "text":"普通的",
      "tokenizer": "standard"
    }

     

    然后我们查询上面造的数据中包含"普通的"关键字的数据,如下图所示,可以看到,因为wyk索引下没有使用ik分词,因此只要数据中有"普","通","的" 三个字符之一的结果都会展示出来,而在索引csdn因为用了ik分词,ik分词下"普通的"会被分为"普通""的",因此只有包含了"普通"或"的"的结果才会显示:

    GET /csdn/_doc/_search
    {
      "query": {
        "match": {
          "content": "普通的"
        }
      }
    }
    
    
    GET /wyk/_doc/_search
    {
      "query": {
        "match": {
          "content": "普通的"
        }
      }
    }

    查询高亮

    很多时候我们在百度,或者CSDN进行搜索的时候,返回给我们的结果会把我们的查询关键字高亮显示,很直观的就可以看到自己想要的信息,像下面这样的查询结果高亮显示,使用ik可以很方便的将匹配到的结果加上标签返回,对前端开发很友好,我们也可以根据标签的位置看出分词的效果:

    GET /csdn/_doc/_search
    {
      "query": {
        "match": {
          "content": "普通的"
        }
      },
      "highlight": {
        "pre_tags" : ["<strong>", "<tag2>"],
            "post_tags" : ["</strong>", "</tag2>"],
            "fields" : {
                "content" : {}
            }
      }
    }

    自定义词库

    业务词汇或者是人名或者是新出来的网络词汇,在分词器中都无法正确的识别,我们可以自己为IK分词器扩展词库,这里演示如何使用nginx上的远程静态文件来配置词汇:

    准备工作

    在nginx服务器上准备一个.txt文件,必须是utf-8编码:

    配置

    修改ik分词库的配置文件:

    vim /opt/app/elasticsearch-7.7.0/plugins/ik/config/IKAnalyzer.cfg.xml

    <!--修改这一行即可,指向自己的远程静态文件-->
    <entry key="remote_ext_dict">http://wykd/wyk/csdn_dict.txt</entry> 

    重启ES

    修改了插件配置之后需要重启,如果之后对远程的词库.txt文件修改就不需要再重启ES了,该插件支持热更新分词。

    #jps查看es进程杀掉ES
    kill -9 xxxx
    
    #启动
    sudo -u elk nohup $ES_HOME/bin/elasticsearch >> $ES_HOME/output.log 2>&1 &

    验证

    如上图,我在词库里加了一个"王义凯"的单词,在使用ik分词分析的时候会当成一个词,而默认的分词只会当做三个字去处理:

    测试扩展词库的分词效果:

    POST /csdn/_doc/1
    {
      "content":"正义不会缺席"
    }
    
    POST /csdn/_doc/2
    {
      "content":"国王的新衣"
    }
    
    POST /csdn/_doc/3
    {
      "content":"等待你们的凯旋而归"
    }
    
    POST /csdn/_doc/4
    {
      "content":"这是王义凯的博客"
    }
    
    POST /wyk/_doc/1
    {
      "content":"正义不会缺席"
    }
    
    POST /wyk/_doc/2
    {
      "content":"国王的新衣"
    }
    
    POST /wyk/_doc/3
    {
      "content":"等待你们的凯旋而归"
    }
    
    POST /wyk/_doc/4
    {
      "content":"这是王义凯的博客"
    }

     

    ----------------------

    Q:ik_max_word 和 ik_smart 什么区别?

    A:ik_max_word: 会将文本做最细粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,中华人民,中华,华人,人民共和国,人民,人,民,共和国,共和,和,国国,国歌”,会穷尽各种可能的组合,适合 Term Query;

    ik_smart: 会做最粗粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,国歌”,适合 Phrase 查询。

     

    希望本文对你有帮助,请点个赞鼓励一下作者吧~ 谢谢!

    展开全文
  • IK分词器安装 1、环境准备 Elasticsearch 要使用 ik,就要先构建 ik 的 jar包,这里要用到 maven 包管理工具,而 maven 需要java 环境,而 Elasticsearch 内置了jdk, 所以可以将JAVA_HOME设置为Elasticsearch 内置...

    IK分词器安装

    1、环境准备

    Elasticsearch 要使用 ik,就要先构建 ik 的 jar包,这里要用到 maven 包管理工具,而 maven 需要java 环境,而 Elasticsearch 内置了jdk, 所以可以将JAVA_HOME设置为Elasticsearch 内置的jdk

    1)设置JAVA_HOME

    vim /etc/profile
    # 在profile文件末尾添加
    #java environment
    export JAVA_HOME=/opt/elasticsearch-7.4.0/jdk
    export PATH=$PATH:${JAVA_HOME}/bin
    
    # 保存退出后,重新加载profile
    source /etc/profile
    
    

    2)下载maven安装包

    wget http://mirror.cc.columbia.edu/pub/software/apache/maven/maven-3/3.1.1/binaries/apache-maven-3.1.1-bin.tar.gz  
    

    3)解压maven安装包

    tar xzf apache-maven-3.1.1-bin.tar.gz 
    

    4)设置软连接

    ln -s apache-maven-3.1.1 maven 
    

    5)设置path

    打开文件

     vim  /etc/profile.d/maven.sh
    

    将下面的内容复制到文件,保存

    export MAVEN_HOME=/opt/maven  
    export PATH=${MAVEN_HOME}/bin:${PATH} 
    

    设置好Maven的路径之后,需要运行下面的命令使其生效

    source /etc/profile.d/maven.sh
    

    6)验证maven是否安装成功

    mvn -v
    

    2、安装IK分词器

    1)下载IK

    wget https://github.com/medcl/elasticsearch-analysis-ik/archive/v7.4.0.zip
    

    执行如下图:

    2)解压IK

    由于这里是zip包不是gz包,所以我们需要使用unzip命令进行解压,如果本机环境没有安装unzip,请执行:

    yum install zip 
    yum install unzip
    

    解压IK

    unzip v7.4.0.zip
    

    3)编译jar包

    # 切换到 elasticsearch-analysis-ik-7.4.0目录
    cd elasticsearch-analysis-ik-7.4.0/
    #打包
    mvn package
    

    4) jar包移动

    package执行完毕后会在当前目录下生成target/releases目录,将其中的elasticsearch-analysis-ik-7.4.0.zip。拷贝到elasticsearch目录下的新建的目录plugins/analysis-ik,并解压

    #切换目录
    cd /opt/elasticsearch-7.4.0/plugins/
    #新建目录
    mkdir analysis-ik
    cd analysis-ik
    #执行拷贝
    cp -R /opt/elasticsearch-analysis-ik-7.4.0/target/releases/elasticsearch-analysis-ik-7.4.0.zip      /opt/elasticsearch-7.4.0/plugins/analysis-ik
    #执行解压
    unzip  /opt/elasticsearch-7.4.0/plugins/analysis-ik/elasticsearch-analysis-ik-7.4.0.zip
    

    5)拷贝辞典

    将elasticsearch-analysis-ik-7.4.0目录下的config目录中的所有文件 拷贝到elasticsearch的config目录

    cp -R /opt/elasticsearch-analysis-ik-7.4.0/config/*   /opt/elasticsearch-7.4.0/config
    

    记得一定要重启Elasticsearch!!!

    3、使用IK分词器

    IK分词器有两种分词模式:ik_max_word和ik_smart模式。

    1、ik_max_word

    会将文本做最细粒度的拆分,比如会将“乒乓球明年总冠军”拆分为“乒乓球、乒乓、球、明年、总冠军、冠军。

    #方式一ik_max_word
    GET /_analyze
    {
      "analyzer": "ik_max_word",
      "text": "乒乓球明年总冠军"
    }
    

    ik_max_word分词器执行如下:

    {
      "tokens" : [
        {
          "token" : "乒乓球",
          "start_offset" : 0,
          "end_offset" : 3,
          "type" : "CN_WORD",
          "position" : 0
        },
        {
          "token" : "乒乓",
          "start_offset" : 0,
          "end_offset" : 2,
          "type" : "CN_WORD",
          "position" : 1
        },
        {
          "token" : "球",
          "start_offset" : 2,
          "end_offset" : 3,
          "type" : "CN_CHAR",
          "position" : 2
        },
        {
          "token" : "明年",
          "start_offset" : 3,
          "end_offset" : 5,
          "type" : "CN_WORD",
          "position" : 3
        },
        {
          "token" : "总冠军",
          "start_offset" : 5,
          "end_offset" : 8,
          "type" : "CN_WORD",
          "position" : 4
        },
        {
          "token" : "冠军",
          "start_offset" : 6,
          "end_offset" : 8,
          "type" : "CN_WORD",
          "position" : 5
        }
      ]
    }
    
    

    2、ik_smart
    会做最粗粒度的拆分,比如会将“乒乓球明年总冠军”拆分为乒乓球、明年、总冠军。

    #方式二ik_smart
    GET /_analyze
    {
      "analyzer": "ik_smart",
      "text": "乒乓球明年总冠军"
    }
    

    ik_smart分词器执行如下:

    {
      "tokens" : [
        {
          "token" : "乒乓球",
          "start_offset" : 0,
          "end_offset" : 3,
          "type" : "CN_WORD",
          "position" : 0
        },
        {
          "token" : "明年",
          "start_offset" : 3,
          "end_offset" : 5,
          "type" : "CN_WORD",
          "position" : 1
        },
        {
          "token" : "总冠军",
          "start_offset" : 5,
          "end_offset" : 8,
          "type" : "CN_WORD",
          "position" : 2
        }
      ]
    }
    
    

    由此可见 使用ik_smart可以将文本"text": "乒乓球明年总冠军"分成了【乒乓球】【明年】【总冠军】

    这样看的话,这样的分词效果达到了我们的要求。

    展开全文
  • 2、除此之外,有时候感叹语言的博大精深,一种东西有许多种叫法,就从英文来说,monther,mum dady father 这种同义词,其实我们是期望用户不管是输入的哪个叫法,我们都可以给它匹配到,这,也就是分词器会做的一...

    什么是分词?

    分词就是指将一个文本转化成一系列单词的过程,也叫文本分析,在Elasticsearch中称之为Analysis。
    举例:我是中国人 --> 我/是/中国人

    什么是分词器?

    1、顾名思义,分词器就是用来分词的(好像废话。
    2、除此之外,有时候感叹语言的博大精深,一种东西有许多种叫法,就从英文来说,monther,mum dady father 这种同义词,其实我们是期望用户不管是输入的哪个叫法,我们都可以给它匹配到,这,也就是分词器会做的一部分的工作,也就是语义同化,整体就是为了提高召回率,也就是能搜素到的结果的比率。

    ES中的分析器

    实际上,在es中是有分析器这么一个存在的,它除了有分词器,还需要有一些预处理,语义同化等的这些的协调的角色。
    它主要分成三部分:

    1、character filter(mapping)

    分词之前预处理(过滤无用字符、标签等,转换一些&=>and 《Elasticsearch》=> Elasticsearch

    1、 HTML Strip Character Filter:html_strip 剔除html标签
    参数:escaped_tags 需要保留的html标签

    PUT my_index
    {
      "settings": {
        "analysis": {
          "char_filter": {
            "my_char_filter": {
              "type": "html_strip", //去除标签
              "escaped_tags": ["a"] //要保留的标签
            }
          },
          "analyzer": {
            "my_analyzer": {
              "tokenizer": "keyword",
              "char_filter": ["my_char_filter"]
            }
          }
        }
      }
    }
    POST my_index/_analyze
    {
      "analyzer": "my_analyzer",
      "text": "<p>I'm so <a>happy</a>!</p>"
    }
    

    2、 Mapping Character Filter:type mapping 将映射内容替换成对应的内容

    PUT my_index
    {
      "settings": {
        "analysis": {
          "analyzer": {
            "my_analyzer": {
              "tokenizer": "keyword",
              "char_filter": [
                "my_char_filter"
              ]
            }
          },
          "char_filter": {
            "my_char_filter": {
              "type": "mapping",
              "mappings": [
                "٠ => 0",
                "١ => 1",
                "٢ => 2",
                "٣ => 3",
                "٤ => 4",
                "٥ => 5",
                "٦ => 6",
                "٧ => 7",
                "٨ => 8",
                "٩ => 9"
              ]
            }
          }
        }
      }
    }
    POST my_index/_analyze
    {
      "analyzer": "my_analyzer",
      "text": "My license plate is ٢٥٠١٥"
    }
    效果:My license plate is 25015
    

    3、Pattern Replace Character Filter:type pattern_replace 将正则匹配的内容进行替换

    PUT my_index
    {
      "settings": {
        "analysis": {
          "analyzer": {
            "my_analyzer": {
              "tokenizer": "standard",
              "char_filter": ["my_char_filter"]
            }
          },
          "char_filter": {
            "my_char_filter": {
              "type": "pattern_replace",
              "pattern": "(\\d+)-(?=\\d)",
              "replacement": "$1_"
            }
          }
        }
      }
    }
    POST my_index/_analyze
    {
      "analyzer": "my_analyzer",
      "text": "My credit card is 123-456-789"
    }
    效果: My credit card is 123_456_789
    

    2、token filter

    停用词、时态转换、大小写转换、同义词转换、语气词处理等。
    比如:has=>have him=>he apples=>apple 去除无用谓词:the/oh/a

    统一小写转换 lowercase token filter

    GET _analyze
    {
      "tokenizer" : "standard",
      "filter" : ["lowercase"],
      "text" : "THE Quick FoX JUMPs"
    }
    

    对分词后term小于5的进行小写转换:

    GET /_analyze
    {
      "tokenizer": "standard",
      "filter": [
        {
          "type": "condition",
          "filter": [ "lowercase" ],
          "script": {
            "source": "token.getTerm().length() < 5"
          }
        }
      ],
      "text": "THE QUICK BROWN FOX"
    }
    

    停用词 stopwords token filter

    PUT /my_index
    {
      "settings": {
        "analysis": {
          "analyzer": {
            "my_analyzer":{
              "type":"standard",
              "stopwords":"_english_" //对英语中的谓词进行停用
            }
          }
        }
      }
    }
    GET my_index/_analyze
    {
      "analyzer": "my_analyzer",
      "text": "Teacher Ma is in the restroom"
    }
    
    PUT /my_index6
    {
      "settings": {
        "analysis": {
          "analyzer": {
            "my_analyzer":{
              "type":"standard",
              "stopwords":[ "restroom","is" //restroom,is进行停用
                ]
            }
          }
        }
      }
    }
    GET my_index6/_analyze
    {
      "analyzer": "my_analyzer",
      "text": "Teacher Ma is in the restroom"
    }
    

    3、tokenizer(分词器)

    主要进行分词。
    在ES7.6中,内置了15种分词器。
    列举4种:
    ① standard analyzer:默认分词器,中文支持的不理想,会逐字拆分。(一般来说,要么使用中文ik分词器,要么就使用这个默认的)
    1) max_token_length:最大令牌长度。如果看到令牌超过此长度,则将其max_token_length间隔分割。默认为255。

    GET /my_index/_analyze
    {
      "text": "江山如此多娇,小姐姐哪里可以撩",
      "analyzer": "standard"
    }
    

    ② Pattern Tokenizer:以正则匹配分隔符,把文本拆分成若干词项。
    ③ Simple Pattern Tokenizer:以正则匹配词项,速度比Pattern Tokenizer快。
    ④ whitespace analyzer:以空白符分隔 Tim_cookie

    自定义分析器

    经过上面的介绍,我们知道了一个分析器大致由三个部分组成,我们来将每一个都进行自定义,然后组成一个分析器:

    PUT /test_analysis
    {
      "settings": {
        "analysis": {
          "char_filter": {
            "test_char_filter": {
              "type": "mapping",
              "mappings": [
                "& => and",
                "| => or"
              ]
            }
          },
          "filter": {
            "test_stopwords": {
              "type": "stop",
              "stopwords": ["is","in","at","the","a","for"]
            }
          },
          "tokenizer": {
            //根据标点符号正则进行切分词  
            "punctuation": { 
              "type": "pattern",
              "pattern": "[ .,!?]"
            }
          },
          "analyzer": {
            "my_analyzer": {
           //设置type为custom告诉Elasticsearch我们正在定义一个定制分析器。将此与配置内置分析器的方式进行比较: type将设置为内置分析器的名称,如 standard或simple
              "type": "custom", 
              "char_filter": [
                "html_strip",
                "test_char_filter"
              ],
              "tokenizer": "punctuation",
              "filter": ["lowercase","test_stopwords"]
            }
          }
        }
      }
    }
    
    GET /test_analysis/_analyze
    {
      "text": "Teacher ma & zhang also thinks [mother's friends] is good | nice!!!",
      "analyzer": "my_analyzer"
    }
    

    分词api

    指定standard分词器,然后对英文内容进行分词

    GET/_analyze
    {
      "analyzer":"standard",
      "text":"hello world"
    }
    

    结果:

    {
      "tokens" : [
        {
          "token" : "hello",
          "start_offset" : 0,
          "end_offset" : 5,
          "type" : "<ALPHANUM>",
          "position" : 0
        },
        {
          "token" : "world",
          "start_offset" : 6,
          "end_offset" : 11,
          "type" : "<ALPHANUM>",
          "position" : 1
        }
      ]
    }
    

    接下来对中文内容进行分词:

    GET/_analyze
    {
      "analyzer":"standard",
      "text":"我是中国人"
    }
    
    {
      "tokens" : [
        {
          "token" : "我",
          "start_offset" : 0,
          "end_offset" : 1,
          "type" : "<IDEOGRAPHIC>",
          "position" : 0
        },
        {
          "token" : "是",
          "start_offset" : 1,
          "end_offset" : 2,
          "type" : "<IDEOGRAPHIC>",
          "position" : 1
        },
        {
          "token" : "中",
          "start_offset" : 2,
          "end_offset" : 3,
          "type" : "<IDEOGRAPHIC>",
          "position" : 2
        },
        {
          "token" : "国",
          "start_offset" : 3,
          "end_offset" : 4,
          "type" : "<IDEOGRAPHIC>",
          "position" : 3
        },
        {
          "token" : "人",
          "start_offset" : 4,
          "end_offset" : 5,
          "type" : "<IDEOGRAPHIC>",
          "position" : 4
        }
      ]
    }
    

    发现这个中文的分词效果可能并不是我们想要的。

    中文分词

    中文分词的难点在于,在汉语中没有明显的词汇分界点,如在英语中,空格可以作为分隔符,如果分隔不正确就会造
    成歧义。
    如:
    我/爱/炒肉丝
    我/爱/炒/肉丝
    常用中文分词器,IK、jieba、THULAC等,推荐使用IK分词器。

    IK Analyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。从2006年12月推出1.0版开始,
    IKAnalyzer已经推出了3个大版本。最初,它是以开源项目Luence为应用主体的,结合词典分词和文法分析算
    法的中文分词组件。新版本的IK Analyzer 3.0则发展为面向Java的公用分词组件,独立于Lucene项目,同时提
    供了对Lucene的默认优化实现。 采用了特有的“正向迭代最细粒度切分算法“,具有80万字/秒的高速处理能力 采用了多子处理器分析模式,支
    持:英文字母(IP地址、Email、URL)、数字(日期,常用中文数量词,罗马数字,科学计数法),中文词汇 (姓名、地名处理)等分词处理。
    优化的词典存储,更小的内存占用。

    IK分词器 Elasticsearch插件地址:https://github.com/medcl/elasticsearch-analysis-ik

    #安装方法:将下载到的elasticsearch-analysis-ik-7.6.2.zip解压到/elasticsearch/plugins/ik目录下即可。
    mkdir es/plugins/ik
    cp elasticsearch-analysis-ik-7.6.2.zip ./es/plugins/ik
    #解压
    unzip elasticsearch-analysis-ik-6.5.4.zip
    #重启es
    ./bin/elasticsearch
    

    测试分词效果

    ik分词有2个粒度:
    1、ik_max_word:细粒度
    2、ik_smart:粗粒度

    ik_max_word(常用)

    POST /_analyze
    {
    "analyzer": "ik_max_word",
    "text": "我是中国人"
    }
    
    {
      "tokens" : [
        {
          "token" : "我",
          "start_offset" : 0,
          "end_offset" : 1,
          "type" : "CN_CHAR",
          "position" : 0
        },
        {
          "token" : "是",
          "start_offset" : 1,
          "end_offset" : 2,
          "type" : "CN_CHAR",
          "position" : 1
        },
        {
          "token" : "中国人",
          "start_offset" : 2,
          "end_offset" : 5,
          "type" : "CN_WORD",
          "position" : 2
        },
        {
          "token" : "中国",
          "start_offset" : 2,
          "end_offset" : 4,
          "type" : "CN_WORD",
          "position" : 3
        },
        {
          "token" : "国人",
          "start_offset" : 3,
          "end_offset" : 5,
          "type" : "CN_WORD",
          "position" : 4
        }
      ]
    }
    

    ik_smart

    POST /_analyze
    {
    "analyzer": "ik_smart",
    "text": "我是中国人"
    }
    
    {
      "tokens" : [
        {
          "token" : "我",
          "start_offset" : 0,
          "end_offset" : 1,
          "type" : "CN_CHAR",
          "position" : 0
        },
        {
          "token" : "是",
          "start_offset" : 1,
          "end_offset" : 2,
          "type" : "CN_CHAR",
          "position" : 1
        },
        {
          "token" : "中国人",
          "start_offset" : 2,
          "end_offset" : 5,
          "type" : "CN_WORD",
          "position" : 2
        }
      ]
    }
    

    可以看到,分词效果还不错。

    验证中文分词下的全文检索效果

    创建itcast2索引,并指定hobby字段使用ik分词器:

    PUT /itcast2
    {
      "settings": {
        "index": {
          "number_of_shards": "1",
          "number_of_replicas": "0"
        }
      },
      "mappings": {
      
          "properties": {
            "name": {
              "type": "text"
            },
            "age": {
              "type": "integer"
            },
            "mail": {
              "type": "keyword"
            },
            "hobby": {
              "type": "text",
              "analyzer": "ik_max_word"
            }
          
        }
      }
    }
    

    批量插入数据:

    POST /itcast2/_bulk
    {"index":{"_index":"itcast2"}}
    {"name":"张三","age": 20,"mail": "111@qq.com","hobby":"羽毛球、乒乓球、足球"}
    {"index":{"_index":"itcast2"}}
    {"name":"李四","age": 21,"mail": "222@qq.com","hobby":"羽毛球、乒乓球、足球、篮球"}
    {"index":{"_index":"itcast2"}}
    {"name":"王五","age": 22,"mail": "333@qq.com","hobby":"羽毛球、篮球、游泳、听音乐"}
    {"index":{"_index":"itcast2"}}
    {"name":"赵六","age": 23,"mail": "444@qq.com","hobby":"跑步、游泳、篮球"}
    {"index":{"_index":"itcast2"}}
    {"name":"孙七","age": 24,"mail": "555@qq.com","hobby":"听音乐、看电影、羽毛球"}
    

    先看“羽毛球”的分词:

    POST /_analyze
    {
    "analyzer": "ik_max_word",
    "text": "羽毛球"
    }
    

    结果:

    {
      "tokens" : [
        {
          "token" : "羽毛球",
          "start_offset" : 0,
          "end_offset" : 3,
          "type" : "CN_WORD",
          "position" : 0
        },
        {
          "token" : "羽毛",
          "start_offset" : 0,
          "end_offset" : 2,
          "type" : "CN_WORD",
          "position" : 1
        },
        {
          "token" : "球",
          "start_offset" : 2,
          "end_offset" : 3,
          "type" : "CN_CHAR",
          "position" : 2
        }
      ]
    }
    

    然后全文检索hobby中的“羽毛球”

    GET /itcast2/_search
    {
      "query": {
        "match": {
          "hobby": "羽毛球"
        }
      },
      "highlight": {
        "fields": {
          "hobby": {}
        }
      }
    }
    

    结果:

    {
      "took" : 5,
      "timed_out" : false,
      "_shards" : {
        "total" : 1,
        "successful" : 1,
        "skipped" : 0,
        "failed" : 0
      },
      "hits" : {
        "total" : {
          "value" : 4,
          "relation" : "eq"
        },
        "max_score" : 0.9608413,
        "hits" : [
          {
            "_index" : "itcast2",
            "_type" : "_doc",
            "_id" : "VtQRLXIB0mJFQ4Okj0ar",
            "_score" : 0.9608413,
            "_source" : {
              "name" : "张三",
              "age" : 20,
              "mail" : "111@qq.com",
              "hobby" : "羽毛球、乒乓球、足球"
            },
            "highlight" : {
              "hobby" : [
                "<em>羽毛球</em>、乒乓<em>球</em>、足球"
              ]
            }
          },
          {
            "_index" : "itcast2",
            "_type" : "_doc",
            "_id" : "V9QRLXIB0mJFQ4Okj0ar",
            "_score" : 0.9134824,
            "_source" : {
              "name" : "李四",
              "age" : 21,
              "mail" : "222@qq.com",
              "hobby" : "羽毛球、乒乓球、足球、篮球"
            },
            "highlight" : {
              "hobby" : [
                "<em>羽毛球</em>、乒乓<em>球</em>、足球、篮球"
              ]
            }
          },
          {
            "_index" : "itcast2",
            "_type" : "_doc",
            "_id" : "WNQRLXIB0mJFQ4Okj0ar",
            "_score" : 0.80493593,
            "_source" : {
              "name" : "王五",
              "age" : 22,
              "mail" : "333@qq.com",
              "hobby" : "羽毛球、篮球、游泳、听音乐"
            },
            "highlight" : {
              "hobby" : [
                "<em>羽毛球</em>、篮球、游泳、听音乐"
              ]
            }
          },
          {
            "_index" : "itcast2",
            "_type" : "_doc",
            "_id" : "WtQRLXIB0mJFQ4Okj0ar",
            "_score" : 0.80493593,
            "_source" : {
              "name" : "孙七",
              "age" : 24,
              "mail" : "555@qq.com",
              "hobby" : "听音乐、看电影、羽毛球"
            },
            "highlight" : {
              "hobby" : [
                "听音乐、看电影、<em>羽毛球</em>"
              ]
            }
          }
        ]
      }
    }
    
    展开全文
  • 中文分词器IK-Analyzer) 1. 下载ik分词器 网址:https://github.com/medcl/elasticsearch-analysis-ik 下载对照ES版本的分词器版本。 注意 ik分词器的版本需要es保持一致。 2. 安装分词器 将分词器...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 511
精华内容 204
关键字:

es中文分词器ik