【搜索客社区日报】第2037期 (2025-05-14)
社区日报 • kin122 发表了文章 • 0 个评论 • 98 次浏览 • 10 小时前
https://mp.weixin.qq.com/s/jGZDS7ows_JwUXkaNn7nDQ
2.可观测性方案怎么选?SelectDB vs Elasticsearch vs ClickHouse
https://mp.weixin.qq.com/s/0WRpqTNpiCZtLGw7mHQk0Q
3.可观测性2.0?还是只是日志的卷土重来?
https://mp.weixin.qq.com/s/t48vWLEiJAkln2MD3FppXg
编辑:kin122
更多资讯:http://news.searchkit.cn
【搜索客社区日报】第2036期 (2025-05-13)
社区日报 • God_lockin 发表了文章 • 0 个评论 • 104 次浏览 • 12 小时前
https://medium.com/%40muriloli ... c7d9a
2. 想不想给ES自动升版本?(需要梯子)
https://medium.com/%40akhil.ch ... 204ea
3. 拿那个logstash把日志搞进来!(需要梯子)
https://levelup.gitconnected.c ... 86783
编辑:斯蒂文
更多资讯:http://news.searchkit.cn
谈谈 ES 6.8 到 7.10 的功能变迁(6)- 其他
Elasticsearch • INFINI Labs 小助手 发表了文章 • 0 个评论 • 201 次浏览 • 1 天前

