首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >结合查询规则与语义搜索:提升 Elasticsearch 搜索能力

结合查询规则与语义搜索:提升 Elasticsearch 搜索能力

原创
作者头像
点火三周
发布2024-12-25 16:20:49
发布2024-12-25 16:20:49
1K0
举报
文章被收录于专栏:Elastic Stack专栏Elastic Stack专栏

使用 Elasticsearch 进行语义搜索和查询规则的结合

你知道吗,查询规则可以无缝配合语义搜索使用?通过将查询规则作为一个检索器,结合复杂逻辑(如RRF语义重排序),可以更轻松地实现强大的搜索功能。

查询规则是我们相关性工具箱中的重要工具。

介绍查询规则检索器

规则检索器是一个复合检索器,可以在检索器树中链式连接复杂行为,并且操作顺序很重要。

就像规则查询一样,规则检索器基于已经定义的查询规则集。你可以使用查询规则 CRUD API创建规则集。

实际应用中是怎样的呢?下面是一个简单的查询规则集示例,当 query_string 参数匹配 puggles 时,固定文档 id1

代码语言:javascript
复制
PUT /_query_rules/my-ruleset
{
  "rules": [
    {
      "rule_id": "rule1",
      "type": "pinned",
      "criteria": [
        {
          "type": "exact",
          "metadata": "query_string",
          "values": [ "puggles" ]
        }
      ],
      "actions": {
        "ids": [
          "id1"
        ]
      }
    }
  ]
}

接下来是一个匹配上述规则集的规则检索器示例:

代码语言:javascript
复制
POST my-index/_search
{
  "retriever": {
    "rule": {
      "match_criteria": {
        "query_string": "puggles"
      },
      "ruleset_ids": [
        "my-ruleset"
      ],
      "retriever": {
        "standard": {
          "query": {
            "query_string": {
              "query": "puggles"
            }
          }
        }
      }
    }
  }
}

在这个例子中,我们定义了一个标准的子检索器,它只是一个简单的 query_string 查询。这与当前的规则查询工作方式非常相似,指定一个常规查询。检索器将返回应用了匹配规则的搜索结果列表。

语义搜索和查询规则

简单的例子并没有展示查询规则的真正威力:在语义搜索之上应用业务规则。这可以帮助返回对促销活动重要的结果,或者修正语义搜索未能返回我们期望结果的查询。

我们可以使用相同的检索器框架,通过在定义的标准检索器下指定这些查询,来执行语义搜索的查询规则。以下是使用 semantic 查询的示例:

代码语言:javascript
复制
POST my-index/_search
{
  "retriever": {
    "rule": {
      "match_criteria": {
        "query_string": "puggles"
      },
      "ruleset_ids": [ "my-ruleset" ],
      "retriever": {
        "standard": {
          "query": {
            "semantic": {
              "field": "semantic_field",
              "query": "what is the best pug mix?"
            }
          }
        }
      }
    }
  }
}

同样,当定义为 standard 检索器时,sparse_vector 和 knn 查询也可以无缝工作。

重排序和查询规则

你可以通过将 rrf 检索器嵌套在 rule 检索器下,将 RRF 与查询规则结合使用,例如:

代码语言:javascript
复制
POST my-index/_search
{
  "retriever": {
    "rule": {
      "match_criteria": {
        "query_string": "puggles"
      },
      "ruleset_ids": [
        "my-ruleset"
      ],
      "retriever": {
        "rrf": {
          "retrievers": [
            {
              "standard": {
                "query": {
                  "semantic": {
                    "field": "semantic_field",
                    "query": "what is the best pug mix?"
                  }
                }
              }
            },
            {
              "standard": {
                "query": {
                  "query_string": {
                    "query": "puggles"
                  }
                }
              }
            }
          ]
        }
      }
    }
  }
}

重要提示: 顺序在这里非常重要。虽然技术上没有什么阻止你在规则检索器之上运行 RRF,但由于检索器树中的操作顺序,这样做不会如预期那样工作。当你运行规则检索器时,为确保所有规则都按预期应用,规则检索器必须始终是最外层/顶层检索器。

