首页 > 其他分享 >ES搜索框架--设置IK分词器

ES搜索框架--设置IK分词器

时间:2023-04-08 16:55:05浏览次数:52  
标签:index -- text json ik 索引 IK 分词器

ES的默认中文分词效果太差了,稍微长一点的词句就完全匹配不到,于是选择使用安装IK中文分词器来实现索引的分词。

参考:

https://blog.csdn.net/w1014074794/article/details/119762827

https://www.bbsmax.com/A/6pdDqDaXzw/

image


一、安装

官网教程:

https://github.com/medcl/elasticsearch-analysis-ik,注意版本对应的问题

image

1.下载

从此处下载预构建包:https ://github.com/medcl/elasticsearch-analysis-ik/releases

根据版本匹配,我使用的是ES7.10.2,因此要下载对应ik7.10.2(如果版本不匹配的话,ik分词器会无法使用)

image


2.解压

在ES安装文件夹下的plugins文件夹下创建ik目录,将zip文件解压到ik目录下,删除zip

image


3.重新启动ES后测试

(1)原生分词器效果

GET /_analyze
{
  "analyzer": "standard",
  "text": "中华人民共和国"
}

image


(2)ik分词器效果

①ik_max_word

会把文本做最细粒度的解析,会穷尽各种可能的组合,适合词条查询;

GET /_analyze
{
  "analyzer": "ik_max_word",
  "text": "中华人民共和国"
}

image

②ik_smart

会做最粗粒度的拆分,适合短语查询。

GET /_analyze
{
  "analyzer": "ik_smart",
  "text": "中华人民共和国"
}

image



二、项目使用

删除之前的索引,创建新的指定分词器的索引(对相应字段设定分词器),并将数据重新导入后测试检索效果

索引字段详解:https://www.cnblogs.com/hld123/p/16538466.html

fields可以让同一文本有多种不同的索引方式,比如所示一个String类型的字段city,可以使用text类型做全文检索,使用keyword类型做聚合和排序。  

PUT index_name
{
  "mappings": {         # 设置 mappings
    "properties": {     # 属性,固定写法
      "city": {         # 字段名
        "type": "text", # city 字段的类型为 text
        "fields": {     # 多字段域,固定写法
          "raw": {      # 子字段名称
            "type":  "keyword"  # 子字段类型
            "ignore_above": 256  #在ElasticSearch中keyword,text类型字段ignore_above属性(动态映射默认是256) ,表示最大的字段值长度,超出这个长度的字段将不会被索引,查询不到,但是会存储。
          }
        }
      }
    }
  }
}

通过analyzer属性指定写入分词器采用细粒度模式ik_max_word;通过search_analyzer属性指定查询时采用智能模式ik_smart

image

1.创建json对象作为索引mapping

由于数据类型较多,使用json文件,将其装换为json对象

(1)pom.xml

<!--json文件转json对象-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.54</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-io</artifactId>
            <version>1.3.2</version>
        </dependency>

(2)JsonUtil

package org.project.es.common.util;

import java.io.InputStream;
import org.apache.commons.io.IOUtils;
import com.alibaba.fastjson.JSONObject;
/**
 * 将json文件装换为json对象
 * @author Administrator
 */
public class JsonUtil {
    public static JSONObject fileToJson(String fileName) {
        JSONObject json = null;
        try (
                InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName);
        ) {
            json = JSONObject.parseObject(IOUtils.toString(is, "utf-8"));
        } catch (Exception e) {
            System.out.println(fileName + "文件读取异常" + e);
        }
        return json;
    }
    public static void main(String[] args) {
        String fileName = "doc/policy.json";
        JSONObject json = JsonUtil.fileToJson(fileName);
        System.out.println(json);
    }
}
效果:

image


2.创建索引

public static void createIndex(RestHighLevelClient client,String index) throws IOException {
        // 1.创建索引 - 请求对象
        CreateIndexRequest request = new CreateIndexRequest(index);
        // 2.设置setting,也就是索引的基本配置信息,将setting添加到请求对象中
        Settings setting = Settings.builder()
                //设置分片数,主分片数量一旦设置后就不能修改了
                .put("index.number_of_shards", 1)
                //索引的刷新时间间隔,索引更新多久才对搜索可见(即数据写入es到可以搜索到的时间间隔,设置越小越靠近实时,但是索引的速度会明显下降,),
                // 默认为1秒,如果我们对实时搜索没有太大的要求,反而更注重索引的速度,那么我们就应该设置的稍微大一些,这里设置30s
                .put("index.refresh_interval", "30s")
                //每个节点上允许最多分片数
                .put("index.routing.allocation.total_shards_per_node", 3)
                //将数据同步到磁盘的频率,为了保证性能,插入ES的数据并不会立刻落盘,而是首先存放在内存当中,
                // 等到条件成熟后触发flush操作,内存中的数据才会被写入到磁盘当中
                .put("index.translog.sync_interval", "30s")
                //每个主分片拥有的副本数,副本数量可以修改
                .put("index.number_of_replicas", 1)
                //一次最多获取多少条记录
                .put("index.max_result_window", "10000000")
                .build();
        request.settings(setting);

        // 3.使用工具类将json文件转换为json对象,添加到请求对象中
        JSONObject mapping = JsonUtil.fileToJson("doc/policy.json");
        request.mapping(mapping);

        // 4.发送请求,获取响应
        CreateIndexResponse response = client.indices().create(request, RequestOptions.DEFAULT);
        boolean acknowledged = response.isAcknowledged();
        // 5.输出响应状态
        System.out.println("操作状态 = " + acknowledged);
    }