这是 ES 7.10 相较于 ES 6.8 新增内容的最后一篇,主要涉及算分方法和同义词加载的部分。
自定义算分:script_score 2.0
Elasticsearch 7.0 引入了新一代的函数分数功能,称为 script_score
查询。这一新功能提供了一种更简单、更灵活的方式来为每条记录生成排名分数。script_score
查询由一组函数构成,包括算术函数和距离函数,用户可以根据需要混合和匹配这些函数,以构建任意的分数计算逻辑。这种模块化的结构使得使用更加简便,同时也为更多用户提供了这一重要功能的访问权限。通过 script_score
,用户可以根据复杂的业务逻辑自定义评分,而不仅仅依赖于传统的 TF-IDF 或 BM25 算法。例如,可以根据文档的地理位置、时间戳、或其他自定义字段的值来调整评分,从而更精确地控制搜索结果的排序。
script_score 是 ES 对 function score 功能的一个迭代替换。
常用函数
基本函数
用于对字段值或评分进行基本的数学运算。
doc[<field>].value
获取文档中某个字段的值。
<br /> "script": {<br /> "source": "doc['price'].value * 1.2"<br /> }<br />
算术运算
支持加 (+
)、减 (-
)、乘 (*
)、除 (/
)、取模 (%
) 等操作。
<br /> "script": {<br /> "source": "doc['price'].value + (doc['discount'].value * 0.5)"<br /> }<br />
Saturation 函数
saturation
函数用于对字段值进行饱和处理,限制字段值对评分的影响范围。
<br /> "script": {<br /> "source": "saturation(doc['<field_name>'].value, <pivot>)"<br /> }<br />
<field_name>
: 需要处理的字段。<pivot>
: 饱和点(pivot),当字段值达到该值时,评分增益趋于饱和。
<br /> //在这个示例中,`likes` 字段的值在达到 `100` 后,对评分的影响会趋于饱和。<br /> {<br /> "query": {<br /> "script_score": {<br /> "query": {<br /> "match_all": {}<br /> },<br /> "script": {<br /> "source": "saturation(doc['likes'].value, 100)"<br /> }<br /> }<br /> }<br /> }<br />
Sigmoid 函数
sigmoid
函数用于对字段值进行 S 形曲线变换,平滑地调整字段值对评分的影响。
<br /> "script": {<br /> "source": "sigmoid(doc['<field_name>'].value, <pivot>, <exponent>)"<br /> }<br />
-
需要处理的字段。
-
中心点(pivot),S 形曲线的中点。
-
指数,控制曲线的陡峭程度。
```
//在这个示例中,`likes` 字段的值在 `50` 附近对评分的影响最为显著,而随着值远离 `50`,影响会逐渐平滑。
{
"query": {
"script_score": {
"query": {
"match_all": {}
},
"script": {
"source": "sigmoid(doc['likes'].value, 50, 0.5)"
}
}
}
}
```
#### 距离衰减函数
用于衰减计算地理位置的函数。
```
//相关函数
double decayGeoLinear(String originStr, String scaleStr, String offsetStr, double decay, GeoPoint docValue)
double decayGeoExp(String originStr, String scaleStr, String offsetStr, double decay, GeoPoint docValue)
double decayGeoGauss(String originStr, String scaleStr, String offsetStr, double decay, GeoPoint docValue)
"script" : {
"source" : "decayGeoExp(params.origin, params.scale, params.offset, params.decay, doc['location'].value)",
"params": {
"origin": "40, -70.12",
"scale": "200km",
"offset": "0km",
"decay" : 0.2
}
}
```
#### 数值衰减函数
用于衰减计算数值的函数。
```
//相关函数
double decayNumericLinear(double origin, double scale, double offset, double decay, double docValue)
double decayNumericExp(double origin, double scale, double offset, double decay, double docValue)
double decayNumericGauss(double origin, double scale, double offset, double decay, double docValue)
"script" : {
"source" : "decayNumericLinear(params.origin, params.scale, params.offset, params.decay, doc['dval'].value)",
"params": {
"origin": 20,
"scale": 10,
"decay" : 0.5,
"offset" : 0
}
}
```
#### 日期衰减函数
用于衰减计算日期的函数。
```
//相关函数
double decayDateLinear(String originStr, String scaleStr, String offsetStr, double decay, JodaCompatibleZonedDateTime docValueDate)
double decayDateExp(String originStr, String scaleStr, String offsetStr, double decay, JodaCompatibleZonedDateTime docValueDate)
double decayDateGauss(String originStr, String scaleStr, String offsetStr, double decay, JodaCompatibleZonedDateTime docValueDate)
"script" : {
"source" : "decayDateGauss(params.origin, params.scale, params.offset, params.decay, doc['date'].value)",
"params": {
"origin": "2008-01-01T01:00:00Z",
"scale": "1h",
"offset" : "0",
"decay" : 0.5
}
}
```
#### 随机函数
用于生成随机评分。
_randomNotReproducible`_ 生成一个随机评分。
```
"script" : {
"source" : "randomNotReproducible()"
}
```
_randomReproducible_ 使用种子值生成可重复的随机评分。
```
"script" : {
"source" : "randomReproducible(Long.toString(doc['_seq_no'].value), 100)"
}
```
#### 字段值因子
用于根据字段值调整评分。
_field_value_factor`_ 根据字段值调整评分。
```
"script" : {
"source" : "Math.log10(doc['field'].value * params.factor)",
params" : {
"factor" : 5
}
}
```
#### 其他实用函数
- Math.log:计算对数,
Math.log(doc['price'].value)
- Math.sqrt:计算平方根,
Math.sqrt(doc['popularity'].value)
- Math.pow:计算幂次,
Math.pow(doc['score'].value, 2)
同义词字段重加载
Elasticsearch 7.3 引入了同义词字段重加载功能,允许用户在更新同义词文件后,无需重新索引即可使更改生效。
这一功能极大地简化了同义词管理的流程,尤其是在需要频繁更新同义词的场景下。通过_reload_search_analyzers
API,用户可以重新加载指定索引的分词器,从而使新的同义词规则立即生效。
注意,虽然同义词词典能被热加载,但是已经生成的索引数据不会被修改。
测试代码
<br /> PUT /my_index<br /> {<br /> "settings": {<br /> "index" : {<br /> "analysis" : {<br /> "analyzer" : {<br /> "my_synonyms" : {<br /> "tokenizer" : "whitespace",<br /> "filter" : ["synonym"]<br /> }<br /> },<br /> "filter" : {<br /> "synonym" : {<br /> "type" : "synonym_graph",<br /> "synonyms_path" : "analysis/synonym.txt",<br /> "updateable" : true<br /> }<br /> }<br /> }<br /> }<br /> },<br /> "mappings": {<br /> "properties": {<br /> "text": {<br /> "type": "text",<br /> "analyzer" : "standard",<br /> "search_analyzer": "my_synonyms"<br /> }<br /> }<br /> }<br /> }<br /> <br /> POST /my_index/_reload_search_analyzers<br />
执行上述请求后,Elasticsearch 会重新加载my_index
索引的分析器,使最新的同义词规则生效。
case insensitive 参数
case_insensitive
参数允许用户在执行精确匹配查询时忽略大小写。
这一功能特别适用于需要处理大小写不敏感数据的场景,例如用户名、标签或分类代码等。通过设置case_insensitive
为true
,用户可以在不修改数据的情况下,实现对大小写不敏感的查询,从而简化查询逻辑并提高搜索的准确性。
测试代码
<br /> //在这个示例中,`term` 查询会匹配 `user` 字段值为 `JohnDoe`、`johndoe` 或 `JOHNDOE` 的文档,而忽略大小写差异。<br /> {<br /> "query": {<br /> "term": {<br /> "user": {<br /> "value": "JohnDoe",<br /> "case_insensitive": true<br /> }<br /> }<br /> }<br /> }<br />
小结
Elasticsearch 作为一款强大的开源搜索和分析引擎,其版本的不断迭代带来了诸多显著的改进与优化。对比 Elasticsearch 6.8,Elasticsearch 7.10 在多个方面展现出了新的功能和特性,极大地提升了用户体验和系统性能。这系列文章简短的介绍了各个方面的新功能和优化,希望能给大家一定的帮助。
推荐阅读
- [谈谈 ES 6.8 到 7.10 的功能变迁(1)- 性能优化篇](https://infinilabs.cn/blog/202 ... part-1)
- [谈谈 ES 6.8 到 7.10 的功能变迁(2)- 字段类型篇](https://infinilabs.cn/blog/202 ... part-2)
- [谈谈 ES 6.8 到 7.10 的功能变迁(3)- 查询方法篇](https://infinilabs.cn/blog/202 ... part-3)
- [谈谈 ES 6.8 到 7.10 的功能变迁(4)- 聚合功能篇](https://infinilabs.cn/blog/202 ... part-4)
- [谈谈 ES 6.8 到 7.10 的功能变迁(5)- 任务和集群管理](https://infinilabs.cn/blog/202 ... part-5)
关于极限科技(INFINI Labs)

极限科技,全称极限数据(北京)科技有限公司,是一家专注于实时搜索与数据分析的软件公司。旗下品牌极限实验室(INFINI Labs)致力于打造极致易用的数据探索与分析体验。
极限科技是一支年轻的团队,采用天然分布式的方式来进行远程协作,员工分布在全球各地,希望通过努力成为中国乃至全球企业大数据实时搜索分析产品的首选,为中国技术品牌输出添砖加瓦。
官网:<https://infinilabs.cn>
作者:金多安,极限科技(INFINI Labs)搜索运维专家,Elastic 认证专家,搜索客社区日报责任编辑。一直从事与搜索运维相关的工作,日常会去挖掘 ES / Lucene 方向的搜索技术原理,保持搜索相关技术发展的关注。
原文:https://infinilabs.cn/blog/202 ... rt-6/
谈谈 ES 6.8 到 7.10 的功能变迁(5)- 任务和集群管理
Elasticsearch • INFINI Labs 小助手 发表了文章 • 0 个评论 • 200 次浏览 • 1 天前

这一篇我们继续了解 ES 7.10 相较于 ES 6.8 调优的集群管理和任务管理的方法,主要有断联查询的主动取消、投票节点角色、异步查询和可搜索快照四个功能。
Query 自动取消
对于一个完善的产品来说,当一个任务发起链接主动断联的时候,服务端与之相关的任务应该也都被回收。但是这个特性到了 elasticsearch 7.4 版本才有了明确的声明。
Elasticsearch now automatically terminates queries sent through the _search endpoint when the initiating connection is closed.
相关的 PR 和 issue 在这里,对源码有兴趣的同学可以挖掘一下。
PR:https://github.com/elastic/ela ... 43332
issue:https://github.com/elastic/ela ... 43105
简单来说,ES 接受在某个查询的 http 链接断掉的时候,与其相关的父子任务的自动取消。原来的场景下可能需要手工一个个关闭。
实际测试
利用 painless 模拟复杂查询,下面这个查询在测试集群上能维持 5s 左右
<br /> GET /_search?max_concurrent_shard_requests=1<br /> {<br /> "query": {<br /> "bool": {<br /> "must": [<br /> {<br /> "script": {<br /> "script": {<br /> "lang": "painless",<br /> "source": """<br /> long sum = 0;<br /> for (int i = 0; i < 100000; i++) {<br /> sum += i;<br /> }<br /> return true;<br /> """<br /> }<br /> }<br /> },<br /> {<br /> "script": {<br /> "script": {<br /> "lang": "painless",<br /> "source": """<br /> long product = 1;<br /> for (int i = 1; i < 100000; i++) {<br /> product *= i;<br /> }<br /> return true;<br /> """<br /> }<br /> }<br /> },<br /> {<br /> "script": {<br /> "script": {<br /> "lang": "painless",<br /> "source": """<br /> long factorial = 1;<br /> for (int i = 1; i < 100000; i++) {<br /> factorial *= i;<br /> }<br /> long squareSum = 0;<br /> for (int j = 0; j < 100000; j++) {<br /> squareSum += j * j;<br /> }<br /> return true;<br /> """<br /> }<br /> }<br /> },<br /> {<br /> "script": {<br /> "script": {<br /> "lang": "painless",<br /> "source": """<br /> long fib1 = 0;<br /> long fib2 = 1;<br /> long next;<br /> for (int i = 0; i < 100000; i++) {<br /> next = fib1 + fib2;<br /> fib1 = fib2;<br /> fib2 = next;<br /> }<br /> return true;<br /> """<br /> }<br /> }<br /> }<br /> ]<br /> }<br /> }<br /> }<br />
查看任务被终止的状态
<br /> GET /_tasks?detailed=true&actions=*search*<br />
测试脚本,判断上面该查询被取消后是否还可以查到任务
```python
import requests
import multiprocessing
import time
from requests.exceptions import RequestException
from datetime import datetime
Elasticsearch 地址
ES_URL = "<a href="http://localhost:9210"" rel="nofollow" target="_blank">http://localhost:9210" # 6.8版本地址
ES_URL = "<a href="http://localhost:9201"" rel="nofollow" target="_blank">http://localhost:9201"
耗时查询的 DSL
LONG_RUNNING_QUERY = {"size":0,
"query": {
"bool": {
"must": [
{
"script": {
"script": {
"lang": "painless",
"source": """
long sum = 0;
for (int i = 0; i < 100000; i++) {
sum += i;
}
return true;
"""
}
}
},
{
"script": {
"script": {
"lang": "painless",
"source": """
long product = 1;
for (int i = 1; i < 100000; i++) {
product = i;
}
return true;
"""
}
}
},
{
"script": {
"script": {
"lang": "painless",
"source": """
long factorial = 1;
for (int i = 1; i < 100000; i++) {
factorial = i;
}
long squareSum = 0;
for (int j = 0; j < 100000; j++) {
squareSum += j * j;
}
return true;
"""
}
}
},
{
"script": {
"script": {
"lang": "painless",
"source": """
long fib1 = 0;
long fib2 = 1;
long next;
for (int i = 0; i < 100000; i++) {
next = fib1 + fib2;
fib1 = fib2;
fib2 = next;
}
return true;
"""
}
}
}
]
}
}
}
用于同步的事件对象
query_finished = multiprocessing.Event()
新增:进程终止标志位
process_terminated = multiprocessing.Event()
定义一个函数用于添加时间戳到日志
def log_with_timestamp(message,*message1):
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
print(f"[{timestamp}] {message}+{message1}")
发起查询的函数
def run_query():
try:
log_with_timestamp("发起查询...")
session = requests.Session()
response = session.post(
f"{ES_URL}/_search",
json=LONG_RUNNING_QUERY,
stream=True # 启用流式请求,允许后续中断
)
try:尝试读取响应内容(如果连接未被中断)
if response.status_code == 200:
log_with_timestamp("查询完成,结果:", response.json())
else:
log_with_timestamp("查询失败,错误信息:", response.text)
except RequestException as e:
log_with_timestamp("请求被中断:", e)
finally:标记查询完成
query_finished.set()
中断连接的信号函数
def interrupt_signal():
time.sleep(1) # 等待 1 秒
log_with_timestamp("发出中断查询信号...")标记可以中断查询了
query_finished.set()
检测任务是否存在的函数
def check_task_exists():
等待进程终止标志位
process_terminated.wait()
max_retries = 3
retries = 0
time.sleep(1) #1s后检查
while retries < max_retries:
log_with_timestamp("检查任务是否存在...")
tasks_url = f"{ES_URL}/_tasks?detailed=true&actions=search"
try:
tasks_response = requests.get(tasks_url)
if tasks_response.status_code == 200:
tasks = tasks_response.json().get("nodes")
if tasks:
log_with_timestamp("任务仍存在:", tasks)
else:
log_with_timestamp("任务已消失")
break
else:
log_with_timestamp("获取任务列表失败,错误信息:", tasks_response.text)
except RequestException as e:
log_with_timestamp(f"检测任务失败(第 {retries + 1} 次重试): {e}")
retries += 1
time.sleep(1) # 等待 1 秒后重试
if retries == max_retries:
log_with_timestamp("达到最大重试次数,无法检测任务状态。")
主函数
def main():
启动查询进程
query_process = multiprocessing.Process(target=run_query)
query_process.start()
启动中断信号进程
interrupt_process = multiprocessing.Process(target=interrupt_signal)
interrupt_process.start()
等待中断信号
query_finished.wait()
检查查询进程是否还存活并终止它
if query_process.is_alive():
log_with_timestamp("尝试中断查询进程...")
query_process.terminate()
log_with_timestamp("查询进程已终止")新增:设置进程终止标志位
process_terminated.set()
启动任务检测进程
check_process = multiprocessing.Process(target=check_task_exists)
check_process.start()
等待所有进程完成
query_process.join()
interrupt_process.join()
check_process.join()
if name == "main":
main()
<br /> <br /> 实际测试结果:<br /> <br />
shell6.8 版本
[2025-02-08 15:17:21] 发起查询...+()
[2025-02-08 15:17:22] 发出中断查询信号...+()
[2025-02-08 15:17:22] 尝试中断查询进程...+()
[2025-02-08 15:17:22] 查询进程已终止+()
[2025-02-08 15:17:23] 检查任务是否存在...+()
[2025-02-08 15:17:23] 任务仍存在:+({'fYMNv_KxQGCGzhgfMxPXuA': {......}},)
<br /> <br /> 可以看到在查询任务被终止后 1s 再去检查,任务仍然存在<br /> <br />
shell7.10 版本
[2025-02-08 15:18:16] 发起查询...+()
[2025-02-08 15:18:17] 发出中断查询信号...+()
[2025-02-08 15:18:17] 尝试中断查询进程...+()
[2025-02-08 15:18:17] 查询进程已终止+()
[2025-02-08 15:18:18] 检查任务是否存在...+()
[2025-02-08 15:18:18] 任务已消失+()
```
这里可以看到任务已经检测不到了。
关于 timeout 配置
这里展开讨论下,timeout 配置。超时回收处理是一个‘best effort’行为。
(Optional, time units) Specifies the period of time to wait for a response. If no response is received before the timeout expires, the request fails and returns an error. Defaults to no timeout.
the search request is more of a best effort and does not guarantee that the request will never last longer than the specified amount of time.
异步搜索
使用方法
可以让用户进行异步的搜索,可以通过相关参数进行检查维护该搜索的状态和结果。比较合适查询量较大但对延迟要求较低的查询,进行精细化的管理控制。
注意:这里的参数基本都是添加到 url 上的,并不是添加到 request body 上的。
<br /> POST test_index/_async_search?keep_on_completion=true<br /> {<br /> "query": {<br /> "match_all": {}<br /> }<br /> }<br />
注:这里为了产生查询结果 id 使用了 keep_on_completion 参数,这个参数的使用见下面解释。
返回结果,和一般的查询结果不同的是,添加了结果 id 和查询的一些状态数据。
json<br /> {<br /> "id": "Fmk2b0VjM2FEVE9Dbk9TemVyOTlkMncbOFlwRGU2OWZTa2kxNEpoT0Q2bVZrZzozODIz",//结果id,可以用于后续的复查<br /> "is_partial": false,//是否为部分完成结果<br /> "is_running": false,//是否还在查询<br /> "start_time_in_millis": 1738978637287,//查询产生时间戳<br /> "expiration_time_in_millis": 1739410637287,//查询结果过期时间戳<br /> "response": {<br /> "took": 1,<br /> "timed_out": false,<br /> "_shards": {<br /> "total": 1,<br /> "successful": 1,<br /> "skipped": 0,<br /> "failed": 0<br /> },<br /> "hits": {<br /> "total": {<br /> "value": 3,<br /> "relation": "eq"<br /> },<br /> "max_score": 1,<br /> "hits": [······]<br /> }<br /> }<br /> }<br />
管理查询结果
<br /> //查询结果和第一次返回的内容一致<br /> GET /_async_search/Fmk2b0VjM2FEVE9Dbk9TemVyOTlkMncbOFlwRGU2OWZTa2kxNEpoT0Q2bVZrZzozODIz<br /> <br /> //主动删除查询结果<br /> DELETE /_async_search/Fmk2b0VjM2FEVE9Dbk9TemVyOTlkMncbOFlwRGU2OWZTa2kxNEpoT0Q2bVZrZzozODIz<br /> <br />
关键参数
- wait_for_completion_timeout:参数(默认为 1 秒),这个参数用来设置异步查询的等待时间。当异步搜索在此时间内完成时,响应将不包括 ID,结果也不会存储在集群中。
- keep_on_completion:参数(默认为 false)可以设置为 true,可以强制存储查询结果,即便在 wait_for_completion_timeout 设置时间内完成搜索,该结果也能被查询到。
- keep_alive:指定异步搜索结果可以被保存多长时间,默认为 5d(5 天)。在此期间之后,正在进行的异步搜索和任何保存的搜索结果将被删除。
- batched_reduce_size:是 Elasticsearch 中的一个配置参数,默认值为 5。它的作用是控制分片结果的部分归并频率,具体来说,它决定了协调节点(coordinating node)在接收到多少个分片的响应后,会执行一次部分结果归并(partial reduction)。
- pre_filter_shard_size:是 Elasticsearch 中与查询执行相关的一个参数,它的默认值为 1,并且不可更改。这个参数的作用是强制 Elasticsearch 在执行查询之前,先进行一轮预过滤(pre-filter),以确定哪些分片(shard)可能包含与查询匹配的文档,从而跳过那些肯定不包含匹配文档的分片。
查询结果存储位置
异步查询的结果部分存储在.async-search
中,但是进行了程序加密,内容对使用者不可见。
<br /> GET .async-search/_search<br /> // 返回的结果<br /> ···<br /> "hits": [<br /> {<br /> "_index": ".async-search",<br /> "_type": "_doc",<br /> "_id": "bPNotcTCTV-gSIiZLuK0IA",<br /> "_score": 1,<br /> "_source": {<br /> "result": "i6+xAwFERm1KUVRtOTBZMVJEVkZZdFoxTkphVnBNZFVzd1NVRWJPRmx3UkdVMk9XWlRhMmt4TkVwb1QwUTJiVlpyWnpvek1EWTEAAQEDAD+AAAADP4AAAAAAABR0Sm9yNDVRQlQ3bzBsZTdsYmp0TgAAAARfZG9jAP//////////AwALeyJhIjoxMTExfQoAAAAAAAAAAQEAAAAWOFlwRGU2OWZTa2kxNEpoT0Q2bVZrZwp0ZXN0X2luZGV4Fk5fYmphNXM1UWtpcnU4RXdleVlGSUEAAAA/gAAAAAAAFHRab3I0NVFCVDdvMGxlN2xlVHNrAAAABF9kb2MA//////////8DAAt7ImEiOjExMTJ9CgAAAAAAAAABAQAAABY4WXBEZTY5ZlNraTE0SmhPRDZtVmtnCnRlc3RfaW5kZXgWTl9iamE1czVRa2lydThFd2V5WUZJQQAAAD+AAAAAAAAUdHBvcjQ1UUJUN28wbGU3bGZqc28AAAAEX2RvYwD//////////wMAC3siYSI6MTExM30KAAAAAAAAAAEBAAAAFjhZcERlNjlmU2tpMTRKaE9ENm1Wa2cKdGVzdF9pbmRleBZOX2JqYTVzNVFraXJ1OEV3ZXlZRklBAAAAAAAAAAAAAgABAQEAAAAAAAsAAAAAAAABlOMuvCQAAAGU/O6IJA==",<br /> "headers": {},<br /> "expiration_time": 1739410278436,<br /> "response_headers": {}<br /> }<br /> },<br /> ···<br />
只投票候选节点
这是一个主候选节点角色的优化,能相对固定 master 节点的位置,减少了选举候选节点过多的问题。
作用
Voting - only master - eligible node(仅参与投票的具备主节点资格的节点)在 Elasticsearch 集群中有以下作用:
- 参与主节点选举:该节点参与主节点选举过程,但本身不会成为集群选出的主节点,主要作为选举中的决胜因素(打破平局)。
- 保障高可用性:在高可用性(HA)集群中,至少需要三个具备主节点资格的节点,其中至少两个不能是仅参与投票的节点,这样即使有一个节点故障,集群仍能选出主节点。
- 分担选举及状态发布任务:和普通具备主节点资格的节点一样,在集群状态发布期间承担特定任务。
- 灵活承担其他角色:可以同时承担集群中的其他角色,如数据节点;也可以作为专用节点,不承担其他角色。
配置
三个节点的集群:可以配置两个普通主节点资格节点和一个仅参与投票的节点。这样在一个普通主节点故障时,剩下的普通主节点和仅参与投票的节点一起可以完成主节点选举,保证集群的正常运行。
理论上,主候选节点数量能满足不同区域间的主备切换要求即可,其余可以都是投票节点。
可搜索快照
注意:这是一个收费功能
实现机制
可搜索快照让你能够通过使用快照来保障数据恢复能力,而非在集群内维护副本分片,从而降低运营成本。
当你将快照中的索引挂载为可搜索快照时,Elasticsearch 会将索引分片复制到集群内的本地存储中。这能确保搜索性能与搜索其他任何索引相当,并尽量减少对访问快照存储库的需求。如果某个节点发生故障,可搜索快照索引的分片会自动从快照存储库中恢复。
搜索可搜索快照索引与搜索其他任何索引的方式相同。搜索性能与常规索引相当,因为在挂载可搜索快照时,分片数据会被复制到集群中的节点上。
如果某个节点发生故障,且需要从快照中恢复可搜索快照分片,在 Elasticsearch 将分片分配到其他节点的短暂时间内,集群健康状态将不会显示为绿色。在这些分片重新分配完成之前,对这些分片的搜索将会失败或返回部分结果。
对于搜索频率较低的数据,这能显著节省成本。使用可搜索快照,不再需要额外的索引分片副本以避免数据丢失,这有可能将搜索该数据所需的节点本地存储容量减少一半。同时可搜索快照依赖于备份使用的快照,也不需要额外的空间。
使用建议
- 从含多索引的快照挂载单个索引时,建议进行使用分隔,创建仅含目标索引的快照副本并挂载,方便独立管理备份与可搜索快照生命周期。
- 挂载为可搜索快照索引前,建议将索引强制合并为每分片一个段,减少从存储库读取数据的操作和成本。
实际测试
基础配置
前提条件:需要一个镜像使用存储,这里使用 minIO 作为测试
- 安装 S3 插件,并注册快照库信息
```
在线安装插件
elasticsearch-plugin install repository-s3
设置访问minio的信息,elasticsearch的bin目录下,使用minIO中设置的用户名密码
./elasticsearch-keystore add s3.client.default.access_key
./elasticsearch-keystore add s3.client.default.secret_key
重载安全设置,然后重启节点
POST _nodes/reload_secure_settings
注册快照库
PUT _snapshot/my-minio-repository
{
"type": "s3",
"settings": {
"bucket": "es-bucket",
"endpoint": "<a href="http://127.0.0.1:9002"" rel="nofollow" target="_blank">http://127.0.0.1:9002",
"compress": true
}
}
```
- 挂载需要的快照索引
<br /> POST /_snapshot/my-minio-repository/snapshot_es_prp_cmain_20240829/_mount?wait_for_completion=true<br /> {<br /> "index": "es_prp_cmain_insured_itemkind_detail_formal_20240829",<br /> "renamed_index": "test_searchable_snapshot",//挂载时对索引进行重命名<br /> "index_settings": {<br /> "index.number_of_replicas": 0<br /> },<br /> "ignore_index_settings": [ "index.refresh_interval" ]<br /> }<br />
- 检查空间占用
<br /> GET _cat/indices/test_searchable_snapshot?v<br /> health status index uuid pri rep docs.count docs.deleted store.size pri.store.size<br /> green open test_searchable_snapshot qROj2flcRdiGOZaejeAmQQ 1 0 10000 0 21.3mb 21.3mb<br />
在系统上也看到了对应 uuid 的文件目录
<br /> [root@hcss-ecs 0]# ls<br /> _state snapshot_cache translog<br /> [root@hcss-ecs 0]# pwd<br /> /data/elasticsearch-7.10.2/data/nodes/0/indices/qROj2flcRdiGOZaejeAmQQ/0<br />
小结
这篇的内容讲解测试的相对较细,对于查询的自动取消和异步查询增加了 ES 查询任务的灵活性;只投票节点也是加强了主节点选举的稳定性;可搜索快照是成本和功能的均衡方法,对于日志场景的使用是一个不错的选择。
推荐阅读
- [谈谈 ES 6.8 到 7.10 的功能变迁(1)- 性能优化篇](https://infinilabs.cn/blog/202 ... part-1)
- [谈谈 ES 6.8 到 7.10 的功能变迁(2)- 字段类型篇](https://infinilabs.cn/blog/202 ... part-2)
- [谈谈 ES 6.8 到 7.10 的功能变迁(3)- 查询方法篇](https://infinilabs.cn/blog/202 ... part-3)
- [谈谈 ES 6.8 到 7.10 的功能变迁(4)- 聚合功能篇](https://infinilabs.cn/blog/202 ... part-4)
- [谈谈 ES 6.8 到 7.10 的功能变迁(6)- 其他](https://infinilabs.cn/blog/202 ... part-6)
关于极限科技(INFINI Labs)

极限科技,全称极限数据(北京)科技有限公司,是一家专注于实时搜索与数据分析的软件公司。旗下品牌极限实验室(INFINI Labs)致力于打造极致易用的数据探索与分析体验。
极限科技是一支年轻的团队,采用天然分布式的方式来进行远程协作,员工分布在全球各地,希望通过努力成为中国乃至全球企业大数据实时搜索分析产品的首选,为中国技术品牌输出添砖加瓦。
官网:<https://infinilabs.cn>
作者:金多安,极限科技(INFINI Labs)搜索运维专家,Elastic 认证专家,搜索客社区日报责任编辑。一直从事与搜索运维相关的工作,日常会去挖掘 ES / Lucene 方向的搜索技术原理,保持搜索相关技术发展的关注。
原文:https://infinilabs.cn/blog/202 ... rt-5/
【搜索客社区日报】第2035期 (2025-05-12)
社区日报 • Muses 发表了文章 • 0 个评论 • 413 次浏览 • 2 天前
https://hdxu.cn/128g7
1、Elasticsearch中的三种分页策略深度解析:原理、使用及对比
https://blog.csdn.net/qq_26664 ... 98228
2、Easysearch 基础运维扫盲指南:从 HTTP 到 HTTPS、认证与安全访问全解析
https://mp.weixin.qq.com/s/HR7E7HAfS4ntpSkD_r5_Zw
3、MySQL数据实时接入Easysearch,零代码迁移全流程
https://mp.weixin.qq.com/s/bVGf8v6RAQljficJrjEISw
4、字节跳动开源了一款 Deep Research 项目
https://mp.weixin.qq.com/s/ejE6bfR_lFQutPy-u_pzmQ
5、最强中文TTS接入MCP-Server,效果再次封神!
https://mp.weixin.qq.com/s/ivjDIwYXIqxyV3kOvJ2VhQ
编辑:Muse
更多资讯:http://news.searchkit.cn
INFINI Console 纳管 Elasticsearch 9(二):日志监控
Elasticsearch • INFINI Labs 小助手 发表了文章 • 0 个评论 • 499 次浏览 • 2 天前
前面介绍过 INFINI Console 纳管 Elasticsearch 9(一),进行指标监控、数据管理、DSL 语句执行,但日志监控功能需要结合 [Agent](https://docs.infinilabs.com/agent/main/zh/) 才能使用。现在来实现一下:
Agent 需要和 ES 部署到同一机器上,这里是在我本地电脑上进行安装。
安装 Elastisearch
bash<br /> curl -O <a href="https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-9.0.0-darwin-x86_64.tar.gz" rel="nofollow" target="_blank">https://artifacts.elastic.co/d ... ar.gz</a><br /> curl <a href="https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-9.0.0-darwin-x86_64.tar.gz.sha512" rel="nofollow" target="_blank">https://artifacts.elastic.co/d ... ha512</a> | shasum -a 512 -c -<br /> tar -xzf elasticsearch-9.0.0-darwin-x86_64.tar.gz<br /> cd elasticsearch-9.0.0/<br /> ./bin/elasticsearch<br />

将 ES 注册到 Console 中。


安装 Agent
bash<br /> curl -O <a href="https://release.infinilabs.com/agent/stable/agent-1.29.2-2008-mac-amd64.zip" rel="nofollow" target="_blank">https://release.infinilabs.com ... 4.zip</a><br /> mkdir agent<br /> unzip agent-1.29.2-2008-mac-amd64.zip -d agent/<br /> cd agent<br />
修改配置文件 agent.yml,填写正确的 Console 地址。

启动 Agent,成功注册到 Console,获取到相关配置,但连接 Console 系统集群出现异常,这是因为 Console 系统集群是 Docker 部署的(172.17.0.2 是 Docker 内部 IP)。

通过 Console 修改 Agent 配置。


注:Console 系统集群地址需调整为 Agent 可以访问的地址;配置版本号需要增大。
Agent 运行无异常。

Agent 注册 Console 成功后,在 Console 页面“资源管理”-“探针管理”中可以看到注册的 Agent 实例。

关联操作
Agent 关联到需要采集数据的 ES 集群。




调整监控模式
关联成功后,将 ES 集群的监控模式改为 Agent。

可在监控报表中,查看采集状态。

查看日志

至此日志功能已可以使用。
关于 INFINI Console

INFINI Console 是一款开源的非常轻量级的多集群、跨版本的搜索基础设施统一管控平台。通过对流行的搜索引擎基础设施进行跨版本、多集群的集中纳管,企业可以快速方便的统一管理企业内部的不同版本的多套搜索集群。INFINI Console 还可以对集群内的索引及数据进行操作管理,可以配置灵活的告警规则,可以指定统一的安全策略,可以查看各个维度的日志和审计信息,真正实现企业级的搜索服务平台化建设和运营。
官网文档:<https://docs.infinilabs.com/console>
开源地址:<https://github.com/infinilabs/console>
原文:https://infinilabs.cn/blog/202 ... arch/
谈谈 ES 6.8 到 7.10 的功能变迁(4)- 聚合功能篇
Elasticsearch • INFINI Labs 小助手 发表了文章 • 0 个评论 • 471 次浏览 • 2 天前
这一篇我们继续了解 ES 7.10 相较于 ES 6.8 新增的聚合方法。
Rare Terms 聚合
功能说明
用于聚合查询出字段中的稀有项。ES 常见的统计方法是使用 term 查询的正向排序,但是在大数据量和高基数的数据分布场景下会出现 unbounded 错误。Rare 聚合弥补了这个场景的查询方法。注意的是,这个聚合计算出来的是一个近似值。
注意事项
使用限制
- 只能用于 keyword、numeric、ip 或 boolean 类型字段
- max_doc_count 参数限制文档数量(默认为 1)
- precision_threshold 参数控制精度(默认为 3000)
性能考虑
- 在高基数(数据集中不同值的数量非常多)字段上性能较好
- 内存消耗相对较大
- 聚合是在 shard 层做的统计,建议使用合适的 shard 大小
精度控制
- 结果是近似值,具体说明[见此](https://www.elastic.co/guide/e ... cision)
- 可以通过 precision_threshold 调整精度,精度越高,内存消耗越大
Cumulative Cardinality 聚合
功能说明
一个管道聚合,计算 histogram(或 date_histogram)聚合中的累积基数。
Cumulative_cardinality 聚合对于查找几个时间段内的"新项目"很有用,比如每天网站的新访客数量。常规 Cardinaity 聚合会告诉你每天有多少独立访客,但不会区分"新"或"重复"访客。Cumulative_cardinality 聚合可以用来确定每天有多少独立访问者是"新"的。
可以通过 precision_threshold 参数调整精度,内存消耗随精度增加而增加。建议根据实际需求调整精度,避免不必要的高精度设置。
使用要求
- 需要一个 date_histogram 或 histogram 聚合
- 需要一个 cardinality 度量聚合
- buckets_path 必须指向一个有效的 cardinality 聚合
代码样例
<br /> GET /user_hits/_search<br /> {<br /> "size": 0,<br /> "aggs": {<br /> "users_per_day": {<br /> "date_histogram": {<br /> "field": "timestamp",<br /> "calendar_interval": "day"<br /> },<br /> "aggs": {<br /> "distinct_users": {<br /> "cardinality": {<br /> "field": "user_id"<br /> }<br /> },<br /> "total_new_users": {<br /> "cumulative_cardinality": {<br /> "buckets_path": "distinct_users"<br /> }<br /> }<br /> }<br /> }<br /> }<br /> }<br />
Geotile Grid 聚合
功能说明
基于 geo_point 字段的地理位置多桶聚合。将地理空间数据按照网格划分,便于可视化和分析。
注意要点
- 网格设置: precision 参数控制网格精度(0-29),精度越高,网格越小,桶数越多。
- 高精度会产生大量桶,内存消耗随精度增加而增加。
- 只支持 geo_point 类型字段。
代码样例
json<br /> POST /museums/_search?size=0<br /> {<br /> "aggregations": {<br /> "tiles-in-bounds": {<br /> "geotile_grid": {<br /> "field": "location",<br /> "precision": 22,<br /> "bounds": {<br /> "top_left": "52.4, 4.9",<br /> "bottom_right": "52.3, 5.0"<br /> }<br /> }<br /> }<br /> }<br /> }<br /> <br />
T-test 聚合
功能说明
T_test 是一种统计假设检验,用于判断测试统计量在零假设下是否服从学生 t 分布(Student’s t-distribution)。它适用于从聚合文档中提取的数值或通过提供的脚本生成的数值。
该聚合将会返回该检验的 p 值(概率值)。它是在零假设正确的情况下(这意味着总体均值之间没有差异),获得至少与聚合所处理结果一样极端结果的概率。p 值越小,意味着零假设越有可能不正确,总体均值实际上是存在差异的。
关于 Student’s t-distribution
Student's t - distribution(学生 t - 分布),简称 t - 分布,是一种概率分布。它在统计学中具有重要地位,特别是在样本量较小且总体标准差未知的情况下用于对总体均值进行估计和假设检验。
它的形状类似于正态分布,呈钟形曲线,但比正态分布的 “尾部” 更厚。也就是说,t - 分布在均值两侧的极端值出现的概率比正态分布更高。
测试代码
json<br /> GET node_upgrade/_search<br /> {<br /> "size": 0,<br /> "aggs": {<br /> "startup_time_ttest": {<br /> "t_test": {<br /> "a": { "field": "startup_time_before" },<br /> "b": { "field": "startup_time_after" },<br /> "type": "paired"<br /> }<br /> }<br /> }<br /> }<br /> <br />
Variable Width Histogram 可变直方图聚合
功能说明
类似于 histogram 的多桶聚合。但与 histogram 不同,每个桶的宽度不是预先指定的,而是根据目标桶数量动态确定间隔。
参数设置
- 网格设置: precision 参数控制网格精度(0-29),精度越高,网格越小,桶数越多。
- field 必须是数值类型
- buckets 参数指定目标桶数
- 实际桶数可能少于指定值
性能考虑
- 比固定宽度直方图更耗资源,大数据集上可能较慢
- 建议限制目标桶数量
使用场景
- 数据分布不均匀时特别有用
- 适合探索性数据分析
- 可以避免空桶或过密桶
Normalize 归一化聚合
功能说明
一个管道聚合,用于计算特定桶值的归一化或重新缩放后的值。
方法选择
可以归一化处理的方法有:
- rescale_0_1:0 到 1 重缩放,这种方法对数据进行重新缩放,使得最小值变为 0,最大值变为 1,其余数值则在两者之间进行线性归一化。
- rescale_0_100:0 到 100 重缩放,该方法对数据进行重新缩放,让最小值变为 0,最大值变为 100,其余数值在它们之间按线性方式进行归一化。
- percent_of_sum:占总和的百分比,此方法对每个值进行归一化,使其表示为占总值的百分比。
- mean:均值归一化,这种方法进行归一化时,每个值依据其与平均值的差异程度来进行归一化。
- zscore:Z 分数归一化,该方法进行归一化时,每个值表示的是其相对于标准差偏离均值的程度。
- softmax:软最大化归一化,这种方法进行归一化时,先对每个值取指数,然后相对于原始值指数之和来进行归一化。
参数配置
- method 参数指定归一化方法
- buckets_path 指定数据来源
- 可以设置缺失值处理
Moving Percentiles 聚合
功能介绍
一个管道聚合,对于一组有序的百分位数,移动百分位数聚合(Moving Percentile Aggregation)会在这些百分位数上滑动一个窗口,并计算累积百分位数。
关于 shift 偏移参数
默认情况下(偏移量 shift = 0 时),用于计算的窗口是除当前桶之外的最后 n 个值。将偏移量增加 1 会使起始窗口位置向右移动 1 个单位。
- 若要将当前桶包含在窗口内,请使用 shift = 1。
- 对于居中对齐(当前桶前后各有 n / 2 个值),使用 shift = window / 2。
- 对于右对齐(当前桶之后有 n 个值),使用 shift = window。
如果窗口的任一边缘移动到数据序列边界之外,窗口将会收缩,仅包含可用的值。
Rate 聚合
功能说明
在 date_histogram 的聚合上使用,用于计算每个 date_histogram 桶中的文档速率或字段速率。
rare 聚合支持多种时间单位(如秒、分、时),使用时需要明确指定单位。可以用来计算文档数或字段值,但必须与 date_histogram 一起使用。
小结
这一篇粗略的列举了 ES 7.10 版本中新增的聚合方法。相较于查询方法的高使用频率和低资源占用,聚合方法的使用频率相对较少,内存也会有一定的占用,大家可以根据实际场景选择使用。
推荐阅读
- [谈谈 ES 6.8 到 7.10 的功能变迁(1)- 性能优化篇](https://infinilabs.cn/blog/202 ... part-1)
- [谈谈 ES 6.8 到 7.10 的功能变迁(2)- 字段类型篇](https://infinilabs.cn/blog/202 ... part-2)
- [谈谈 ES 6.8 到 7.10 的功能变迁(3)- 查询方法篇](https://infinilabs.cn/blog/202 ... part-3)
- [谈谈 ES 6.8 到 7.10 的功能变迁(5)- 任务和集群管理](https://infinilabs.cn/blog/202 ... part-5)
- [谈谈 ES 6.8 到 7.10 的功能变迁(6)- 其他](https://infinilabs.cn/blog/202 ... part-6)
关于极限科技(INFINI Labs)

极限科技,全称极限数据(北京)科技有限公司,是一家专注于实时搜索与数据分析的软件公司。旗下品牌极限实验室(INFINI Labs)致力于打造极致易用的数据探索与分析体验。
极限科技是一支年轻的团队,采用天然分布式的方式来进行远程协作,员工分布在全球各地,希望通过努力成为中国乃至全球企业大数据实时搜索分析产品的首选,为中国技术品牌输出添砖加瓦。
官网:<https://infinilabs.cn>
作者:金多安,极限科技(INFINI Labs)搜索运维专家,Elastic 认证专家,搜索客社区日报责任编辑。一直从事与搜索运维相关的工作,日常会去挖掘 ES / Lucene 方向的搜索技术原理,保持搜索相关技术发展的关注。
原文:https://infinilabs.cn/blog/202 ... rt-4/
【搜索客社区日报】第2034期 (2025-05-09)
社区日报 • Fred2000 发表了文章 • 0 个评论 • 610 次浏览 • 3 天前
https://mp.weixin.qq.com/s/EPoD1VzQY5kUNI2vrJc52Q
2、INFINI Console 纳管 Elasticsearch 9
https://infinilabs.cn/blog/202 ... -es9/
3、向量相似度检索遇到天花板,是否我们走错了?
https://mp.weixin.qq.com/s/4f8RaqPgBS7Wm5_z68U9vQ
4、基于 MCP 的 AI Agent 应用开发实践
https://mp.weixin.qq.com/s/hpnE0JTFpF2V9PMuo0hVnw
5、【GitTalk 直播回放】使用 Coco AI 打造 Elasticsearch 智能助手
https://www.bilibili.com/video/BV1rAGyzGEQo/
编辑:Fred
更多资讯:http://news.searchkit.cn
INFINI Console 纳管 Elasticsearch 9(一):指标监控、数据管理、DSL 语句执行
Elasticsearch • INFINI Labs 小助手 发表了文章 • 0 个评论 • 1101 次浏览 • 5 天前
Elasticsearch v9.0 版本最近已发布,而 [INFINI Console](https://docs.infinilabs.com/console) 作为一款开源的非常轻量级的多集群、跨版本的搜索基础设施统一管控平台,是否支持最新的 Elasticsearch v9.0 集群管理呢?本文以 INFINI Console v1.29.2 为例,从指标监控、数据管理、DSL 语句执行等方面进行测试。
部署注册
使用 Docker 快速部署 ES9。
bash<br /> docker run --name es9 -p 9201:9200 -it -m 1GB docker.elastic.co/elasticsearch/elasticsearch:9.0.0<br />
使用 Docker 部署 Console,请参考[文档](https://docs.infinilabs.com/co ... ocker/)。
bash<br /> docker run -d --name console -p 9001:9000 infinilabs/console:1.29.2-2008<br />
将 ES9 注册到 Console,默认采集模式为 Agentless。


请求模拟
使用 [Loadgen](https://release.infinilabs.com/loadgen/stable/) 模拟数据写入和查询。
```bash
env:
ES_USERNAME: elastic
ES_PASSWORD: CZ-FHm+M5cbfee_yMPZp
ES_ENDPOINT: https://192.168.0.101:9201
runner:
total_rounds: 1
no_warm: true
valid_status_codes_during_warmup: [ 200,201,404 ]
Whether to log all requests
log_requests: false
Whether to log all requests with the specified response status
log_status_codes:
- 0
- 500
assert_invalid: false
assert_error: false
Whether to reset the context, including variables, runtime KV pairs, etc.,
before this test run.
reset_context: false
default_endpoint: $[[env.ES_ENDPOINT]]
default_basic_auth:
username: $[[env.ES_USERNAME]]
password: $[[env.ES_PASSWORD]]
variables:- name: id
type: sequence - name: uuid
type: uuid - name: now_local
type: now_local - name: now_unix
type: now_unix - name: list
type: list
data:
- "medcl"
- "abc"
- "efg"
- "xyz"
requests:
- "medcl"
- request: #prepare some docs
method: POST
url: /_bulk
body_repeat_times: 5000
body: |
{"index": {"_index": "infinilabs", "_id": "$[[uuid]]"}}
{"id": "$[[id]]", "field1": "$[[list]]", "now_local": "$[[now_local]]", "now_unix": "$[[now_unix]]"}
- request:
method: GET
url: infinilabs/_search
body: |
{"query":{"term":{"id":"$[[id]]"}}}
<br /> <br />
bash
./loadgen-mac-amd64 -d 300
```
平台管理
平台概览


监控报表
- 指标概览

- 集群指标

- 节点指标

- 索引指标

- 节点线程指标

- 节点热力图

- 索引热力图

- 查看日志

日志采集需要安装 Agent,关于这块功能后续会进行介绍。
- 节点实时指标

- 索引实时指标

数据管理

开发工具

总结
经过测试,INFINI Console 可以支持 Elasticsearch 9 集群纳管,大家可以下载体验使用。
关于 INFINI Console

INFINI Console 是一款开源的非常轻量级的多集群、跨版本的搜索基础设施统一管控平台。通过对流行的搜索引擎基础设施进行跨版本、多集群的集中纳管,企业可以快速方便的统一管理企业内部的不同版本的多套搜索集群。INFINI Console 还可以对集群内的索引及数据进行操作管理,可以配置灵活的告警规则,可以指定统一的安全策略,可以查看各个维度的日志和审计信息,真正实现企业级的搜索服务平台化建设和运营。
官网文档:<https://docs.infinilabs.com/console>
开源地址:<https://github.com/infinilabs/console>
原文:https://infinilabs.cn/blog/202 ... arch/
- name: id
【搜索客社区日报】第2033期 (2025-05-08)
社区日报 • Se7en 发表了文章 • 0 个评论 • 1076 次浏览 • 5 天前
https://mp.weixin.qq.com/s/f53_CecLm_0oAihf5qHVew
2.vLLM + LWS:Kubernetes 上的多机多卡推理方案
https://mp.weixin.qq.com/s/RTSx9LqNuLZ_GPsrgbWDBw
3.MCP 最新版本 9 大差异解读:授权机制、传输协议、批处理、工具元数据...
https://mp.weixin.qq.com/s/xiZd0gHmLr3mNqHvU3Ca1w
4.训练100B模型要多少显存?
https://mp.weixin.qq.com/s/tdPrtsxOfnpyQzE25psdUQ
编辑:Se7en
更多资讯:http://news.searchkit.cn
Easysearch 时序数据的基于时间范围的合并策略
Easysearch • INFINI Labs 小助手 发表了文章 • 0 个评论 • 1328 次浏览 • 2025-05-07 16:44
如果你正在使用 [Easysearch](https://docs.infinilabs.com/easysearch/main/) 处理日志、监控指标、事件流或其他任何具有时间顺序的数据,那么你一定知道索引的性能和效率至关重要。Easysearch 底层的 Lucene Segment 合并是保持搜索和索引性能的关键后台任务。然而,你是否意识到,默认的合并策略可能并不是处理时序数据的最佳选择?

今天,我们就来介绍 Easysearch 1.12.1 版本起引入的一个重要优化:基于时间范围的合并策略 (TimeRangeMergePolicy) ,它专门为优化时序数据的 Segment 合并而生。
时序数据的合并挑战:默认策略的局限性
Easysearch 默认使用的合并策略(如 TieredMergePolicy)非常智能,它会根据 Segment 的大小、文档删除比例等因素来决定合并哪些 Segment,以平衡查询性能和资源使用。
但在时序数据场景下,这种通用策略可能会遇到一些问题:
- 冷热数据混合: 想象一下,几个月前的旧日志数据(冷数据)可能因为大小合适而被选中,与最近几小时内产生的新数据(热数据)进行合并。这会带来不必要的 I/O 和 CPU 开销,因为冷数据通常访问很少,合并它们对查询性能的提升有限,反而消耗了宝贵的资源。
- 查询性能影响: 合并可能产生覆盖时间跨度非常大的 Segment。当你执行按时间范围过滤的查询时(这在时序场景中非常常见),查询可能需要扫描这些巨大的 Segment,即使其中大部分数据都不在你的目标时间范围内,从而降低查询效率。
解决方案:TimeRangeMergePolicy 登场!
为了解决上述痛点,Easysearch 引入了TimeRangeMergePolicy
。顾名思义,这种策略在做合并决策时,将时间维度纳入了核心考量。
它的核心思想很简单,但非常有效:
- 时间优先: 倾向于合并那些时间上相邻或接近的 Segment。比如,属于同一天或同一小时的 Segment 更有可能被一起合并。
- 保留时间分区: 尽量避免将时间跨度极大的 Segment 合并在一起。这有助于保持数据的“时间局部性”,使得按时间范围查询时能更快地排除不相关的 Segment。
- 优先合并新数据: 通常,新产生的数据(热数据)更新和删除操作更频繁。优先合并包含较新数据的 Segment,有助于更快地回收被删除文档占用的空间,并优化对最新数据的查询性能。
如何为你的时序索引启用 TimeRangeMergePolicy?
启用这个功能非常简单,只需要两步:
- 时间优先: 倾向于合并那些时间上相邻或接近的 Segment。比如,属于同一天或同一小时的 Segment 更有可能被一起合并。
- 确认日期字段: 首先,确保你的索引 Mapping 中有一个能准确代表数据时间的字段,通常是日期(
date
)或时间戳(date_nanos
)类型,例如@timestamp
、event_time
等。这个字段的值应该反映数据产生的实际时间。 - 更新索引设置: 使用 Index Settings API,为你的索引指定
index.merge.policy.time_range_field
参数,并将其值设置为你的时间字段名。
示例:
假设你的时间字段是timestamp
,索引名称是my-timeseries-index
,你可以执行以下请求:
auto<br /> PUT /my-timeseries-index/_settings<br /> {<br /> "index": {<br /> "merge.policy.time_range_field": "timestamp"<br /> }<br /> }<br />
搞定!设置之后,my-timeseries-index
后续的 Segment 合并就会自动采用TimeRangeMergePolicy
了。
专家提示: 如果你想让所有新创建的时序索引默认就使用这个策略,可以将这个设置添加到你的索引模板 (Index Template) 中。
TimeRangeMergePolicy 的优势
启用时间范围合并策略能带来哪些好处呢?
- 降低合并开销: 显著减少冷热数据的无效合并,节省 I/O 和 CPU 资源。
- 提高资源效率: 更智能的合并有助于更快地回收已删除文档的空间,并可能降低整体计算资源的使用。
- 优化查询性能: 保持 Segment 的时间局部性,对于按时间范围过滤的查询(例如,“查询过去一小时的日志”)可能会有明显的性能提升。
- 对时序数据更友好: 该策略的设计初衷就是为了更好地服务于日志、指标这类严格按时间增长的数据模式。
注意事项
在使用TimeRangeMergePolicy
时,有几点需要注意:
- 时间字段是关键: 策略的效果高度依赖于你所指定的
time_range_field
。如果该字段不存在,或者字段中的时间值混乱、不准确,策略可能无法发挥预期效果,甚至适得其反。 - 并非万能丹: 这个策略最适合具有明确时间序列特征的数据。对于非时序数据(例如,商品信息、用户信息索引),默认的
TieredMergePolicy
可能仍然是更好的选择。 - 版本要求: 请确保你的 Easysearch 集群版本至少为 1.12.1。
总结
对于处理大量时序数据的 Easysearch 用户来说,TimeRangeMergePolicy
是一个非常有价值的优化工具。通过感知数据的时间属性,它可以让 Segment 合并操作更加智能和高效,从而降低资源消耗、提升查询性能。如果你的索引符合时序数据的特征,并且正在运行 Easysearch 1.12.1 或更高版本,不妨尝试启用这个策略,看看它能否为你的集群带来改善!
关于 Easysearch
INFINI Easysearch 是一个分布式的搜索型数据库,实现非结构化数据检索、全文检索、向量检索、地理位置信息查询、组合索引查询、多语种支持、聚合分析等。Easysearch 可以完美替代 Elasticsearch,同时添加和完善多项企业级功能。Easysearch 助您拥有简洁、高效、易用的搜索体验。
官网文档:<https://docs.infinilabs.com/easysearch>
作者:张磊,极限科技(INFINI Labs)搜索引擎研发负责人,对 Elasticsearch 和 Lucene 源码比较熟悉,目前主要负责公司的 Easysearch 产品的研发以及客户服务工作。
原文:https://infinilabs.cn/blog/202 ... arch/
- 降低合并开销: 显著减少冷热数据的无效合并,节省 I/O 和 CPU 资源。
【搜索客社区日报】第2032期 (2025-05-07)
社区日报 • kin122 发表了文章 • 0 个评论 • 1418 次浏览 • 2025-05-07 11:06
https://mp.weixin.qq.com/s/pe9r6OSCI6l5ocUw1LHmMw
2.利用 NLP 的强大功能为 RAG 和 GraphRAG 应用程序构建混合图(搭梯)
https://medium.com/%40irina.ka ... e2adb
3.使用 LLM 将非结构化文本转换为交互式知识图谱(搭梯)
https://medium.com/%40robert-m ... 71cd6
编辑:kin122
更多资讯:http://news.searchkit.cn
【搜索客社区日报】第2031期 (2025-05-06)
社区日报 • God_lockin 发表了文章 • 0 个评论 • 1476 次浏览 • 2025-05-06 14:57
1. 2025了,opensearch 和 elasticsearch 还能掰腕子吗(需要梯子)
https://medium.com/%40FrankGoo ... 33422
2. 解锁可观测性的封印,你得这么做(需要梯子)
https://ninad-desai.medium.com ... e0210
3. 保证生产稳定的妙招,“真实”模拟(需要梯子)
https://arshadeveloper.medium. ... 8f436
编辑:斯蒂文
更多资讯:http://news.searchkit.cn
【搜索客社区日报】第2030期 (2025-04-29)
社区日报 • God_lockin 发表了文章 • 0 个评论 • 2531 次浏览 • 2025-04-29 11:04
https://medium.com/%40unicorn- ... 151e2
2. ES VS. Doris,腾讯音乐如何抉择(需要梯子)
https://medium.com/%40ApacheDo ... 35611
3. ES,让航班信息尽在掌握(需要梯子)
https://medium.com/gitconnecte ... 9a3b0
编辑:斯蒂文
更多资讯:http://news.searchkit.cn
INFINI Labs 产品更新 | Coco AI 0.4 发布 – 完善小助手设置,添加MCP支持
资讯动态 • INFINI Labs 小助手 发表了文章 • 0 个评论 • 2614 次浏览 • 2025-04-29 00:10

INFINI Labs 产品更新发布!此次更新涵盖 Coco AI 、Easysearch 等产品多项重要升级,重点提升 AI 搜索能力、易用性及企业级优化。
- Coco AI v0.4 作为 开源、跨平台的 AI 搜索工具,完善小助手设置,添加 MCP 支持。
- Coco AI Server 新增模型提供商管理,AI 助手设置和大量优化改进。
- INFINI Easysearch v1.12.1 修复上个版本引入的数个问题。
- INFINI Console、Gateway、Agent、Loadgen、Framework 关键问题修复,优化 HTTP 请求压缩,修复一些界面问题。
Coco AI v0.4
Coco AI 是一个完全开源、跨平台的统一 AI 搜索与效率工具,能够连接并搜索多种数据源,包括应用程序、文件、谷歌网盘、Notion、语雀、Hugo 等本地与云端数据。通过接入 DeepSeek 等大模型,Coco AI 实现了智能化的个人知识库管理,注重隐私,支持私有部署,帮助用户快速、智能地访问信息。
Coco AI 本次详细更新记录如下:
Coco AI 客户端 v0.4.0


Coco AI 服务端 v0.4.0
功能更新
- 新增聊天会话管理 API
- 支持字体图标
- 新增 AI 助手设置
 - 新增 MCP 服务器管理
 - 新增模型提供商管理


 - 新增版本及授权信息

问题修复
- 修复了语雀连接器对个人令牌支持不完善的问题
- 修复嵌入组件包装器中的 Content-Type 头错误问题
- 修复默认登录 URL 不可更改的问题
优化改进
- 内置连接器图标资源设置为只读
- 支持设置嵌入组件的图标和占位符
- 优化嵌入组件搜索框 UI
- 重构优化安全插件
- 嵌入组件主题样式设置为 auto 时搜索框主题样式跟随系统
- 嵌入组件支持设置推荐话题
- 跳过处理已禁用的嵌入组件包装器
- 创建 google drive 类型数据源时,如果缺少必要设置,引导用户去设置
- 默认使用 Go Module 管理模块依赖
- 图标组件支持用户输入 URL 地址配置图标
- 更新默认查询模版
INFINI Easysearch v1.12.1
INFINI Easysearch 是一个分布式的搜索型数据库,实现非结构化数据检索、全文检索、向量检索、地理位置信息查询、组合索引查询、多语种支持、聚合分析等。Easysearch 可以完美替代 Elasticsearch,同时添加和完善多项企业级功能。Easysearch 助您拥有简洁、高效、易用的搜索体验。
Easysearch 本次更新如下:
问题修复
- 修复 ollama_url 不能动态更新的错误
- 修复 ollama api 未正确兼容单个文本请求
- 索引生命周期管理 delete action 按文档最新时间删除时修正为按降序排序
INFINI Console v1.29.3
INFINI Console 是一款开源的非常轻量级的多集群、跨版本的搜索基础设施统一管控平台。通过对流行的搜索引擎基础设施进行跨版本、多集群的集中纳管, 企业可以快速方便的统一管理企业内部的不同版本的多套搜索集群。
Console 在线体验:
<http://demo.infini.cloud> (用户名/密码:readonly/readonly)。
Console 本次更新如下:
问题修复
- 修复删除索引后重建索引缓存问题
- 修复 qps 相关指标展示时的小数位数
- 修复队列数据查看不弹窗问题
- 修复索引管理别名跳转 404 问题
- 修复初始化界面集群地址不正确问题
优化改进
- http 处理器开启压缩默认配置
- 增加初始化模板,对于 Easysearch >= 1.12.1 开启新的模板
INFINI Gateway v1.29.3
INFINI Gateway 是一个开源的面向搜索场景的高性能数据网关,所有请求都经过网关处理后再转发到后端的搜索业务集群。基于 INFINI Gateway 可以实现索引级别的限速限流、常见查询的缓存加速、查询请求的审计、查询结果的动态修改等等。
Gateway 本次更新如下:
优化改进
- 同步更新 [Framework v1.1.6](https://docs.infinilabs.com/fr ... notes/) 优化了一些已知问题
- 实现 HTTP 处理器请求压缩支持
INFINI Agent v1.29.2
INFINI Agent 负责采集和上传 Elasticsearch, Easysearch, Opensearch 集群的日志和指标信息,通过 INFINI Console 管理,支持主流操作系统和平台,安装包轻量且无任何外部依赖,可以快速方便地安装。
Agent 本次更新如下:
优化改进
- 同步更新 [Framework v1.1.6](https://docs.infinilabs.com/fr ... notes/) 优化了一些已知问题
- 优化节点发现日志输出
INFINI Loadgen v1.29.3
INFINI Loadgen 是一款开源的专为 Easysearch、Elasticsearch、OpenSearch 设计的轻量级性能测试工具。
Loadgen 本次更新如下:
优化改进
- 同步更新 [Framework v1.1.6](https://docs.infinilabs.com/fr ... notes/) 优化了一些已知问题
INFINI Framework v1.1.6
INFINI Framework 是 INFINI Labs 基于 Golang 的产品的核心基础,已开源。该框架以开发者为中心设计,简化了构建高性能、可扩展且可靠的应用程序的过程。
Framework 本次更新如下:
重大变更
- 添加
Elasticsearch v9
的适配器
功能更新
- 在 ORM 模块中添加对
query_string
和prefix
查询的支持 - 为 HTTP 处理器添加压缩支持
- 允许在设置(setup)完成后注册回调函数
问题修复
- 修复
WriteHeader
函数,防止重复写入状态码 - 确保在
HTTP
处理器中写入响应前,先设置 200 状态码 - 检测到管道配置变化时,重新加载并通知相关模块
- 修正默认设置为绿色时,不记录集群状态丢失的问题
优化改进
- 添加获取实例 ID 的工具函数
- 添加删除会话键的工具函数
- 更新
Profile
结构体 - 设置服务重启策略为 "always"
- 添加针对“未找到记录”场景写入响应的工具函数
- 默认支持
Go Modules
更多详情请查看以下详细的 Release Notes 或联系我们的技术支持团队!
- [INFINI Easysearch](https://docs.infinilabs.com/ea ... earch/)
- [INFINI Console](https://docs.infinilabs.com/co ... notes/)
- [INFINI Gateway](https://docs.infinilabs.com/ga ... notes/)
- [INFINI Agent](https://docs.infinilabs.com/ag ... notes/)
- [INFINI Loadgen](https://docs.infinilabs.com/lo ... notes/)
- [INFINI Framework](https://docs.infinilabs.com/fr ... notes/)
- [Coco AI App](https://docs.infinilabs.com/co ... notes/)
- [Coco AI Server](https://docs.infinilabs.com/co ... notes/)
期待反馈
欢迎下载体验使用,如果您在使用过程中遇到如何疑问或者问题,欢迎前往 INFINI Labs Github(<https://github.com/infinilabs>) 中的对应项目中提交 Feature Request 或提交 Bug。
下载地址: <https://infinilabs.cn/download>
邮件:hello@infini.ltd
电话:(+86) 400-139-9200
Discord:<https://discord.gg/4tKTMkkvVX>
也欢迎大家微信扫码添加小助手(INFINI-Labs),加入用户群一起讨论交流。

关于极限科技(INFINI Labs)

极限科技,全称极限数据(北京)科技有限公司,是一家专注于实时搜索与数据分析的软件公司。旗下品牌极限实验室(INFINI Labs)致力于打造极致易用的数据探索与分析体验。
极限科技是一支年轻的团队,采用天然分布式的方式来进行远程协作,员工分布在全球各地,希望通过努力成为中国乃至全球企业大数据实时搜索分析产品的首选,为中国技术品牌输出添砖加瓦。
官网:<https://infinilabs.cn>