【Elasticsearch】初始化默认字段及分词

1、添加分词插件

1)在线安装

执行命令

需要指定相同的版本

bin/elasticsearch-plugin.bat install https://get.infini.cloud/elasticsearch/analysis-ik/7.17.24

2)离线安装

将安装包解压到 /plugins 目录下

安装包可以从对应的资源处下载

启动成功后可以看到已经加载的插件

2、补充分词字典

将analysis-ik_config.zip 解压到 plugins\analysis-ik 目录下

压缩文件见附件资源。

3、创建自定义索引库

PUT 请求  http://127.0.0.1:9200/my_index_name

{
    "mappings": {
        "date_detection": false,
        "numeric_detection": false,
        "properties": {
            "CAT_NO": {
                "fields": {
                    "keyword": {
                        "type": "keyword"
                    }
                },
                "type": "text"
            },
            "VOL_NO": {
                "fields": {
                    "keyword": {
                        "type": "keyword"
                    }
                },
                "type": "text"
            },
            "content": {
                "type": "wildcard"
            },
            "content_file": {
                "type": "text"
            },
            "content_vt": {
                "type": "wildcard"
            }
        }
    },
    "settings": {
        "analysis": {
            "analyzer": {
                "default": {
                    "type": "ik_max_word"
                }
            }
        },
        "index": {
            "max_result_window": 100000000,
            "number_of_replicas": 1,
            "number_of_shards": 1
        }
    }
}

以上参数配置含义如下:

1. mappings 部分

mappings 用于定义文档中字段的类型和如何处理这些字段的配置。

1.1 date_detection: false
  • 作用:设置为 false 表示 Elasticsearch 不会自动将符合日期格式的字段解析为 date 类型。
  • 解释:有时候字符串字段可能看起来像日期,但其实不希望它们被自动识别为日期,设置 false 可以避免这种情况。
1.2 numeric_detection: false
  • 作用:设置为 false 表示 Elasticsearch 不会自动将符合数值格式的字段解析为 numeric 类型(如 integerdouble 等)。
  • 解释:如果有些数字其实是文本形式,不希望被自动检测为数字类型,这个配置可以避免这种转换。
1.3 properties

properties 中定义了各个字段的类型及其处理方式。

以下是业务自定义字段设置

  • CAT_NOVOL_NO 字段
    • type: text:表示该字段的数据是文本类型,适合分词和全文检索。
    • fields.keyword
      • type: keyword:在 text 字段的基础上增加了 keyword 字段,keyword 是不分词的,适合用于精确匹配(如过滤、聚合、排序等操作)。
  • contentcontent_vt 字段
    • type: wildcard 类型用于支持高效的通配符搜索。这是 Elasticsearch 7.9 引入的一种特殊数据类型,专门用于处理含有通配符查询的字段,适合快速的模式匹配搜索。
  • content_file 字段
    • type: text:文本类型字段,适合分词和全文搜索。

2. settings 部分

settings 定义了索引的行为配置,包括分析器和索引分片等设置。

2.1 analysis

analysis 定义了如何对文本进行分析处理,特别是配置了自定义的分词器。

  • analyzer.default:
    • type: ik_max_word:使用了 IK 分词器中的 ik_max_word 模式。
      • ik_max_word:是一种中文分词模式,它会将文本尽可能切分为最多的词语,适合用于最大化覆盖搜索词的场景。
2.2 index
  • max_result_window: 100000000

    • 作用:表示 Elasticsearch 允许的最大分页窗口。
    • 解释:默认情况下,Elasticsearch 的分页窗口大小(from + size)限制为 10,000 个结果。通过设置 max_result_window,可以增加这个限制到 100,000,000,这样可以处理大量数据的分页查询。不过,较大的窗口可能会增加内存消耗。
  • number_of_replicas: 1

    • 作用:表示索引的副本数,1 表示每个分片会有一个副本。
    • 解释:副本可以提高查询性能,并提供容错能力,如果某个分片宕机,副本可以替代原分片。
  • number_of_shards: 1

    • 作用:表示索引的主分片数,1 表示索引只会被划分为一个主分片。
    • 解释:分片是 Elasticsearch 的水平扩展方式。对于小数据集,1 个分片可以节省资源。如果数据量增长,可以重新索引并增加分片。