查看索引

image


3.导入数据

索引创建好之后将mysql数据导入es,便于检索


4.测试检索

之前使用默认分词器的效果很差,检索结果不尽如人意,在安装使用了IK分词器后再次检索测试,发现效果不错,检索速度也很快

image

标签:index,--,text,json,ik,索引,IK,分词器
From: https://www.cnblogs.com/Studywith/p/17298790.html

相关文章

  • 广发新用户办信用卡有礼品
    广发新用户办卡返钱,我这边收到的钱也会返你一半。......
  • 数据结构
    〽️数据结构顺序结构顺序栈(SequenceStack)SqStack.cpp顺序栈数据结构和图片typedefstruct{ ElemType*elem; inttop; intsize; intincrement;}SqStack;队列(SequenceQueue)队列数据结构typedefstruct{ ElemType*elem; intfront; intrear; intmaxSi......
  • ES搜索框架--基本原理
    一、基本原理参考博客(非常详细):https://blog.csdn.net/weixin_43111776/article/details/124952148我们先来看看MySQL中的索引,在MySQL关系表中,每一行数据都有一个主键,我们在查询数据的时候会先找到数据的主键,再根据主键去找到整行数据,这种索引形式成为正排索引,本质是通过key来查询v......
  • macOS Ventura 13.3.1 (22E261) 正式版发布,ISO、IPSW、PKG 下载
    本站下载的macOSVentura软件包,既可以拖拽到Applications(应用程序)下直接安装,也可以制作启动U盘安装,或者在虚拟机中启动安装。另外也支持在Windows和Linux创建可引导介质。请访问原文链接:https://sysin.org/blog/macOS-Ventura/,查看最新版。原创作品,转载请保留出处。ma......
  • gradle 7.x 中的一些变更
    根目录下build.gradle变更变更前:buildscript{ext.kotlin_version='1.5.0'repository{mavenCentral()jcenter()}dependencies{classpath'com.android.tools.build:gradle:4.0.2'classpath&q......
  • ES搜索框架--Windows下简单使用ES框架
    前面讲述了什么是ES框架和为什么要用ES框架进行检索,现在开始尝试在windows下安装并简单使用ES框架参考:官方文档中文版,英文版linux下部署:https://www.elastic.co/guide/en/elasticsearch/reference/6.0/_installation.html一、安装1.下载解压安装包官网选择相应版本进行下载zip包,在......
  • 当用 SA 来建后缀树
    因为学不会什么串串技术,所以我只会SA,至于SAM啥的我一窍不通,而后缀树也只知道定义!所以别和我说Ukkonen算法,因为我不会。以下假设原串\(\text{S}\)长度为\(n\),我们在后缀数组\(\text{SA}\)开头插入一个空串,用\(\text{H}\)数组(好像通常叫做\(\text{height}\)数组?)表示......
  • ES搜索框架--ES部署到Centos8服务器
    参考:https://blog.csdn.net/Me_xuan/article/details/114608076https://www.cnblogs.com/chenxitag/p/12320868.html一、下载安装1.下载ES使用elasticsearch7.10.2,到官网下载对应的linux包,然后上传到服务器文件夹下,cd到文件夹后使用tar命令解压tar-xvfelasticsearch-7.10.2-linu......
  • 股票买卖模型
    股票买卖模型题目描述给定一个长度为\(N\)的数组,数组中的第\(i\)个数字表示一个给定股票在第\(i\)天的价格。如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。注意你不能在买入股票前卖出股票。输入格式第一行包含整数\(N......
  • mac m1安装stable-diffusion-webui
    1.准备安装环境[email protected]下载stable-diffusion-webuigitclonehttps://github.com/AUTOMATIC1111/stable-diffusion-webui.git3.下载huggingface模型https://huggingface.co/runwayml/stable-diffusi......