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

这篇具有很好参考价值的文章主要介绍了ES搜索框架--设置IK分词器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

参考:

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

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

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

一、安装

官网教程:

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

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

1.下载

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

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

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

2.解压

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

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

3.重新启动ES后测试

(1)原生分词器效果

GET /_analyze
{
  "analyzer": "standard",
  "text": "中华人民共和国"
}
ES搜索框架--设置IK分词器

(2)ik分词器效果

①ik_max_word

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

GET /_analyze
{
  "analyzer": "ik_max_word",
  "text": "中华人民共和国"
}
ES搜索框架--设置IK分词器

②ik_smart

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

GET /_analyze
{
  "analyzer": "ik_smart",
  "text": "中华人民共和国"
}
ES搜索框架--设置IK分词器

二、项目使用

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

索引字段详解: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

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

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);
    }
}
效果:
ES搜索框架--设置IK分词器

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);
    }

查看索引

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

3.导入数据

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

4.测试检索

之前使用默认分词器的效果很差,检索结果不尽如人意,在安装使用了IK分词器后再次检索测试,发现效果不错,检索速度也很快文章来源地址https://www.toymoban.com/news/detail-478511.html

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

到了这里,关于ES搜索框架--设置IK分词器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 搜索引擎elasticsearch :安装elasticsearch (包含安装组件kibana、IK分词器、部署es集群)

    kibana可以帮助我们方便地编写DSL语句,所以还要装kibana 因为我们还需要部署kibana容器,因此需要让es和kibana容器互联。这里先创建一个网络: 这里我们采用elasticsearch的7.12.1版本的镜像,这个镜像体积非常大,接近1G。不建议大家自己pull。 课前资料提供了镜像的tar包: 大家将

    2024年02月16日
    浏览(58)
  • Elasticsearch7.15.2 安装ik中文分词器后启动ES服务报错的解决办法

    下载elasticsearch ik中文分词器,在elasticsearch安装目录下的plugins文件夹下创建名为ik的文件夹,将下载的ik中文分词器解压缩到新建的ik文件夹下,再次运行 ./bin/elasticsearch启动ES服务时出现以下错误: Exception in thread \\\"main\\\" java.nio.file.NotDirectoryException: /Users/amelia/work/elasticsearch-7.1

    2024年02月12日
    浏览(60)
  • Docker安装ElasticSearch、Kibana、IK分词器以及设置ES账户密码

    版本声明: 系统 :CentOS 7.9(云服务器) ES版本 :7.6.1 Kibana :7.6.1 Ik分析器版本 :7.6.1 1、拉取镜像 2、创建挂载目录 设置所有用户读写执行权限 : sudo chmod -R 777 /docker_config/elasticsearch/ 3、创建elasticsearch.yml 配置文件 4、创建容器 参数说明 : -p 端口映射 -e discovery.type=single

    2023年04月09日
    浏览(71)
  • Elasticsearch之ik中文分词篇

    es在7.3版本已经支持中文分词,由于中文分词只能支持到单个字进行分词,不够灵活与适配我们平常使用习惯,所以有很多对应中文分词出现,最近使用的是ik分词器,就说说它吧。 安装可以百度下有很多教程,需要注意的是ik分词器的版本要跟es版本对应上,避免出现不必要

    2024年02月02日
    浏览(64)
  • 本地elasticsearch中文分词器 ik分词器安装及使用

    ElasticSearch 内置了分词器,如标准分词器、简单分词器、空白词器等。但这些分词器对我们最常使用的中文并不友好,不能按我们的语言习惯进行分词。 ik分词器就是一个标准的中文分词器。它可以根据定义的字典对域进行分词,并且支持用户配置自己的字典,所以它除了可

    2024年02月05日
    浏览(71)
  • 中文分词入门:使用IK分词器进行文本分词(附Java代码示例)

    中文分词是将连续的中文文本切分成一个个独立的词语的过程,是中文文本处理的基础。IK分词器是一个高效准确的中文分词工具,采用了\\\"正向最大匹配\\\"算法,并提供了丰富的功能和可定制选项。 细粒度和颗粒度的分词模式选择。 可自定义词典,提高分词准确性。 支持中文

    2024年02月17日
    浏览(59)
  • es安装ik分词器

    IK分词器下载地址: https://github.com/medcl/elasticsearch-analysis-ik/releases 下载ES版本对应的分词器即可 安装ik分词器 将下载好的zip包解压,生成一个ik文件夹 将ik文件夹移动到ES安装目录下的 plugins 文件夹下(每台ES节点都要执行相同的操作) 重启ES集群 自定义分词库 用 vim 在ik中的

    2023年04月10日
    浏览(42)
  • Elasticsearch安装中文分词器IK Analyzer

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 本文介绍IK Analyzer分词器的安装配置、使用以及ES数据迁移。 克隆IK分词器项目,根据README的描述选择对应版本的分支。浏览器访问ES的ip+端口就能看到版本信息,所以我需要切到master分支。 打开pom需要

    2024年02月12日
    浏览(59)
  • ES(二)| 安装ES、Kibana、IK分词器、拼音分词器(自动补全)

    上一篇:ES(一)| ES简介、倒排索引、索引库操作语法、文档操作语法、Java使用RestClient进行ES操作 安装包下载: 链接:https://pan.baidu.com/s/1Y1O0B8aG7qzRLFFVYo9nHw 提取码:hdyc 因为我们还需要部署 kibana 容器,因此需要让 es 和 kibana 容器互联。这里先创建一个网络: 这里我采用

    2023年04月08日
    浏览(56)
  • Elasticsearch教程(35) ik中文分词器+pinyin拼音分词器+同义词

    闲来无事,发现上一篇ES博客还是 去年9月份 写的中文ik分词器 pinyin 首字母 search_as_you_type 组合使用,该篇文章还挖了一个 大坑 没有填,快一年了,是时候填下坑了。 针对股票查询这个特点场景,再结合一般使用者的搜索习惯,暂时确定如下7种期望效果。 上一篇博客Elast

    2023年04月09日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包