【Elasticsearch】Disjunction Max Query

Elasticsearch 中的Disjunction Max Query(析取最大查询)是一种非常有用的查询工具,适用于在多个字段中搜索相同内容的场景。它能够有效地处理多字段匹配的情况,并通过特定的机制计算文档的相关性分数。以下是关于`dis_max`查询的详细说明,包括其用途、结构、参数、分数计算方式以及一些实际应用场景。

1.用途

`dis_max`查询的主要用途包括:

• 多字段搜索:当你需要在多个字段中搜索相同的内容时,`dis_max`查询可以同时对这些字段进行搜索。

• 提升相关性:它会根据匹配字段中的最高分数来提升文档的相关性,同时通过`tie_breaker`参数可以调整其他匹配字段对最终分数的贡献。

• 避免重复:在多个字段中搜索相同内容时,避免因重复匹配而导致的分数过高问题。

2.查询结构

`dis_max`查询的基本结构如下:

```json

{

"query": {

"dis_max": {

"queries": [

{ "match": { "field1": "search term" }},

{ "match": { "field2": "search term" }},

{ "match": { "field3": "search term" }}

],

"tie_breaker": 0.3

}

}

}

```

参数说明

• `queries`:

• 类型:数组,包含多个查询子句。

• 作用:每个查询子句可以是任意类型的查询(如`match`、`term`、`bool`等),针对不同的字段进行搜索。

• 要求:至少需要一个查询子句。

• `tie_breaker`:

• 类型:浮点数,介于`0`和`1`之间。

• 作用:用于调整其他匹配字段对最终分数的贡献。

• 默认值:`0.0`。

• 说明:如果一个文档匹配多个查询子句,`tie_breaker`会将其他匹配字段的分数乘以该值,然后加到最高分数上。

3.分数计算方式

`dis_max`查询的分数计算过程如下:

  1. 取最高分数:

• 从所有匹配的查询子句中,取最高分数作为基础分数。

• 例如,假设`field1`的分数为`0.8`,`field2`的分数为`0.6`,`field3`的分数为`0.5`,则最高分数为`0.8`。

  1. 计算其他匹配字段的贡献:

• 将其他匹配字段的分数乘以`tie_breaker`值。

• 例如,假设`tie_breaker`为`0.3`:

• `field2`的贡献为`0.6 * 0.3 = 0.18`。

• `field3`的贡献为`0.5 * 0.3 = 0.15`。

  1. 最终分数计算:

• 将最高分数与其他匹配字段的贡献相加。

• 例如,最终分数为`0.8 + 0.18 + 0.15 = 1.13`。

4.实际应用场景

场景1:多字段搜索

假设你有一个产品文档,包含`name`、`description`和`tags`字段,你希望搜索包含特定关键词的产品:

```json

{

"query": {

"dis_max": {

"queries": [

{ "match": { "name": "smartphone" }},

{ "match": { "description": "smartphone" }},

{ "match": { "tags": "smartphone" }}

],

"tie_breaker": 0.2

}

}

}

```

场景2:权重调整

假设你希望某些字段的匹配结果更优先,可以通过`boost`参数调整权重:

```json

{

"query": {

"dis_max": {

"queries": [

{ "match": { "name": { "query": "smartphone", "boost": 2.0 }}},

{ "match": { "description": "smartphone" }},

{ "match": { "tags": "smartphone" }}

],

"tie_breaker": 0.2

}

}

}

```

场景3:结合其他查询

`dis_max`查询可以与其他查询(如`bool`查询)结合使用,实现更复杂的搜索逻辑:

```json

{

"query": {

"bool": {

"must": {

"dis_max": {

"queries": [

{ "match": { "name": "smartphone" }},

{ "match": { "description": "smartphone" }}

],

"tie_breaker": 0.1

}

},

"filter": { "term": { "category": "electronics" }}

}

}

}

```

5.调试分数计算

如果需要了解分数是如何计算的,可以在查询中添加`"explain": true`选项:

```json

GET /your_index/_search

{

"query": {

"dis_max": {

"queries": [

{ "match": { "name": "smartphone" }},

{ "match": { "description": "smartphone" }},

{ "match": { "tags": "smartphone" }}

],

"tie_breaker": 0.2

}

},

"explain": true

}

```

Elasticsearch 会返回一个详细的`explanation`字段,说明每个文档的相关性分数是如何计算的。

6.总结

`dis_max`查询是一种强大的工具,适用于需要在多个字段中搜索相同内容的场景。通过合理设置`tie_breaker`和`boost`参数,可以灵活调整搜索结果的相关性,从而优化搜索体验。它能够有效处理多字段匹配的情况,避免因重复匹配而导致的分数过高问题,同时通过`explain`选项可以方便地调试分数计算过程。

相关推荐
Elastic 中国社区官方博客9 小时前
你的 AI agent 不需要你的 API 密钥:使用 OAuth 2.1 对 Elasticsearch MCP 服务器进行身份验证
大数据·运维·人工智能·elasticsearch·搜索引擎·全文检索
互联网中的一颗神经元15 小时前
ZZ — Git 速查表
大数据·git·elasticsearch
Elasticsearch17 小时前
跳过有状态的 OTel Collector:Elasticsearch 9.5 原生存储两种指标时间类型
elasticsearch
C++、Java和Python的菜鸟1 天前
第2章 项目前置课-代码版本控制Git
大数据·elasticsearch·搜索引擎
Elasticsearch1 天前
什么是混合搜索?
elasticsearch
Elasticsearch2 天前
从点击流中提升搜索相关性:使用 Learn To Rank 和 OpenTelemetry 行为信号
elasticsearch
倒流时光三十年2 天前
第六阶段 57 · ES|QL 与 SQL API(用 SQL 查 ES)
数据库·sql·elasticsearch
Elastic 中国社区官方博客2 天前
我们如何重构 APM 服务地图以应对事件响应:Observability 9.5 背后的设计故事
大数据·人工智能·elasticsearch·重构·全文检索
guwentian2 天前
Git Worktree 实战:用并行多 Agent 把开发提速 N 倍
大数据·git·elasticsearch·wroktree
Elastic 中国社区官方博客2 天前
Elasticsearch:使用 AI Agent 来创建 workflow
大数据·运维·人工智能·elasticsearch·搜索引擎·自动化·全文检索