首页 > 其他分享 >ES(IK,索引)

ES(IK,索引)

时间:2024-10-17 20:11:54浏览次数:3  
标签:请求 keyword 索引 IK 分词器 type ES

IK分词器

Elasticsearch的关键就是倒排索引,而倒排索引依赖于对文档内容的分词,而分词则需要高效、精准的分词算法,IK分词器就是这样一个中文分词算法。

1.在线安装

docker exec -it es ./bin/elasticsearch-plugin  install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.12.1/elasticsearch-analysis-ik-7.12.1.zip

重启docker

docker restart es

2.使用IK分词器

IK分词器包含两种模式:

  • ik_smart:智能语义切分

  • ik_max_word:最细粒度切分

3.拓展词典

随着互联网的发展,“造词运动”也越发的频繁。出现了很多新的词语,在原有的词汇列表中并不存在。比如:“泰裤辣”,“传智播客” 等。IK分词器无法对这些词汇分词。

所以要想正确分词,IK分词器的词库也需要不断的更新,IK分词器提供了扩展词汇的功能。

  1. 打开IK分词器config目录:

注意,如果采用在线安装的通过,默认是没有config目录的,需要把课前资料提供的ik下的config上传至对应目录

2.在IKAnalyzer.cfg.xml配置文件内容添加:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
        <comment>IK Analyzer 扩展配置</comment>
        <!--用户可以在这里配置自己的扩展字典 *** 添加扩展词典-->
        <entry key="ext_dict">ext.dic</entry>
</properties>

3.在IK分词器的config目录新建一个 ext.dic,可以参考config目录下复制一个配置文件进行修改

传智播客
泰裤辣

4.重启elasticsearch

docker restart es

# 查看 日志
docker logs -f elasticsearch

索引库

Index就类似数据库表,Mapping映射就类似表的结构。我们要向es中存储数据,必须先创建Index和Mapping

1.Mapping映射属性

Mapping是对索引库中文档的约束,常见的Mapping属性包括:

  • type:字段数据类型,常见的简单类型有:

    • 字符串:text(可分词的文本)、keyword(精确值,例如:品牌、国家、ip地址)

    • 数值:longintegershortbytedoublefloat

    • 布尔:boolean

    • 日期:date

    • 对象:object

  • index:是否创建索引,默认为true

  • analyzer:使用哪种分词器

  • properties:该字段的子字段

2.索引库的CRUD

由于Elasticsearch采用的是Restful风格的API,因此其请求方式和路径相对都比较规范,而且请求参数也都采用JSON风格。

在java使用要引入jar包

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
</dependency>

因为SpringBoot默认的ES版本是7.17.10,所以我们需要覆盖默认的ES版本:

  <properties>
      <maven.compiler.source>11</maven.compiler.source>
      <maven.compiler.target>11</maven.compiler.target>
      <elasticsearch.version>7.12.1</elasticsearch.version>
  </properties>

初始化RestHighLevelClient:
可以注册成一个Bean

RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(
        HttpHost.create("http://192.168.150.101:9200")
));

1.创建引索库和映射

基本语法

  • 请求方式:PUT

  • 请求路径:/索引库名,可以自定义

  • 请求参数:mapping映射

PUT /索引库名称
{
  "mappings": {
    "properties": {
      "字段名":{
        "type": "text",
        "analyzer": "ik_smart"
      },
      "字段名2":{
        "type": "keyword",
        "index": "false"
      },
      "字段名3":{
        "properties": {
          "子字段": {
            "type": "keyword"
          }
        }
      },
      // ...略
    }
  }
}

创建java代码

@Test
void testCreateIndex() throws IOException {
    // 1.创建Request对象
    CreateIndexRequest request = new CreateIndexRequest("items");
    // 2.准备请求参数
    request.source(MAPPING_TEMPLATE, XContentType.JSON);
    // 3.发送请求
    client.indices().create(request, RequestOptions.DEFAULT);
}

static final String MAPPING_TEMPLATE = "{\n" +
            "  \"mappings\": {\n" +
            "    \"properties\": {\n" +
            "      \"id\": {\n" +
            "        \"type\": \"keyword\"\n" +
            "      },\n" +
            "      \"name\":{\n" +
            "        \"type\": \"text\",\n" +
            "        \"analyzer\": \"ik_max_word\"\n" +
            "      },\n" +
            "      \"price\":{\n" +
            "        \"type\": \"integer\"\n" +
            "      },\n" +
            "      \"stock\":{\n" +
            "        \"type\": \"integer\"\n" +
            "      },\n" +
            "      \"image\":{\n" +
            "        \"type\": \"keyword\",\n" +
            "        \"index\": false\n" +
            "      },\n" +
            "      \"category\":{\n" +
            "        \"type\": \"keyword\"\n" +
            "      },\n" +
            "      \"brand\":{\n" +
            "        \"type\": \"keyword\"\n" +
            "      },\n" +
            "      \"sold\":{\n" +
            "        \"type\": \"integer\"\n" +
            "      },\n" +
            "      \"commentCount\":{\n" +
            "        \"type\": \"integer\"\n" +
            "      },\n" +
            "      \"isAD\":{\n" +
            "        \"type\": \"boolean\"\n" +
            "      },\n" +
            "      \"updateTime\":{\n" +
            "        \"type\": \"date\"\n" +
            "      }\n" +
            "    }\n" +
            "  }\n" +
            "}";

2.查询索引库