4、使用Java代码创建索引库

 
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.DefaultConnectionKeepAliveStrategy;
import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
import org.elasticsearch.action.admin.indices.create.CreateIndexRequestBuilder;
import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.support.master.AcknowledgedResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.xcontent.XContentType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.util.Map;
import java.util.regex.Pattern;

public class ElasticSearchClient {

	private RestHighLevelClient client;
	private static Logger logger = LoggerFactory.getLogger(ElasticSearchClient.class);

	private String indexdb;

	@SuppressWarnings("deprecation")
	public ElasticSearchClient() {

		String address = PropertyUtils.getProperty("indexServer");
		Integer port = Integer.parseInt(PropertyUtils.getProperty("serverPort"));
		String indexClusterName = PropertyUtils.getProperty("cluster");
		String userName = PropertyUtils.getProperty("es_user");
		String password = PropertyUtils.getProperty("es_pwd");
		
		final BasicCredentialsProvider credential = new BasicCredentialsProvider();
		// 配置身份验证
		credential.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(userName, password));

		// 该方法接收一个RequestConfig.Builder对象,对该对象进行修改后然后返回。
		// 连接超时(默认为1秒)
		// 套接字超时(默认为30秒)//更改客户端的超时限制默认30秒现在改为100*1000分钟
		client = new RestHighLevelClient(RestClient.builder(new HttpHost(address, port, "http"))
				.setRequestConfigCallback(new RestClientBuilder.RequestConfigCallback() {
					@Override
					public RequestConfig.Builder customizeRequestConfig(RequestConfig.Builder requestConfigBuilder) {
						return requestConfigBuilder.setConnectTimeout(50 * 1000).setSocketTimeout(60 * 1000);
					}
				}).setHttpClientConfigCallback(httpClientBuilder -> {
					// 设置 keep-alive 策略
					return httpClientBuilder.setDefaultCredentialsProvider(credential)
							.setKeepAliveStrategy(DefaultConnectionKeepAliveStrategy.INSTANCE);
				}));
			
		
		this.indexdb = PropertyUtils.getProperty("indexdb");
		if (StringUtil.isBlank(indexdb)) {
			indexdb = "dams_index";
		}
		try {
			//client.putScript(putStoredScriptRequest, options);
			boolean exists =  existIndex(indexdb);
			if (!exists) {
				String script = DefProperties.getScript();
				System.out.println(script);
				createIndex(indexdb, script);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

	}
 

	/**
	 * 1、创建索引
	 *
	 * @param index
	 * @throws IOException
	 */
	private boolean createIndex(String index, String source) throws IOException {
		CreateIndexRequest request = new CreateIndexRequest(index);
		request.source(source, XContentType.JSON);
		CreateIndexResponse response = client.indices().create(request, RequestOptions.DEFAULT);
		// 检查响应是否成功
        if (response.isAcknowledged()) {
            System.out.println("索引创建成功!");
        } else {
            System.out.println("索引创建失败!");
        }
        return response.isAcknowledged();

	}

	/**
	 * 测试索引是否存在
	 *
	 * @throws IOException
	 */

	public boolean existIndex(String index) throws IOException {
		GetIndexRequest request = new GetIndexRequest(index);
		boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);
		return exists;
	}
 

}

由于elasticseach内置代码中,需要将mappings中的所有对象转成Map数据类型,需要对原始的Json脚本参数进行调整, 添加 type 参数

{
    "mappings": {
        "type": {
            "date_detection": false,
            "numeric_detection": false,
            "properties": {
                "VOL_NO": {
                    "fields": {
                        "keyword": {
                            "type": "keyword"
                        }
                    },
                    "type": "text"
                },
                "content": {
                    "type": "wildcard"
                },
                "content_file": {
                    "type": "text"
                },
                "content_vt": {
                    "type": "wildcard"
                }
            }
        }
    },
    "settings": {
        "analysis": {
            "analyzer": {
                "default": {
                    "type": "ik_max_word"
                }
            }
        },
        "index": {
            "max_result_window": 100000000,
            "number_of_replicas": 1,
            "number_of_shards": 1
        }
    }
}

