使用查询规则搜索编辑

此功能处于技术预览阶段,可能会在将来的版本中更改或删除。Elastic 将努力解决任何问题,但技术预览中的功能不受官方 GA 功能的支持 SLA 约束。

查询规则允许为与指定条件元数据匹配的查询定制搜索结果。这允许对结果进行更多控制,例如确保与定义的条件匹配的推广文档返回在结果列表的顶部。元数据在查询规则中定义,并与查询条件进行匹配。查询规则使用元数据来匹配查询。元数据作为 rule_query 的一部分提供,可以是任何有助于区分查询的内容,例如

  • 用户输入的查询字符串
  • 有关用户的个性化元数据(例如国家/地区、语言等)
  • 特定主题
  • 推荐网站
  • 等等。

查询规则定义一个元数据键,该键将用于根据规则中指定的条件将 rule_query 中提供的元数据与该条件进行匹配。

当查询规则根据其定义的条件与 rule_query 元数据匹配时,查询规则操作将应用于底层的 organic_query

例如,可以定义一个查询规则来匹配用户输入的查询字符串 pugs 和国家/地区 us,并在规则查询满足这两个条件时推广可领养的收容所犬。

规则使用 查询规则 API 定义,并使用 规则查询 搜索。

规则定义编辑

定义规则时,请考虑以下事项

规则类型编辑

我们要应用的规则类型。目前只有一种规则类型

  • pinned 将把查询重写为 固定查询,将与查询规则匹配的指定结果固定在返回结果集的顶部。
规则条件编辑

此规则将匹配的条件。条件定义为 typemetadatavalues。允许的条件类型为

类型 匹配要求

exact

规则元数据与指定的值完全匹配。

fuzzy

规则元数据在允许的 Levenshtein 编辑距离 内与指定的值匹配。

prefix

规则元数据以指定的值开头。

suffix

规则元数据以指定的值结尾。

contains

规则元数据包含指定的值。

lt

规则元数据小于指定的值。

lte

规则元数据小于或等于指定的值。

gt

规则元数据大于指定的值。

gte

规则元数据大于或等于指定的值。

always

始终与所有规则查询匹配。

规则操作编辑

规则匹配查询时要采取的操作

  • ids 将固定指定的 _id
  • docs 将固定指定索引中的指定文档。

在搜索单个索引时使用 ids,在搜索多个索引时使用 docsidsdocs 不能在同一个查询中组合使用。有关详细信息,请参阅 固定查询

添加查询规则编辑

您可以使用 创建或更新查询规则集 调用来添加查询规则。这将添加一个规则集,其中包含一个或多个查询规则,这些规则将应用于与它们指定的条件匹配的查询。

以下命令将创建一个名为 my-ruleset 的查询规则集,其中包含两个固定文档规则

  • 第一个规则将在 query_string 元数据值与 pugglespugs 模糊匹配并且用户的地理位置在美国时,生成一个 固定查询,将 _id id1id2 固定为顶部匹配项。
  • 第二个规则将在 query_string 元数据值包含 beagles 时,生成一个 固定查询,将 my-index-000001 索引中的 id3_idmy-index-000002 索引中的 id4 固定为顶部匹配项。
PUT /_query_rules/my-ruleset
{
  "rules": [
    {
      "rule_id": "rule1",
      "type": "pinned",
      "criteria": [
        {
          "type": "fuzzy",
          "metadata": "query_string",
          "values": [ "puggles", "pugs" ]
        },
        {
          "type": "exact",
          "metadata": "user_country",
          "values": [ "us" ]
        }
      ],
      "actions": {
        "ids": [
          "id1",
          "id2"
        ]
      }
    },
    {
      "rule_id": "rule2",
      "type": "pinned",
      "criteria": [
        {
          "type": "contains",
          "metadata": "query_string",
          "values": [ "beagles" ]
        }
      ],
      "actions": {
        "docs": [
          {
            "_index": "my-index-000001",
            "_id": "id3"
          },
          {
            "_index": "my-index-000002",
            "_id": "id4"
          }
        ]
      }
    }
  ]
}

API 响应返回 createdupdated 的结果,具体取决于这是新的规则集还是已编辑的规则集。

每个规则集最多可以包含 100 个规则。可以使用 xpack.applications.rules.max_rules_per_ruleset 集群设置将此限制增加到 1000。

{
  "result": "created"
}

您可以使用 获取查询规则集 调用来检索您刚刚创建的规则集,使用 列出查询规则集 调用来检索所有查询规则集的摘要,以及使用 删除查询规则集 调用来删除查询规则集。

执行规则查询编辑

定义查询规则集后,可以使用 规则 查询来搜索此规则集。上面定义的 my-ruleset 的示例查询为

GET /my-index-000001/_search
{
  "query": {
    "rule_query": {
      "organic": {
        "query_string": {
          "query": "puggles"
        }
      },
      "match_criteria": {
        "query_string": "puggles",
        "user_country": "us"
      },
      "ruleset_id": "my-ruleset"
    }
  }
}

此规则查询将与定义的查询规则集中的 rule1 匹配,并将把有机查询转换为固定查询,其中 id1id2 固定为顶部匹配项。有机查询中的任何其他匹配项都将在固定结果下方返回。

规则集中可能有多个规则与单个 rule_query 匹配。在这种情况下,固定文档将按以下顺序返回

  • 匹配规则在规则集中的位置
  • 如果单个规则中指定了多个文档,则按指定的顺序