zoukankan      html  css  js  c++  java
  • ElasticSearch-IK分词器和集成使用

    1.查询存在问题分析

    在进行字符串查询时,我们发现去搜索"搜索服务器"和"钢索"都可以搜索到数据;
    而在进行词条查询时,我们搜索"搜索"却没有搜索到数据;
    究其原因是ElasticSearch的标准分词器导致的,当我们创建索引时,字段使用的是标准分词器:

    如果使用ES搜索中文内容,默认是不支持中文分词,英文支持

    例如:How are you!

    How

    are

    you

    !

    例如:我是一个好男人!

    {
        "mappings": {
            "article": {
                "properties": {
                    "id": {
                    	"type": "long",
                        "store": true,
                        "index":false
                    },
                    "title": {
                    	"type": "text",
                        "store": true,
                        "index":true,
                        "analyzer":"standard"	//标准分词器  standard 内置的不支持中文分词
                    },
                    "content": {
                    	"type": "text",
                        "store": true,
                        "index":true,
                        "analyzer":"standard"	//标准分词器
                    }
                }
            }
        }
    }
    

    例如对 "我是程序员" 进行分词

    标准分词器分词效果测试:

    GET http://localhost:9200/_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
        }
      ]
    }
    

    而我们需要的分词效果是:我、是、程序、程序员

    这样的话就需要对中文支持良好的分析器的支持,支持中文分词的分词器有很多,word分词器、庖丁解牛、盘古分词、Ansj分词等,但我们常用的还是下面要介绍的IK分词器。

    2.IK分词器简介

    IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。从2006年12月推出1.0版开始,IKAnalyzer已经推出 了3个大版本。最初,它是以开源项目Lucene为应用主体的,结合词典分词和文法分析算法的中文分词组件。新版本的IKAnalyzer3.0则发展为 面向Java的公用分词组件,独立于Lucene项目,同时提供了对Lucene的默认优化实现。

    IK分词器3.0的特性如下:

    1)采用了特有的“正向迭代最细粒度切分算法“,具有60万字/秒的高速处理能力。
    2)采用了多子处理器分析模式,支持:英文字母(IP地址、Email、URL)、数字(日期,常用中文数量词,罗马数字,科学计数法),中文词汇(姓名、地名处理)等分词处理。
    3)对中英联合支持不是很好,在这方面的处理比较麻烦.需再做一次查询,同时是支持个人词条的优化的词典存储,更小的内存占用。
    4)支持用户词典扩展定义。
    5)针对Lucene全文检索优化的查询分析器IKQueryParser;采用歧义分析算法优化查询关键字的搜索排列组合,能极大的提高Lucene检索的命中率。

    3. IK分词器的安装

    1)下载地址:https://github.com/medcl/elasticsearch-analysis-ik/releases
    课程资料也提供了IK分词器的压缩包:
    在这里插入图片描述2)解压,将解压后的elasticsearch文件夹拷贝到elasticsearch-5.6.8plugins下,并重命名文件夹为analysis-ik
    在这里插入图片描述

    3)重新启动ElasticSearch,即可加载IK分词器
    在这里插入图片描述

    4.IK分词器测试

    IK提供了两个分词算法ik_smart 和 ik_max_word
    其中 ik_smart 为最少切分,ik_max_word为最细粒度划分
    我们分别来试一下

    1)最小切分:在浏览器地址栏输入地址

    GET http://localhost:9200/_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
        }
      ]
    }
    

    2)最细切分:在浏览器地址栏输入地址

    http://127.0.0.1:9200/_analyze?analyzer=ik_max_word&pretty=true&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" : 4,
          "end_offset" : 5,
          "type" : "CN_CHAR",
          "position" : 4
        }
      ]
    }
    

    6. 修改索引映射mapping

    6.1 重建索引

    删除原有blog1索引

    DELETE		localhost:9200/blog1
    

    创建blog1索引,此时分词器使用ik_max_word

    PUT		localhost:9200/blog1
    
    {
        "mappings": {
            "article": {
                "properties": {
                    "id": {
                    	"type": "long",
                        "store": true,
                        "index":false
                    },
                    "title": {
                    	"type": "text",
                        "store": true,
                        "index":true,
                        "analyzer":"ik_max_word"
                    },
                    "content": {
                    	"type": "text",
                        "store": true,
                        "index":true,
                        "analyzer":"ik_max_word"
                    }
                }
            }
        }
    }
    

    创建文档

    POST	localhost:9200/blog1/article/1
    
    {
    	"id":1,
    	"title":"ElasticSearch是一个基于Lucene的搜索服务器",
    	"content":"它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。"
    }
    

    6.2 再次测试queryString查询

    请求url:

    POST	localhost:9200/blog1/article/_search
    

    请求体:

    {
        "query": {
            "query_string": {
                "default_field": "title",
                "query": "搜索服务器"
            }
        }
    }
    

    postman截图:
    在这里插入图片描述
    将请求体搜索字符串修改为"钢索",再次查询:

    {
        "query": {
            "query_string": {
                "default_field": "title",
                "query": "钢索"
            }
        }
    }
    

    postman截图:在这里插入图片描述

    6.3 再次测试term测试

    请求url:

    POST	localhost:9200/blog1/article/_search
    

    请求体:

    {
        "query": {
            "term": {
                "title": "搜索"
            }
        }
    }
    

    postman截图:
    在这里插入图片描述

  • 相关阅读:
    spark streaming 概述
    spark sql 的性能调优
    LeetCode 106. Construct Binary Tree from Inorder and Postorder Traversal (用中序和后序树遍历来建立二叉树)
    LeetCode 105. Construct Binary Tree from Preorder and Inorder Traversal (用先序和中序树遍历来建立二叉树)
    LeetCode 90. Subsets II (子集合之二)
    LeetCode 88. Merge Sorted Array(合并有序数组)
    LeetCode 81. Search in Rotated Sorted Array II(在旋转有序序列中搜索之二)
    LeetCode 80. Remove Duplicates from Sorted Array II (从有序序列里移除重复项之二)
    LeetCode 79. Word Search(单词搜索)
    LeetCode 78. Subsets(子集合)
  • 原文地址:https://www.cnblogs.com/npeng/p/14329381.html
Copyright © 2011-2022 走看看