Elasticsearch:你是说,用于混合搜索(hybrid search)

作者:来自 Elastic Kathleen_DeRusso

如果你尝试过搭建 混合搜索(hybrid search) 体验,你就知道学习曲线可能很陡峭。尤其是当文本搜索和语义搜索结果结合时,每种搜索返回的得分可能差异很大,很难知道从哪里开始,手动调优结果也容易出错。好消息是,我们让这个过程变得简单得多。

本文将侧重于很多默认设置,但值得注意的是,我们也内置了大量自定义功能,因此既支持简单的 "顺畅路径" 用例,也支持强大、可定制的专家用例。

索引你的数据

首先,从 semantic_text 字段开始。Semantic text 设计得像一个普通文本字段一样使用,但它会透明地处理分块、推理和语义搜索。至少,你只需要为你的字段创建映射:

markdown 复制代码
`

1.  PUT my-index
2.  {
3.    "mappings": {
4.      "properties": {
5.        "semantic_title": {
6.          "type": "semantic_text"
7.        }
8.      }
9.    }
10.  }

`AI写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)

这个映射会创建默认设置,例如默认使用我们内部的 ELSER 模型进行推理。无需配置索引管道!如果你是第一次尝试 semantic_text ,这个教程是一个很好的起点。

为了确保 semantic_text 像普通文本字段一样工作,我们增加了对在 semantic_text 字段上使用 match 查询的支持,让你可以透明地进行语义搜索:

bash 复制代码
`

1.  POST my-index/_search
2.  {
3.    "query": {
4.      "match": {
5.        "semantic_title": "What is semantic search?"
6.      }
7.    }
8.  }

`AI写代码

使用检索器进行混合搜索

我们在很多搜索用例中发现,match 查询及其相关权重已经能很好地满足需求。虽然检索器(retrievers)已经存在一段时间,提供了像 RRF 这样的功能,我们简化了语法,使其可以无缝地与任意组合的 text 和 semantic_text 字段一起使用,并自动完成得分组合和归一化。

你可以阅读这篇博客,了解这种语法糖的由来。下面是使用 RRF 进行混合搜索的示例:

bash 复制代码
`

1.  GET my-index/_search
2.  {
3.    "retriever": {
4.      "rrf": {
5.        "fields": ["title", "semantic_title"],
6.        "query": "What is semantic search?"
7.      }
8.    }
9.  }

`AI写代码

以及使用 linear retriever 的类似示例:

bash 复制代码
`

1.  GET my-index/_search{
2.    "retriever": {
3.      "linear": {
4.        "fields": ["title", "semantic_title^2"],
5.        "query": "What is semantic search?",
6.        "normalizer": "l2_norm"
7.      }
8.    }
9.  }

`AI写代码

这些可以直接接入像 text_similarity_reranker retriever 这样的检索器,从而对混合搜索结果进行语义重排序。很简单,对吧?

使用 ES|QL 进行混合搜索

说到这里,我们正在开发的一些最令人兴奋的功能,是使用我们新的管道查询语言 ES|QL ,它对于混合搜索用例非常强大。如果你参加过今年的 Elastic{ON} 活动,这个预览可能看起来有点熟悉。

让我们从 match 函数开始。我们可以通过直接引用 match 来表示:

sql 复制代码
`

1.  FROM my-index METADATA _score
2.  | WHERE match(title, "What is semantic search?")
3.  | SORT _score DESC

`AI写代码

或者通过简写语法:

sql 复制代码
`

1.  FROM my-index METADATA _score
2.  | WHERE title:"What is semantic search?"
3.  | SORT _score DESC

`AI写代码

最棒的是,因为我们使用的是 match ,就像在 DSL 中一样,semantic_text 开箱即用!

现在,当你想使用 semantic_text 组合结果时,可以使用 FORK 命令,在不同的分支中执行每个 match 查询,并将它们返回在同一个结果中:

sql 复制代码
`

1.  FROM my-index METADATA _score
2.  | FORK 
3.    (WHERE semantic_title: "What is semantic search?" | SORT _score DESC)
4.    (WHERE title:"What is semantic search?" | SORT _score DESC)

`AI写代码

然后,你可以使用 FUSE 命令,使用 RRF 算法将这些结果合并:

sql 复制代码
`

1.  FROM my-index METADATA _score
2.  | FORK 
3.    (WHERE semantic_title: "What is semantic search?" | SORT _score DESC)
4.    (WHERE title:"What is semantic search?" | SORT _score DESC)
5.  | FUSE
6.  | SORT _score DESC

`AI写代码

你也可以将其应用到其他用例,例如重排序(rerank)和补全(completion)。

最后,有时你的用例可能更适合仅执行词汇搜索,而不是语义搜索。我们也可以在查询时使用 fork 来决定执行词汇搜索还是语义搜索 ------ 例如根据查询中的词数,较短的查询在某些用例中可能从语义搜索中获益不大。

sql 复制代码
`

1.  FROM search-index METADATA _score
2.  | EVAL lexical = MV_COUNT(SPLIT(?query, " ")) <= 3
3.  | FORK ( WHERE lexical | WHERE title:?query )
4.         ( WHERE NOT lexical | WHERE semantic_title:?query )
5.  | SORT _score DESC

`AI写代码

这只是我们能做的一个简短示例,但如果你深入阅读我们的文档,你会发现这些功能同样非常强大且可定制!试一试吧,我们期待听到你的反馈!

原文:discuss.elastic.co/t/dec-5th-2...

相关推荐
Elasticsearch几秒前
三个区域、三个 Kibana、一个视图:跨集群搜索登陆 Elastic 合成监测
elasticsearch
keyipatience8 分钟前
Git学习(3)合并冲突全解析:从原理到实战解决
大数据·elasticsearch·搜索引擎
刘老高35 分钟前
微服务架构实战:ShardingSphere Proxy + Canal 分库分表与 ES 同步全链路
elasticsearch·微服务·架构
Elasticsearch35 分钟前
Elastic 重大事件功能如何将 100 条日志样本转化为检测规则
elasticsearch
Elastic 中国社区官方博客20 小时前
5 分钟内将 56 页扫描文档转化为带引用的答案:面向搜索无法读取的文档的检索增强生成流水线
大数据·运维·人工智能·elasticsearch·搜索引擎·信息可视化·全文检索
Elasticsearch2 天前
5 分钟内将 56 页扫描文档转化为带引用的答案:面向搜索无法读取的文档的检索增强生成流水线
elasticsearch
core5123 天前
Elasticsearch 车牌号片段搜索:n-gram 倒排索引实战方案
elasticsearch·n-gram·索引·倒排索引·号牌·片段
এ慕ོ冬℘゜3 天前
ES Promise.all/ Promise.race
前端·javascript·elasticsearch
Sayai3 天前
Elasticsearch 日志写入链路调优实战:ingest pipeline 补时间戳、时区偏移修复与按值类型路由(附 translog 实测)
大数据·运维·elasticsearch·搜索引擎·性能优化
总爱写点小BUG3 天前
git-tidy:一个把「提交规范治理」做成闭环的 Git 桌面客户端
大数据·elasticsearch·搜索引擎