作者:来自 Elastic Ioana Tagirta
在 Elasticsearch 8.18 和 9.0 中,ES|QL 支持评分、语义搜索以及更多的 match 函数配置选项,还有一个新的 KQL 函数。
使用 ES|QL 搜索
在 Elasticsearch 8.18 和 9.0 中,ES|QL 增加了一系列新功能,包括:
-
支持评分
-
语义搜索
-
更多的 match 函数配置选项
-
一个新的 KQL 函数
在这篇博客中,我们将回顾 8.18 版本的功能以及我们计划添加到 ES|QL 的其他令人兴奋的新功能,进一步加强我们对将 ES|QL 打造成一个现代搜索语言的投资,以满足你的需求,无论你是在构建一个由 ES|QL 提供支持的搜索应用程序,还是在 Kibana Discover 中分析数据。
介绍评分
在 8.17 版本中,我们增加了使用全文文本函数过滤文档的功能。如果你不熟悉 ES|QL 中的全文文本过滤,我们建议阅读我们关于它的原创博客文章。
在 8.18 和 9.0 中,我们引入了对评分的支持,使得能够根据相关性排序返回文档。要访问每个文档的得分,只需在 ES|QL 查询中添加元数据 _score
字段:
FROM books METADATA _score
| WHERE match(title, "Shakespeare") OR match(plot, "Shakespeare")
| SORT _score DESC
我们获取的得分与从等效的 search API 查询中获得的得分相同:
GET books/_search
{"query": {"bool": {"should": [{"match": {"title": "Shakespeare"}},{"match": {"title": "Shakespeare"}}]}}
}
全文本搜索函数,如 match、qstr 和 kql 只能在 WHERE 条件中使用,并且是唯一能影响得分的函数。
_score
列不仅可以用于按相关性排序文档,还可以用于自定义评分公式。在下一个示例中,我们使用得分阈值仅保留最相关的结果,然后根据读者评分添加得分加成:
FROM books METADATA _score
| WHERE match(title, "Shakespeare") OR match(plot, "Shakespeare")
| WHERE _score > 2 // we remove the documents with low scores
| EVAL new_score = _score + rating/5
| SORT new_score DESC
改进 match 函数
在 ES|QL 中,match 函数仅仅是转化为一个Query DSL 的 match 查询。在 8.18 和 9.0 中,我们扩展了 match 函数的功能,包含了当前在 Query DSL 中可用的所有选项。现在,在 ES|QL 中也可以设置常用的 match 选项,如 boost、fuzziness 和 operator:
FROM books METADATA _score
| WHERE match(title, "Dream of the red chamber", { "operator": "AND", "fuzziness": "AUTO", "boost": 0.75 })OR match(plot, "Dream of the read chamber", { "operator": "AND", "boost": 0.25 })
| SORT _score DESC
进入语义搜索
8.18 版本带来了令人兴奋的消息,语义搜索现在正式可用。我们扩展了 match 函数,支持在 semantic_text
字段类型上进行查询。
在 ES|QL 中,执行语义查询(semantic query)现在和执行全文查询一样简单,如下例所示:
FROM books METADATA _score
| WHERE semantic_title:"Shakespeare"
| SORT _score DESC
在这个示例中,我们将 semantic_title
设置为使用 semantic_text
字段类型。
将索引字段映射为 semantic_text
就是为语义搜索设置索引所需的全部操作。
查看我们的语义文本搜索教程,了解更多细节。
ES|QL 混合搜索
ES|QL 使得同时进行语义搜索和词汇搜索变得简单。根据你的用例,也可以设置不同的加权,优先显示来自语义搜索或词汇搜索的结果:
FROM books METADATA _score
| WHERE match(semantic_title, "Shakespeare", { "boost": 0.75 }) OR match(title, "Shakespeare", { "boost": 0.25 })
| SORT _score DESC
从 KQL 过渡
如果你是 Kibana Discover 的长期用户,并且使用 KQL(Kibana Query Language)来查询和可视化数据,同时你想尝试 ES|QL 但不知道从哪里开始,别担心,我们来帮你!
在 8.18 和 9.0 中,ES|QL 增加了一个新功能,允许你在 ES|QL 中使用 KQL。操作就像这样简单:
FROM logs*
| WHERE KQL("http.request.method:GET AND agent.type:filebeat")
ES|QL 已经在 Kibana Discover 中可用。
这样,你可以同时享受两者的优点:你可以继续使用 KQL,并且可以按自己的节奏开始更熟悉 ES|QL。
查看我们的 ES|QL 入门指南,获取更多信息。
8.18 和 9.0 及以后版本
在未来的版本中,我们将为 ES|QL 添加越来越多的搜索功能,包括向量搜索、语义重新排序、增强的评分自定义选项,以及结合混合搜索结果的额外方法,例如倒排排名融合(RRF)。
亲自尝试
这些变化从 Elasticsearch 8.18 开始可用,但它们已经可以在 Elasticsearch Serverless 中使用。对于 Elasticsearch Serverless,今天就开始免费的云试用,或者现在就尝试在本地机器上使用 Elastic!
跟随《在 ES|QL 中搜索和过滤》教程,亲自体验这篇博客中描述的功能!
Elasticsearch 拥有丰富的新功能,帮助你为你的用例构建最佳的搜索解决方案。深入了解我们的示例笔记本,了解更多内容,开始免费的云试用,或者现在就尝试在本地机器上使用 Elastic。
原文:ES|QL, you know, for Search - Introducing scoring and semantic search - Elasticsearch Labs