5、附录:全文检索配置文件

cluster.name: dams_cluster

network.host: 127.0.0.1
http.port: 9200

# 不开启geo数据库
ingest.geoip.downloader.enabled: false
 

# 设置访问账号密码
xpack.security.enabled: true
xpack.license.self_generated.type: basic
xpack.security.transport.ssl.enabled: false 


##禁止机器学习
node.ml: false
xpack.ml.enabled: false

## 与es-sql 插件冲突,不启用
xpack.sql.enabled: false 

##性能优化
## 不使用内存交换
bootstrap.memory_lock: true

### 这个 fielddata 断路器限制fielddata的大小,默认情况下为堆大小的60%。
indices.breaker.fielddata.limit: 80%
### 这个 request 断路器估算完成查询的其他部分要求的结构的大小, 默认情况下限制它们到堆大小的40%。
indices.breaker.request.limit: 60%
### 这个 total 断路器封装了 request 和 fielddata 断路器去确保默认情况下这2个部分使用的总内存不超过堆大小的70%。
indices.breaker.total.limit: 80% 
### 配置fieldData的Cache大小,可以配百分比也可以配一个准确的数值。cache到达约定的内存大小时会自动清理,驱逐一部分FieldData数据以便容纳新数据。默认值为unbounded无限。 
indices.fielddata.cache.size: 90%
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/932084.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MATLAB直流电机模型,直流电机控制

直流电机控制简介 直流电机(DC motor)广泛应用于各种机械驱动和电力控制系统中,其运行性能的控制至关重要。为了精准地控制直流电机的输出特性,可以通过不同的控制方式进行调节。常见的控制方式包括电枢电流控制、速度控制、电机位…

Linux之封装线程库和线程的互斥

Linux之封装线程库和线程的互斥与同步 一.封装线程库二.线程的互斥2.1互斥量的概念2.2初始化和销毁互斥量2.3加锁和解锁2.4互斥量的原理2.5可重入和线程安全2.6死锁 一.封装线程库 其实在我们C内部也有一个线程库而C中的线程库也是封装的原生线程库的函数,所以我们…

PHP语法学习(第九天)—PHP连接mysql详解(下)

首先,温馨提示,该部分内容跟昨天“PHP语法学习(第八天)—PHP连接mysql详解(上)”一起食用更佳噢!! 学习本篇内容必须掌握数据库基础命令点击“MYSQL 数据库”~~ 本文是接着PHP连接mysql的知识点接着讲,今天主要讲述PHP…

qt基本部分控件用法(一)

前言: 以前 windows下做工具主要是MFC,趁有点空时间,研究了QT,感觉跟MFC 差不多,VS 比 QT CREATOR 还是强大,不过QT可以跨平台,功能更强大,MFC 只能在win平台下.; 1:环境…

Mysql索引,聚簇索引,非聚簇索引,回表查询

什么是索引 数据库索引是为了实现高效数据查询的一种有序的数据数据结构,类似于书的目录,通过目录可以快速的定位到想要的数据,因为一张表中的数据会有很多,如果直接去表中检索数据效率会很低,所以需要为表中的数据建立…

以MP6924A为核心的LLC拓扑学习【一】

PFCLLC: 在PFC(功率因数校正)和LLC(谐振变换器)组成的电源系统中,各个电路有特定的作用,它们协同工作以实现高效率和高功率因数的电能转换。 1. PFC(功率因数校正)电路的作用 PFC电…

️ 在 Windows WSL 上部署 Ollama 和大语言模型的完整指南20241206

🛠️ 在 Windows WSL 上部署 Ollama 和大语言模型的完整指南 📝 引言 随着大语言模型(LLM)和人工智能的飞速发展,越来越多的开发者尝试在本地环境中部署大模型进行实验。然而,由于资源需求高、网络限制多…

1-1 ESP32开发环境配置

前言: 基于Arduio配置ESP32开发环境... 目录 前言: 1.0 安装Python 2.0 安装VSCode 3.0 VSCode实用插件 4.0 替换VSCode配置(可选) 后记 1.0 安装Python 在windows操作系统的搜索框中搜索Microsoft Store 点击获取 安装完成…

