Post

OpenSearch 初见

OpenSearch 初见

好的,因为选型问题,还要在来一遍ES。但是开源的已经是OpenSearch了,所以…

官方文档在这里,可以查找到本笔记的来源。并且其中有详尽的安装文档。

简介

  • OpenSearch 将数据组织成_索引_。每个索引都是 JSON_文档_的集合。单下划线前缀的,是opensearch自己添加的一些元素。

  • OpenSearch 将索引拆分为分_片_,以便在集群中的节点之间均匀分布。

  • 一个好的经验法则是将分片大小保持在 10-50 GB 之间。

  • 您使用 REST API 与 OpenSearch 集群进行交互。

查询关键词

  • match

    全文索引。会分词,模糊查询。默认分词逻辑中,单词为一组,数字算作单词一部分。中文单字为一组

  • term

    精确查询。不会拆词

  • terms

    多值匹配。同term查询,但是可以进行列表级别的匹配 约等于 mysql 的 in

  • range

    范围查询。

  • prefix

    前缀查询。

  • wildcard

    通配符模糊查询,类似 mysql 的 like,?匹配一个字符,*匹配 0~n 个字符

  • fuzzy

    不同于 mysql 的 like,它可以错误一些字,比如搜索 mock,可以搜索出 mick

  • must、must not、should

    关键词必须包含查询,全值匹配

    • should类似于mysql的或
  • match all

    查询全部

  • match_phrase

    • 分词后,待查询的字段同时匹配分词后的所有关键词

    • 顺序也必须保持一致

  • multi_match

    多字段匹配,有一个字段匹配,就满足

  • filter 和 must

    • filter 与 must 是属于同一个级别的查询方式,都可以作为 query->bool 的属性

    • filter:不计算评分, 查询效率高;有缓存(推荐)

    • must:要计算评分,查询效率低;无缓存

  • 聚合查询

    用于统计计算值

解析器

  • 只有text类型字段才能在mapping中设置analyzer

use note

查询使用特殊计算结果进行排序

1
2
3
4
5
6
7
8
9
"sort": {
		"_script": {
			"type": "number",
			"script": {
				"inline": "doc['views'].value + doc['usage'].value * 2"
			},
			"order": "desc"
		}
	}

用特殊脚本更新文档中的值

1
2
3
4
5
6
{
	"script": {
		"source": "ctx._source.views+=0;ctx._source.usage+=0;",
		"lang": "painless"
	}
}

创建索引时,自定义analyzer,进一步的,可以自定义同义词库,也可以自行组装解析器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
"settings": {
		"analysis": {
			"analyzer": {
				"whitespace_synonymous": {
					"tokenizer": "ik_smart",
					"filter": [
						"synonymous_filter"
					]
				}
			},
			"filter": {
				"synonymous_filter": {
					"type": "synonym",
					"expand": true,
					"updateable": true, // 支持动态更新
					"synonyms_path": "synonyms_file.txt"
				}
			}
		}
	}

重建索引,将索引source的文档转移到dest中,转换时,运行script的脚本

1
2
3
4
5
6
7
8
9
10
11
12
{
	"source": {
		"index": "datasets2"
	},
	"dest": {
		"index": "datasets4"
	},
	"script": {
		"lang":"painless",
      	"source":"ctx._source.views=0;ctx._source.usage=0;"
	}
}

opensearch内置类型

  • 别名(Alias):为现有字段提供一个额外的名称。

  • 二进制(Binary):以Base64编码的二进制值。

  • 数值型(Numeric):包括多种数值类型,如byte、double、float、half_float、integer、long、unsigned_long、scaled_float、short。

  • 布尔(Boolean):表示布尔值。

  • 日期(Date):以毫秒存储的日期。

  • IP地址(IP):IPv4或IPv6格式的IP地址。

  • 范围(Range):表示值的范围,如integer_range、long_range、double_range、float_range、date_range、ip_range。

  • 对象(Object):一个JSON对象。

  • 嵌套(Nested):当数组中的对象需要独立索引时使用。

  • 字符串(String):包括关键字(keyword)和文本(text),前者不进行分析,后者进行分析。

  • 自动完成(Autocomplete):通过完成建议器提供自动完成功能。

  • 地理位置(Geographic):包括地理点(geo_point)和地理形状(geo_shape)。

  • 排名(Rank):用于文档相关性评分的提升或降低。

  • k-NN向量(k-NN Vector):允许将k-NN向量索引到OpenSearch中,并进行各种类型的k-NN搜索。

使用opensearch-operator部署

步骤

TODO

节点内容

  • Coordinators (协调节点):

    • 协调节点主要负责处理传入的请求,查询分发和聚合结果。

    • 它们通常不存储数据,也不执行数据处理任务,而是作为客户端请求的负载均衡器和路由器。

  • Nodes (节点):

    • 这是一个通用术语,用于描述集群中的任何单个服务器或实例。

    • 节点可以承担不同的角色,如主节点、数据节点、协调节点等。

  • Masters (主节点):

    • 主节点负责集群的管理和控制。这包括管理集群状态、执行所有更新操作(如添加/删除索引)和任务调度。

    • 为了避免单点故障,通常会有多个主节点,但在任何时候只有一个主节点是活跃的(即主要的主节点)。

  • NodePools (节点池):

    • 节点池是一组具有相同配置和角色的节点。这可以帮助组织和管理具有类似特性和用途的节点。

    • 在 Kubernetes 中,这可能对应于一组具有相同配置的 Pod。

  • Dashboards (仪表板):

    • Dashboards 是 OpenSearch Dashboards 的引用,这是一个与 OpenSearch 配套的数据可视化和管理界面。

    • 它允许用户创建和查看图表、地图和仪表板,用于分析和可视化存储在 OpenSearch 中的数据。

  • ConfMgmt (配置管理):

    • 这部分涉及集群配置的管理,包括如何更新和应用新的配置设置。

    • 在 Kubernetes 环境中,这可能涉及配置映射(ConfigMaps)和自动化配置更新。

  • General (通用配置):

    • 这通常指的是适用于整个 OpenSearch 集群的通用配置。

    • 这可能包括网络设置、资源分配、日志记录配置等。

This post is licensed under CC BY 4.0 by the author.