同样,你可以将查询规则与语义重排序结合使用。以下是使用我们 Elastic 重排序器的示例:

代码语言:javascript
复制
POST my-index/_search
{
  "retriever": {
    "rule": {
      "match_criteria": {
        "query_string": "puggles"
      },
      "ruleset_ids": [ "my-ruleset" ],
      "retriever": {
        "text_similarity_reranker": {
          "retriever": {
            "standard": {
              "query": {
                "semantic": {
                  "field": "semantic_field",
                  "query": "what is the best pug mix?"
                }
              }
            }
          }
        }
      },
      "field": "text_field",
      "inference_id": "elastic-rerank-endpoint",
      "inference_text": "what is the best pug mix?"
    }
  }
}

将这一切结合起来,下面是一个如何将语义搜索、sparse_vector、knn 和 lexical text 搜索查询与 RRF 和语义重排序结合起来,并在它们之上应用查询规则的示例:

代码语言:javascript
复制
POST my-index/_search
{
  "retriever": {
    "rule": {
      "match_criteria": {
        "query_string": "puggles"
      },
      "ruleset_ids": [ "my-ruleset" ],
      "retriever": {
        "text_similarity_reranker": {
          "retriever": {
            "rrf": {
              "retrievers": [
                {
                  "standard": {
                    "query": {
                      "sparse_vector": {
                        "field": "sparse_field",
                        "inference_id": "elser-endpoint",
                        "query": "what is the best pug mix?"
                      }
                    }
                  }
                },
                {
                  "standard": {
                    "query": {
                      "knn": {
                        "field": "dense_field",
                        "query_vector": [ 1, 2, 3 ],
                        "k": 10,
                        "num_candidates": 100
                      }
                    }
                  }
                },
                {
                  "standard": {
                    "query": {
                      "semantic": {
                        "field": "semantic_field",
                        "query": "what is the best pug mix?"
                      }
                    }
                  }
                },
                {
                  "standard": {
                    "query": {
                      "query_string": {
                        "query": "puggles"
                      }
                    }
                  }
                }
              ]
            }
          },
          "field": "text_field",
          "inference_id": "elastic-rerank-endpoint",
          "inference_text": "what is the best pug mix?"
        }
      }
    }
  }
}

结合规则类型

查询规则不仅仅是用来固定文档的!在 Elasticsearch 8.16 中,我们引入了一种新的规则类型,排除。这允许你指定一些永远不希望出现在搜索结果中的文档,以及一些希望固定在搜索结果顶部的文档。

排除规则的使用场景包括但不限于:

  • 通过移除对查询无帮助或不相关的结果来解决特定查询的相关性问题
  • 暂时抑制某些不希望出现在任何搜索结果中的结果,直到特定时间

这是一个包含固定和排除规则的查询规则集示例:

代码语言:javascript
复制
PUT /_query_rules/my-ruleset
{
  "rules": [
    {
      "rule_id": "rule1",
      "type": "pinned",
      "criteria": [
        {
          "type": "exact",
          "metadata": "query_string",
          "values": [ "puggles" ]
        }
      ],
      "actions": {
        "ids": [
          "id1"
        ]
      }
    },
    {
      "rule_id": "rule2",
      "type": "exclude",
      "criteria": [
        {
          "type": "exact",
          "metadata": "query_string",
          "values": [ "chiweenies" ]
        }
      ],
      "actions": {
        "ids": [
          "id2"
        ]
      }
    }
  ]
}

规则根据匹配条件应用,因此一个规则检索器可以在同一个查询中同时匹配固定和排除的文档。

自己动手试试

当结合语义搜索和重排序策略时,rule 检索器非常强大,因为它在利用语义搜索的同时提供了对搜索结果的精细控制。规则检索器已经在我们的无服务器服务中可用,并将在 8.17.0 及以上的 Stack 版本中可用。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 使用 Elasticsearch 进行语义搜索和查询规则的结合
    • 介绍查询规则检索器
    • 语义搜索和查询规则
    • 重排序和查询规则
    • 结合规则类型
    • 自己动手试试
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档