基本语法

  • 请求方式:GET

  • 请求路径:/索引库名

  • 请求参数:无

GET /索引库名

修改对应的java代码

@Test
void testExistsIndex() throws IOException {
    // 1.创建Request对象
    GetIndexRequest request = new GetIndexRequest("items");
    // 2.发送请求
    boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);
    // 3.输出
    System.err.println(exists ? "索引库已经存在!" : "索引库不存在!");
}

3.修改索引库

倒排索引结构虽然不复杂,但是一旦数据结构改变(比如改变了分词器),就需要重新创建倒排索引,这简直是灾难。因此索引库一旦创建,无法修改mapping

虽然无法修改mapping中已有的字段,但是却允许添加新的字段到mapping中,因为不会对倒排索引产生影响。因此修改索引库能做的就是向索引库中添加新字段,或者更新索引库的基础属性。

PUT /索引库名/_mapping
{
  "properties": {
    "新字段名":{
      "type": "integer"
    }
  }
}

4.删除索引库

语法:

  • 请求方式:DELETE

  • 请求路径:/索引库名

  • 请求参数:无

DELETE /索引库名

删除java代码

@Test
void testDeleteIndex() throws IOException {
    // 1.创建Request对象
    DeleteIndexRequest request = new DeleteIndexRequest("items");
    // 2.发送请求
    client.indices().delete(request, RequestOptions.DEFAULT);
}

标签:请求,keyword,索引,IK,分词器,type,ES
From: https://www.cnblogs.com/freps/p/18472981

相关文章

  • prometheus 报错 Error on ingesting samples that are too old or are too far into
    level=warnts=2021-08-16T03:20:04.960Zcaller=scrape.go:1507component="scrapemanager"scrape_pool=mtailtarget=http://18.167.146.20:3903/metricsmsg="Erroroningestingsamplesthataretoooldoraretoofarintothefuture"num_dro......
  • 【工具使用】MSF使用_MSF中kiwi(mimikatz)模块
    一、简介:kiwi模块:mimikatz模块已经合并为kiwi模块;使用kiwi模块需要system权限,所以我们在使用该模块之前需要将当前MSF中的shell提升为system。二、前提:1.提权到system权限当前权限是administrator用户若不是,需要利用其他手段先提权到administrator用户。然后adminis......
  • 2024年计算机视觉与图像处理国际学术会议 (CVIP 2024) 2024 International Conference
    文章目录一、会议详情二、重要信息三、大会介绍四、出席嘉宾五、征稿主题六、咨询一、会议详情二、重要信息大会官网:https://ais.cn/u/vEbMBz提交检索:EICompendex、IEEEXplore、Scopus三、大会介绍2024年计算机视觉与图像处理国际学术会议(CVIP2024)将于2024......
  • SciTech-AV-Video-DVP(Digital Video Processing)-CV/CG-ffmpeg-libavfilter:数字过滤
    Thisdocumentdescribesfilters,sources,andsinksprovidedbythelibavfilterlibrary.FiltergraphSyntaxFiltersinthesamelinearchainareseparatedbycommas,distinctlinearchainsoffiltersareseparatedbysemicolons.Thepointswherethelin......
  • 会话管理--Cookie和Session
    一.会话管理1.概述它是指管理和跟踪用户与系统之间交互过程的技术手段。每次当用户登录到某个网站或应用后,直到用户退出或者超时这段时间内,所发生的一系列交互就被认为是一个会话(Session)。会话管理的主要目的是确保在用户进行多步骤操作时,能够持续保持用户的登录状态,并且......
  • Nikto是一个开源的WEB扫描评估软件
    Nikto是一个开源的WEB扫描评估软件,可以对Web服务器进行多项安全测试,能在230多种服务器上扫描出2600多种有潜在危险的文件、CGI及其他问题。Nikto使用Perl语言编写运行,Nikto可以扫描指定主机的WEB类型、主机名、指定目录、特定CGI漏洞、返回主机允许的http模式等.Nikto是在Ka......
  • PostgreSQL慢SQL收集和解析
    postgresql通过log_statement参数记录慢SQL语句PostgreSQL可以不借助任何扩展实现对SQL日志的记录,主要依赖于两个参数,也即log_statement和log_min_duration_statement,1,记录的sql类型log_statement='all'可以是none,ddl,mod,all2,记录的sql执行时间阈值log_min_duration_stat......
  • 【PostgreSQL】PostgreSQL支持哪些类型的数据复制方法?
    PostgreSQL提供了多种数据复制方法,以满足不同的业务需求和场景。主要的数据复制方法可以分为两大类:物理复制(PhysicalReplication)和逻辑复制(LogicalReplication)。每种复制方式都有其特定的应用场景、优缺点以及实现机制。物理复制(PhysicalReplication)物理复制是基于......
  • python: unittest
     '''生成测试报告https://www.lambdatest.com/blog/generating-xml-and-html-report-in-pyunit-for-test-automation/unittesthttps://codedec.com/tutorials/how-to-generate-html-report-for-pytest-execution/https://docs.pytest.org/en/7.1.x/_modules/......
  • Mongodb 性能监控工具FreeMonitoring,mongostat,mongotop,Profiler,索引,分片,事务超时,Mongo
    db.users.createIndex({username:'hashed'})1#创建唯一索引db.values.createIndex({title:1},{unique:true})2#复合索引支持唯一性约束db.values.createIndex({title:1,type:1},{unique:true})3#多键索引支持唯一性约束db.inventory.createIndex({ratings:1},{uni......