当前位置: 首页 > article >正文

【Elasticsearch】查询规则_query_rules

1.Query Rules 的定义与作用

Query Rules 是 Elasticsearch 提供的一种功能,允许用户根据预定义的规则动态调整搜索结果。它通过匹配查询的元数据(如用户输入、地理位置、用户兴趣等),对搜索结果进行定制化调整,例如固定某些文档到结果顶部或排除某些文档。

2.Query Rules 的核心组成部分

(1)规则类型(Rule Type)

• `pinned`:将指定文档固定到搜索结果的顶部。例如,在电商场景中,可以将热门商品固定到搜索结果顶部,提高其曝光率。

• `exclude`:从搜索结果中排除指定文档。例如,可以排除过时的新闻或不再销售的商品。

(2)匹配条件(Criteria)

匹配条件用于定义规则触发的条件,支持多种匹配类型,如:

• `exact`:精确匹配,要求完全一致。

• `fuzzy`:模糊匹配,允许一定程度的误差。

• `contains`:包含匹配,检查字段中是否包含指定内容。

(3)动作(Actions)

动作是指当规则匹配时要执行的操作,例如:

• 固定特定的文档`_id`。

• 排除某些文档。

3.在搜索请求中应用 Query Rules 的案例

案例 1:推广特定内容

假设我们需要在用户搜索“智能手机”时,将某些热门商品固定到搜索结果顶部。

定义规则集:

```json

PUT _query_rules/promotion-ruleset

{

  "rules": [

    {

      "rule_id": "promote-specific-products",

      "type": "pinned",

      "criteria": [

        {

          "type": "exact",

          "metadata": "query_string",

          "values": ["智能手机"]

        }

      ],

      "actions": {

        "ids": ["product-123", "product-456"]

      }

    }

  ]

}

```

• `rule_id`:规则的唯一标识。

• `type`:规则类型为`pinned`,表示将指定文档固定到顶部。

• `criteria`:当用户搜索“智能手机”时触发规则。

• `actions`:将文档`product-123`和`product-456`固定到搜索结果顶部。

应用规则的搜索请求:

```json

GET my-index/_search

{

  "retriever": {

    "rule": {

      "retriever": {

        "standard": {

          "query": {

            "query_string": {

              "query": "智能手机"

            }

          }

        }

      },

      "match_criteria": {

        "query_string": "智能手机"

      },

      "ruleset_ids": ["promotion-ruleset"]

    }

  }

}

```

• `ruleset_ids`:指定应用的规则集为`promotion-ruleset`。

这个查询请求是一个 Elasticsearch 的搜索请求,它结合了 Query Rules 功能,用于在搜索时动态应用预定义的规则集(如固定某些文档到搜索结果顶部)。以下是对这个请求的详细解释:

---

1.请求路径

`GET my-index/_search`

• `my-index`:这是目标索引的名称,表示查询将在这个索引中执行。

• `_search`:这是 Elasticsearch 的搜索接口,用于执行查询操作

---

2.请求体的结构

请求体中使用了`retriever`和嵌套的`rule`部分,这是 Query Rules 功能的核心结构。

(1)`retriever`部分

`retriever`是一个检索器,用于定义查询的基本逻辑。它在这里的作用是将标准查询(`standard`)与规则(`rule`)结合起来。

(2)`rule`部分

`rule`是 Query Rules 的核心,用于定义如何应用规则集。

---

3.具体字段解释

(1)`retriever.standard.query`

这部分定义了标准的查询逻辑,即用户实际输入的搜索条件:

```json

"retriever": {

  "standard": {

    "query": {

      "query_string": {

        "query": "智能手机"

      }

    }

  }

}

```

• `query_string`:这是一个查询类型,表示使用字符串查询。

• `query: "智能手机"`:这是用户输入的搜索关键词,表示查询包含“智能手机”的文档。

---

(2)`match_criteria`

`match_criteria`定义了规则触发的条件:

```json

"match_criteria": {

  "query_string": "智能手机"

}

```

• `query_string`:表示匹配条件基于查询字符串。

• `"智能手机"`:这是触发规则的关键词。当用户搜索“智能手机”时,规则会被触发。

注意:`match_criteria`中的关键词需要与规则集中定义的触发条件一致,否则规则不会生效。

---

(3)`ruleset_ids`

`ruleset_ids`指定了要应用的规则集:

```json

"ruleset_ids": ["promotion-ruleset"]

```

• `promotion-ruleset`:这是规则集的名称,表示应用之前定义的`promotion-ruleset`规则集。

在前面的案例中,`promotion-ruleset`规则集定义了将某些文档(如`product-123`和`product-456`)固定到搜索结果顶部的规则。

---

4.整体逻辑

这个查询请求的作用是:

1. 用户搜索关键词“智能手机”。