【k8s 深入学习之 event 聚合】event count累记聚合(采用 Patch),Message 聚合形成聚合 event(采用Create)

参考 15.深入k8s:Event事件处理及其源码分析 - luozhiyun - 博客园event 模块总览 EventRecorder:是事件生成者,k8s组件通过调用它的方法来生成事件;EventBroadcaster:事件广播器,负责消费EventRecorder产生的事件,然后分发给broadcasterWatcher;broadcasterWatcher:用…

AURIX TC3xx学习笔记2 GTM模块

文章目录 引言功能改进一些缩写 功能细节GTM Clock and Time Base Management (CTBM)Clock Management Unit (CMU)External Generation Unit (EGU)Configurable Clock Generation sub-unit (CFGU)Fixed Clock Generation (FXU) Time Base Unit (TBU) Cluster Configuration Mod…

在CentOS上无Parallel时并发上传.wav文件的Shell脚本解决方案

在CentOS上无Parallel时并发上传.wav文件的Shell脚本解决方案 背景概述解决方案脚本实现脚本说明使用指南注意事项在CentOS操作系统环境中,若需并发上传特定目录下的.wav文件至HTTP服务器,而系统未安装GNU parallel工具,我们可通过其他方法实现此需求。本文将介绍一种利用Sh…

QT通过在线安装器安装【详细】

在线安装器地址: 官方在线安装器:Index of /official_releases/online_installers (qt.io) 通过命令行启动安装页面 直接双击qt安装程序,在线安装会非常慢,甚至安装失败,所以通过命令行页面启动安装页面。点击wind…

保姆级教学 uniapp绘制二维码海报并保存至相册,真机正常展示图片二维码

一、获取二维码 uni.request({url: https://api.weixin.qq.com/wxa/getwxacode?access_token${getStorage("token")},responseType: "arraybuffer",method: "POST",data: {path: "/pages/index/index"},success(res) {// 转换为 Uint…

Unity类银河战士恶魔城学习总结(P166 Ailments FX 异常状态伤害粒子特效)

【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili 教程源地址:https://www.udemy.com/course/2d-rpg-alexdev/ 本章节创建了三种粒子特效,火焰,寒冰,雷电 主场景创建/特效/粒子 初始的例子特效 火焰 寒冰 雷电 En…

Java基于SpringBoot的网上订餐系统,附源码

博主介绍:✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&…

[笔记] Windows 上 Git 安装详细教程:从零开始,附带每个选项解析

Git 是目前最流行的分布式版本控制系统之一,广泛应用于软件开发和项目管理中。对于 Windows 用户来说,正确安装和配置 Git 是开始使用 Git 的第一步。本文提供一份详细的指南,帮助你在 Windows 系统上顺利安装 Git,并解释每个安装…

JavaScript编写css自定义属性

一、自定义属性 是在 CSS 中定义的变量,以 --开头。它们可以存储颜色、尺寸、字体等任何 CSS 值,并且可以在整个文档中重复使用。 :root {--primary-color: #3498db;--font-size: 16px; }body {color: var(--primary-color);font-size: var(--font-siz…

项目开发之Jenkins

文章目录 思考基础概述JenkinsMavenGit集成开发部署GitLab服务安装 实战1 新建任务需要的配置pipeline最后 思考 jenkis怎么连接github仓库? jenkis的作用是什么?基础 概述 定义:Jenkins是一款开源的持续集成(Continuous Integration&…

core Webapi jwt 认证

core cookie 验证 Web API Jwt 》》》》用户信息 namespace WebAPI001.Coms {public class Account{public string UserName { get; set; }public string UserPassword { get; set; }public string UserRole { get; set; }} }》》》获取jwt类 using Microsoft.AspNetCore.Mvc…

TCP/IP协议详解(小白)

TCP/IP协议详解 TCP/IP协议包含了一系列的协议,也叫TCP/IP协议族(TCP/IP Protocol Suite,或TCP/IP Protocols),简称TCP/IP。TCP/IP协议族提供了点对点的连结机制,并且将传输数据帧的封装、寻址、传输、路由…