IK 分词器插件

什么是 IK 分词器

分词∶即把一段中文或者别的划分成一个个的关键字,我们在搜索时候会把自己的信息进行分词,会把数据库中或者索引库中的数据进行分词,然后进行一个匹配操作,默认的中文分词是将每个字看成一个词,比如“我爱编程”会被分为"我""爱""编""程”,这显然是不符合要求的,所以我们需要安装中文分词器ik来解决这个问题。

如果使用中文,建议使用ik分词器!

IK提供了两个分词算法:ik_smart和ik_max_word,其中 ik_smart为最少切分,ik_max_word为最细粒度划分!
  • 注意:在 ES 中默认使用的是标准分词器:StandarAnalizer,特点:中文单字分词,英文单词分词

分词器(analyzer)都由三种构件组成:character filtertokenizerstoken filters

  • character filter字符过滤器
    • 在一段文本进行分词之前,先进行预处理,比如对常见的就是过滤 html 标签
  • tokenizers分词器
    • 英文分词可以根据空格将单词分开,中文分词比较复杂,可以采用机器学习算法来分词。
  • token filterstoken 过滤器
    • 将切分的单词进行加工,大小写转换(例如将”Quick”转为小写),去掉停用词(例如停用像 a、and、the等),加入同义词(例如同义词像 jump 和 leap)

注意:

  • 三者顺序:Character Filters–>Tokenizer–>Token Filter
  • 三者个数:Character Filters(0个或多个) + Tokenizer + Token Filters(0 个或多个)

内置分词器

  • Standard Analyzer - 默认分词器,英文按照单词切分,并小写处理,中文按照单字分词
  • Simple Analyzer - 英文按照单词分词(符号被过滤),小写处理,中文按照空格分词
  • Stop Analyzer - 小写处理,停用词过滤(the,a,is)
  • Whitespace Analyzer - 按照空格切分,不转小写,不去标点符号
  • Keyword Analyzer - 不分词,直接将输入当作输出

IK 分词器配置

IK 分词器插件

  • 3、重启观察ES,可以看到ik分词器被加载了!

IK 分词器插件

如果是安装了Linux集群

# 每个节点都执行
$ mkdir -p /opt/elasticsearch/plugins/ik
$ unzip elasticsearch-analysis-ik.zip -d /opt/elasticsearch/plugins/ik
  • 4、elasticsearch-plugin 可以通过这个命令查看加载进来的插件

IK 分词器插件

使用kibana测试

查看不同的分词效果

ik_smart最少切分

IK 分词器插件

ik_max_word为最细粒度划分,穷尽词库的可能!

IK 分词器插件

IK 分词器插件
发现问题:弧度孤鬼被拆开了
这种自己需要的词,需要自己加到我们的分词器的字典中

创建索引测试

curl -X PUT http://192.168.122.161:9200/poetry {
    "settings": {
        "number_of_shards": 3,
        "number_of_replicas": 1
    },
    "mappings": {
        "dynamic": "false",
        "properties": {
            "name": {
                "type": "text",
                "analyzer": "ik_max_word",
                "search_analyzer": "ik_smart"
            },
            "author": {
                "type":"keyword"
            },
            "dynasty": {
                "type": "keyword"
            },
            "content": {
                "type": "text",
                "analyzer": "ik_max_word",
                "search_analyzer": "ik_smart"
            }
        }
    }
}
  • 插入数据
$ curl -X POST http://192.168.122.161:9200/poetry -H 'Content-Type:applicatoin/json' -d '{
    "name": "望庐山瀑布",
    "author":"李白",
    "dynasty":"唐代",
    "content":"日照香炉生紫烟,遥看瀑布挂前川,飞流直下三千尺,疑是银河落九天。"
}'

$ curl -X POST http://192.168.122.161:9200/poetry -H 'Content-Type:applicatoin/json' -d '{
    "name": "静夜思",
    "author":"李白",
    "dynasty":"唐代",
    "content":"床前明月光,疑是地上霜。举头望明月,低头思故乡。"
}'

$ curl -X POST http://192.168.122.161:9200/poetry -H 'Content-Type:applicatoin/json' -d '{
    "name": "春夜喜雨",
    "author":"杜甫",
    "dynasty":"唐代",
    "content":"好雨知时节,当春乃发生。随风潜入夜,润物细无声。野径云俱黑,江船火独明。晓看红湿处,花重锦官城。"
}'

IK 分词器插件

  • 组合条件查询
    • must,must not,should 的区别
      • must 返回的文档必须满足 must 子句的条件,类似于 == and
      • must not 返回的文档必须不满足 must nost 子句的条件 类似于 != not
      • should 返回的文档只要满足 should 中的一个条件即可 类似于 || or
    • 各类查询参数
      • term
        • 把检索串当作一个整体来执行检索,即不会对检索串分词
      • text
        • 会将检索词进行分词,然后对数据进行匹配
      • prefix
        • 就是前缀检索,比如商品 name 中有多个以 “Java” 开头的 document,检索前缀 “Java” 时就能检索到所有以”Java”开头的文档
      • wildcard 通配符查询
        • 通配符检索,例如 java*
      • fuzzy 纠错检索
        • fuzziness 的默认值是 2 – 最多可以纠错两次
        • 例如:检索 name 中包含 “Java” 的文档,Java 中缺失了一个字母 a
          get shop/_search
          {
            "query": {
                "match": {
                    "query": "Jav",
                    "fuzziness": 1,
                    "operator": "and"
                }
            }
          }
      • rang
        • 区间查询,如果 type 是时间类型,可用内置 now 表示当前, -1d/h/m/s 来进行时间操作
      • query_string
        • 可以对 int,long,string 查询,对 int,long 只能本身查询,对 string 进行分词和本身查询
      • missing
        • 返回没有字段或值为null的文档

ik分词器配置扩展词及停用词

IK 分词器插件

加载了我们自定义的dic文件
IK 分词器插件
再次测试一下

IK 分词器插件
以后,我们需要自己配置分词就在自定义的dic文件中进行配置即可!

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
247
粉丝
18
喜欢
217
收藏
62
排名:731
访问:9753
私信
所有博文
社区赞助商