2. Elasticsearch 会根据标准查询逻辑检索包含“智能手机”的文档。

3. 同时,Query Rules 会检查规则集`promotion-ruleset`。

4. 如果规则集中的触发条件(`match_criteria`)匹配用户输入(“智能手机”),则执行规则集中的动作(如将某些文档固定到顶部)。

5. 最终返回的搜索结果会结合规则集的动作,例如将`product-123`和`product-456`固定到搜索结果顶部。

---

5.示例结果

假设索引中有以下文档:

```json

[

  {"_id": "product-123", "title": "热门智能手机 A"},

  {"_id": "product-456", "title": "热门智能手机 B"},

  {"_id": "product-789", "title": "普通智能手机 C"}

]

```

执行上述查询后,搜索结果可能如下:

1. 热门智能手机 A(`product-123`,被规则固定到顶部)

2. 热门智能手机 B(`product-456`,被规则固定到顶部)

3. 普通智能手机 C(`product-789`,正常检索结果)

---

总结

这个查询请求通过结合标准查询和 Query Rules 功能,实现了在用户搜索时动态调整搜索结果的顺序。它将某些文档固定到顶部,从而满足业务需求(如推广热门商品)。

案例 2:排除不相关内容

假设我们需要在用户搜索“新闻”时,排除某些过时的新闻内容。

定义规则集:

```json

PUT _query_rules/exclude-ruleset

{

  "rules": [

    {

      "rule_id": "exclude-old-news",

      "type": "exclude",

      "criteria": [

        {

          "type": "exact",

          "metadata": "query_string",

          "values": ["旧闻"]

        }

      ],

      "actions": {

        "ids": ["news-789"]

      }

    }

  ]

}

```

• `type`:规则类型为`exclude`,表示从搜索结果中排除指定文档。

• `criteria`:当用户搜索“旧闻”时触发规则。

• `actions`:排除文档`news-789`。

应用规则的搜索请求:

```json

GET my-index/_search

{

  "retriever": {

    "rule": {

      "retriever": {

        "standard": {

          "query": {

            "query_string": {

              "query": "新闻"

            }

          }

        }

      },

      "match_criteria": {

        "query_string": "新闻"

      },

      "ruleset_ids": ["exclude-ruleset"]

    }

  }

}

```

• `ruleset_ids`:指定应用的规则集为`exclude-ruleset`。

4.Query Rules 的性能优化

(1)简化规则逻辑

尽量减少规则的数量和复杂性,避免过多的模糊匹配或复杂的条件组合。过多的规则会增加查询的计算开销,降低性能。

(2)合理设置 JVM 参数

通过调整 Elasticsearch 的 JVM 参数(如堆内存大小)来优化整体性能。例如,合理设置堆内存大小可以避免频繁的垃圾回收(GC),从而提高系统性能。

(3)启用查询缓存

对于频繁使用的查询,启用查询缓存可以减少重复查询的开销,提升查询性能。

5.Query Rules 的监控与评估

(1)查询规则测试器 API

使用 Query Rules 测试器 API 验证规则是否按预期工作。

```json

POST _query_rules/my-ruleset/_test

{

  "match_criteria": {

    "match": "exclude"

  }

}

```

(2)查询执行计划分析

通过启用查询执行计划分析(`profile`参数),可以分析查询的性能瓶颈。

```json

{

  "query": {

    "match": {

      "field": "value"

    }

  },

  "profile": true

}

```

通过以上案例和参数详解,可以更好地在 Elasticsearch 中使用 Query Rules 功能来动态调整搜索结果,同时结合性能优化和监控手段,确保系统的高效运行。


http://www.kler.cn/a/557928.html

相关文章:

  • 侯捷 C++ 课程学习笔记:类的声明与构造函数
  • el-dropdown选中效果
  • Linux 驱动入门(6)—— IRDA(红外遥控模块)驱动
  • SpringSecurity设置白名单
  • 06.Docker 镜像制作和管理
  • Orcale、MySQL中参数类型的详解和运用场景(不带示例)
  • 收到线上服务器出现cpu告警一般怎么排查?
  • 21.《SpringBoot 异步编程@Async与CompletableFuture》
  • Docker 与 CI/CD:自动化构建和部署
  • Linux中的查看命令
  • 【排序算法】六大比较类排序算法——插入排序、选择排序、冒泡排序、希尔排序、快速排序、归并排序【详解】
  • ThinkORM模型静态方法create好像对MongoDB不支持
  • always和assign语法区别
  • 深入学习 XML:语法、约束、解析及相关技术
  • Git 中 rebase, squash, amend 的作⽤
  • 【回溯算法2】
  • 酵母细胞壁市场报告:探索潜力无限的生物资源宝库
  • javaEE-14.spring MVC练习
  • Python 高级数据结构操作全解析:从理论到实践
  • 智能硬件-01智能停车场