优化混合搜索
这是一个实验性功能,不建议在生产环境中使用。有关该功能进展的更新或如果您想提供反馈,请参阅相关的 GitHub 问题。
在 OpenSearch 中使用混合搜索的一个主要挑战是如何有效地结合词法搜索和向量搜索的结果。OpenSearch 提供了不同的技术和各种参数,您可以进行实验以找到最适合您应用的设置。然而,最佳实践很大程度上取决于您的数据、用户行为和应用领域——没有一劳永逸的解决方案。
搜索相关性工作台可以帮助您系统地找到满足您需求的理想参数集。
要求
在内部,优化混合搜索涉及运行多个搜索质量评估实验。对于这些实验,您需要一个查询集、判断和搜索配置。搜索相关性工作台目前支持仅包含两个查询子句的混合搜索优化。虽然混合搜索通常结合了向量查询和词法查询,但您也可以使用两个词法查询子句来运行混合搜索优化。
PUT _plugins/_search_relevance/search_configurations
{
"name": "hybrid_query_lexical",
"query": "{\"query\":{\"hybrid\":{\"queries\":[{\"match\":{\"title\":\"%SearchText%\"}},{\"match\":{\"category\":\"%SearchText%\"}}]}}}",
"index": "ecommerce"
}
混合搜索优化在结合词法和向量搜索结果时最具价值。为了获得最佳结果,请将混合搜索查询配置为包含两个子句:一个文本查询子句和一个神经网络查询子句。您无需配置搜索管道来组合结果,因为混合搜索优化过程会自动处理。以下是适用于混合搜索优化的搜索配置示例:
PUT _plugins/_search_relevance/search_configurations
{
"name": "hybrid_query_text",
"query": "{\"query\":{\"hybrid\":{\"queries\":[{\"multi_match\":{\"query\":\"%SearchText%\",\"fields\":[\"id\",\"title\",\"category\",\"bullets\",\"description\",\"attrs.Brand\\\",\"attrs.Color\"]}},{\"neural\":{\"title_embedding\":{\"query_text\":\"%SearchText%\",\"k\":100,\"model_id\":\"lRFFb5cBHkapxdNcFFkP\"}}}]}},\"size\":10}",
"index": "ecommerce"
}
在 query
中指定的模型 ID 必须是部署在 OpenSearch 中的模型的有效模型 ID。目标索引必须包含用于神经网络搜索嵌入的字段(在此示例中为 title_embedding
)。
有关端到端示例,请参阅 search-relevance
存储库。
运行混合搜索优化实验
您可以通过调用搜索相关性工作台的 experiments
端点来创建混合搜索优化实验。
端点
PUT _plugins/_search_relevance/experiments
请求示例
PUT _plugins/_search_relevance/experiments
{
"querySetId": "b16a6a2b-ed6e-49af-bb2b-fc739dcf24e6",
"searchConfigurationList": ["508a8812-27c9-45fc-999a-05f859f9b210"],
"judgmentList": ["1b944d40-e95a-43f6-9e92-9ce00f70de79"],
"size": 10,
"type": "HYBRID_OPTIMIZER"
}
示例响应
{
"experiment_id": "0f4eff05-fd14-4e85-ab5e-e8e484cdac73",
"experiment_result": "CREATED"
}
实验过程
混合搜索优化实验根据搜索配置运行不同的评估。以下参数和参数值将被考虑在内:
- 两种归一化技术:
l2
和min_max
。 - 三种组合技术:
arithmetic_mean
、harmonic_mean
、geometric_mean
。 - 词法和神经网络搜索权重,其值范围从
0.0
到1.0
,以 0.1 为增量。
查询集中的每个查询都会针对所有不同的参数组合执行,并使用判断列表评估结果。
评估结果
每次评估的结果都会被存储。您可以通过在过去实验概览中选择相应的实验,在 OpenSearch Dashboards 中查看结果,如下图所示。
所有已执行的查询及其计算出的搜索指标都会显示,如下图所示。
要查看查询变体,请选择其中一个查询,如下图所示。
您也可以使用以下 SQL 搜索语句并提供您的 experimentId
来检索此信息:
POST _plugins/_sql
{
"query": "SELECT ev.parameters.normalization, ev.parameters.combination, ev.parameters.weights, ev.results.evaluationResultId, ev.experimentId, er.id, er.metrics, er.searchText FROM search-relevance-experiment-variant ev JOIN search-relevance-evaluation-result er ON ev.results.evaluationResultId = er.id WHERE ev.experimentId = '814e2378-901c-4273-9873-9b758a33089d'"
}