原理:分词的原理:二叉树
首先讲一下为什么要出这个文章,前面我们讲过分词方法:中文分词搜索 pscws(感兴趣的同学可以去爬楼看一下),那为什么要讲IK分词?最主要的原因是:pscws分词颗粒度不如IK分词的颗粒度高,现在的需求要求颗粒度细一点,以便提高搜索进度,所以我们今天讲一下IK分词
第一步:安转Elasticsearch,这个在博主原来的文章里面有,所以不在讲述,安装完成后运行结果:

第二步:安转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 或者以上的版本)
一、下载&安装
- 下载地址
maven下载地址如下,各位请选择对应系统的maven版本进行下载。
https://maven.apache.org/download.cgi
- 解压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的区别,后续操作可以根据自己的业务来确定