• Elasticsearch 全文搜索引擎 ---- IK分词器


            原理:分词的原理:二叉树        

            首先讲一下为什么要出这个文章,前面我们讲过分词方法:中文分词搜索 pscws(感兴趣的同学可以去爬楼看一下),那为什么要讲IK分词?最主要的原因是:pscws分词颗粒度不如IK分词的颗粒度高,现在的需求要求颗粒度细一点,以便提高搜索进度,所以我们今天讲一下IK分词

            第一步:安转Elasticsearch,这个在博主原来的文章里面有,所以不在讲述,安装完成后运行结果:

    访问地址:http://localhost:9200

            第二步:安转IK扩展(现在下载扩展包):需要选择和自己的Elasticsearch对应的版本,我的Elasticsearch版本是7.3.2,下载后存放在:/plugins 目录下:

            下载地址:https://gitcode.net/mirrors/medcl/elasticsearch-analysis-ik/-/tree/v7.3.2

            直接运行会发现闪退情况:为什么会出现这样的情况,主要有两个原因:

            1.版本不配

            2.未修改配置 ,配置如何修改?

            需要安装 maven 包管理工具,这个是JAVA开发的,所以需要安装JAVA的环境IK 分词器需要 Java 8 或者以上的版本)  

            一、下载&安装

            1. 下载地址

            maven下载地址如下,各位请选择对应系统的maven版本进行下载。

            https://maven.apache.org/download.cgi

            2. 解压maven安装包

            maven安装包下载之后,对其进行解压。


            二、配置环境变量:
            系统变量新增:变量名:MAVEN_HOME   值:maven存放目录
            系统变量追加:变量名:path         值:%MAVEN_HOME%\bin

            测试maven是否配置完毕:输入mvn -v命令,如果出现maven版本号,就表明安装成功。
            如果报错:
            配合:The JAVA_HOME environment variable is not defined correctly This environment variable is needed to run this program NB: JAVA_HOME should point to a JDK not a JRE
            没有安装Java的运行环境或者JAVA_HOME的环境变量没有配置,安装好JAVA的运行环境后记得配置JAVA_HOME环境变量,安装好后,再运行mvn -v命令        

    查看命令:elasticSearch-plugin list:安装成功

    第三步:使用分词(PHP版本):

    //引入自动加载文件
    require_once APPPATH.'../vendor/es/autoload.php';
    //使用命名空间引用
    use Elasticsearch\ClientBuilder;
    class Test extends CI_Controller
    {
        //初始化
        public function __construct()
        {
            parent::__construct();
            //拼接参数
            $params = [
                [
                    'host'   => '地址',
                    'port'   => '端口号',
                    'scheme' => 'http',
                    'user'   => '用户名',
                    'pass'   => '密码'
                ]
            ];
                    //初始化对象
            $this->client = ClientBuilder::create()->setHosts($params)->setConnectionPool('连接池地址(相对地址)', []) ->setRetries(10)->build();
        }
            
            //分词器
        public function ik(){
             $params = [
                'body' => [
                    'text' => '中国上海市直辖市静安区',
                    //ik_max_word 精细  ik_smart 粗略
                    'analyzer'=>'ik_max_word'
                ]
            ];
                    //请求分词
            $res =  $this->client->indices()->analyze($params);
            var_dump($res);die;
        }
    }

    IK精细分词输出结果:

      array(11) {
        [0]=>array(5) {
            ["token"]=>string(6) "中国"["start_offset"]=>int(0)["end_offset"]=>int(2) 
            ["type"]=>string(7) "CN_WORD"["position"]=>int(0)
            }
        [1]=>array(5) {
            ["token"]=>string(9) "上海市"["start_offset"]=>int(2)["end_offset"]=>int(5)
            ["type"]=>string(7) "CN_WORD"["position"]=>int(1)
            }
        [2]=>array(5) {
            ["token"]=>string(6) "上海"["start_offset"]=>int(2)["end_offset"]=>int(4)
            ["type"]=>string(7) "CN_WORD"["position"]=>int(2)
            }
        [3]=>array(5) {
            ["token"]=>string(6) "海市" ["start_offset"]=>int(3)["end_offset"]=>int(5)
            ["type"]=>string(7) "CN_WORD"["position"]=>int(3)
            }
        [4]=>array(5) {
            ["token"]=>string(6) "市直" ["start_offset"]=>int(4)["end_offset"]=>int(6)
            ["type"]=> string(7) "CN_WORD"["position"]=>int(4)
            }    
        [5]=>array(5) {
            ["token"]=>string(9) "直辖市"["start_offset"]=>int(5)["end_offset"]=>int(8)
            ["type"]=>string(7) "CN_WORD"["position"]=>int(5)
            }
        [6]=>array(5) {
            ["token"]=> string(6) "直辖"["start_offset"]=> int(5)["end_offset"]=>int(7)
            ["type"]=>string(7) "CN_WORD"["position"]=>int(6)
            }
        [7]=>array(5) {
            ["token"]=>string(3) "市"["start_offset"]=>int(7)["end_offset"]=>int(8)
            ["type"]=>string(7) "CN_CHAR"["position"]=>int(7) 
            }
        [8]=> array(5) {
            ["token"]=>string(9) "静安区" ["start_offset"]=>int(8)["end_offset"]=> int(11)
            ["type"]=>string(7) "CN_WORD"["position"]=>int(8)
            }
        [9]=>array(5) { 
            ["token"]=>string(6) "静安" ["start_offset"]=>int(8)["end_offset"]=>int(10)
            ["type"]=>string(7) "CN_WORD" ["position"]=>int(9) 
            }
        [10]=>array(5) {
            ["token"]=>string(3) "区"["start_offset"]=>int(10)["end_offset"]=>int(11)
            ["type"]=>string(7) "CN_CHAR"["position"]=>int(10) 
            }
      }
    }

    IK粗略分词:

    array(1) {
      ["tokens"]=>
      array(11) {
        [0]=>array(5) {
            ["token"]=>string(6) "中国"["start_offset"]=>int(0)["end_offset"]=>int(2) 
            ["type"]=>string(7) "CN_WORD"["position"]=>int(0)
            }
        [1]=>array(5) {
            ["token"]=>string(9) "上海市"["start_offset"]=>int(2)["end_offset"]=>int(5)
            ["type"]=>string(7) "CN_WORD"["position"]=>int(1)
            }
        [2]=>array(5) {
            ["token"]=>string(9) "直辖市"["start_offset"]=>int(5)["end_offset"]=>int(8)
            ["type"]=>string(7) "CN_WORD"["position"]=>int(5)
            }
        [3]=> array(5) {
            ["token"]=>string(9) "静安区" ["start_offset"]=>int(8)["end_offset"]=> int(11) 
            ["type"]=>string(7) "CN_WORD"["position"]=>int(8)
            }
      }
    }

    中文分词搜索 pscws

    array(4) { 
    ["中国"]=> array(4) { 
        ["word"]=> string(6) "中国" 
        ["times"]=> int(1) ["weight"]=> float(6.2600002288818) ["attr"]=> string(3) "ns" 

    ["上海市"]=> array(4) { 
        ["word"]=> string(9) "上海市" 
        ["times"]=> int(1) ["weight"]=> float(7.8200001716614) ["attr"]=> string(3) "ns" 

    ["直辖市"]=> array(4) { 
        ["word"]=> string(9) "直辖市" 
        ["times"]=> int(1) ["weight"]=> float(6.8499999046326) ["attr"]=> string(3) "n" 

    ["静安区"]=> array(4) { 
        ["word"]=> string(9) "静安区"
        ["times"]=> int(1) ["weight"]=> float(12.140000343323) ["attr"]=> string(3) "ns" 
     }
    }

            至此IK分词器讲解完成,可以对比一下IK与pscws的区别,后续操作可以根据自己的业务来确定

  • 相关阅读:
    odoo13 升级odoo15时注意点
    Android自动化测试32--Appium Desktop
    实例方法(instance method)、类方法、构造方法(三)
    关于什么是框架
    漏洞复现-Apache Druid 任意文件读取 _(CVE-2021-36749)
    SpringSecurity+JWT 登录授权过滤器
    数据中台模块介绍
    你需要的免费热门API接口这里都有~
    探索随机森林: 机器学习中的集成学习神器
    “JS逆向 | Python爬虫 | 动态cookie如何破~”
  • 原文地址:https://blog.csdn.net/masterphp/article/details/132558421