Elasticsearch:运用 Pinned query 来提升特定的结果
作者:Sagar Patel, Developer and Community Member
在我之前的文章 “Elasticsearch: 运用 Pinned query 来提高文档的排名 (7.5发行版新功能)”,我已经详述这个话题了。不过在今天的这篇文章中,它有一些额外的一些知识点可以让我们更加深入地了解这个 Pinned query。算是对之前的文章做一个补充吧。
在本文中,通过实际用例了解 Elasticsearch 中的 pinned query 如何为你服务。
什么是 pinned query,我们该如何运用它?
Pinned query 首先在 Elasticsearch 7.4 中发布,用于将所选文档或文档提升到位于特定查询结果顶部的任何其他文档之上。 它可用于文档提升或引导搜索,即使相关性得分较低,某些文档也必须出现在顶部结果中。
以下是 pinned query 的一些实际用例:
- 你正在开发一个知识中心并监控用户对每篇文章的点击。 给定查询的最常点击文章应显示在页面顶部。
- 你想在搜索顶部显示新推出的产品作为促销。 此外,对于某些产品,你希望将此功能用于季节性营销。
Pinned query 使用
让我们首先使用示例产品数据集来开发我们的 pinned query。
示例数据索引
PUT product/_bulk
{"index":{"_id":"prod101"}}
{"brand":"Apple","model":"iphone 11","price":800}
{"index":{"_id":"prod102"}}
{"brand":"Samsung","model":"galaxy m32","price":700}
{"index":{"_id":"prod103"}}
{"brand":"Apple","model":"iphone 13","price":1000}
{"index":{"_id":"prod104"}}
{"brand":"Apple","model":"iphone 12","price":900}
{"index":{"_id":"prod105"}}
{"brand":"Apple","model":"iphone 7","price":400}
没有使用 pinned query 的搜索
POST product/_search?filter_path=**.hits
{"query": {"match": {"model": "iphone"}}
}
上面命令的响应为:
{"hits": {"hits": [{"_index": "product","_id": "prod101","_score": 0.2876821,"_source": {"brand": "Apple","model": "iphone 11","price": 800}},{"_index": "product","_id": "prod103","_score": 0.2876821,"_source": {"brand": "Apple","model": "iphone 13","price": 1000}},{"_index": "product","_id": "prod104","_score": 0.2876821,"_source": {"brand": "Apple","model": "iphone 12","price": 900}},{"_index": "product","_id": "prod105","_score": 0.2876821,"_source": {"brand": "Apple","model": "iphone 7","price": 400}}]}
}
目前,你可以看到产品按相关性排序,并且最近推出的项目不会出现在顶部。 现在让我们看看如何使用 pinned query 在顶部推广最近发布的产品。
Pinned query 示例
在这里,我们正在努力推广最新的 iPhone。
POST product/_search?filter_path=**.hits
{"query": {"pinned": {"ids": ["prod103","prod104"],"organic": {"match": {"model": "iphone"}}}}
}
上面的命令返回如下的结果:
{"hits": {"hits": [{"_index": "product","_id": "prod103","_score": 1.7014124e+38,"_source": {"brand": "Apple","model": "iphone 13","price": 1000}},{"_index": "product","_id": "prod104","_score": 1.7014122e+38,"_source": {"brand": "Apple","model": "iphone 12","price": 900}},{"_index": "product","_id": "prod101","_score": 0.2876821,"_source": {"brand": "Apple","model": "iphone 11","price": 800}},{"_index": "product","_id": "prod105","_score": 0.2876821,"_source": {"brand": "Apple","model": "iphone 7","price": 400}}]}
}
在 Elasticsearch 返回的结果之上,你可以分别看到 iPhone 13 和 iPhone 12,其他结果直接位于它们下方。
如何使用具有多个索引的 pinned query
如果你想跨多个索引搜索产品,请使用下面的查询和索引名称。
GET /_search
{"query": {"pinned": {"docs": [{"_index": "product-01","_id": "prod101"},{"_index": "product-01","_id": "prod102"},{"_index": "product-02","_id": "prod105"}],"organic": {"match": {"model": "iphone"}}}}
}
注意:请注意,你最多只能为 pinned query 提供 100 个 ID。
在以下情况下, pinned query 结果将不存在
Elasticsearch 默认根据相关性返回文档; 但是,假设对于某些查询,你需要特定的排序选项,例如基于日期、产品数量等。在这种情况下,你不会收到固定结果,因为排序没有考虑相关性。
让我们尝试推广更便宜的 iPhone 7 和 iPhone 11 并使用价格排序。
POST product/_search?filter_path=**.hits
{"sort": [{"price": {"order": "desc"}}],"query": {"pinned": {"ids": ["prod105","prod101"],"organic": {"match": {"model": "iphone"}}}}
}
上面命令返回的结果是:
{"hits": {"hits": [{"_index": "product","_id": "prod103","_score": null,"_source": {"brand": "Apple","model": "iphone 13","price": 1000},"sort": [1000]},{"_index": "product","_id": "prod104","_score": null,"_source": {"brand": "Apple","model": "iphone 12","price": 900},"sort": [900]},{"_index": "product","_id": "prod101","_score": null,"_source": {"brand": "Apple","model": "iphone 11","price": 800},"sort": [800]},{"_index": "product","_id": "prod105","_score": null,"_source": {"brand": "Apple","model": "iphone 7","price": 400},"sort": [400]}]}
}
它应该出现在顶部,因为我们正在尝试推广 iPhone 7 和 iPhone 11。但是,在这种情况下,将不会考虑 pinned query,因为我们按 price 降序排序。
Elasticsearch:运用 Pinned query 来提升特定的结果相关推荐
- 【Elasticsearch】Elasticsearch filter和query的不同
1.概述 吃透 | Elasticsearch filter和query的不同
- Elasticsearch学习---Term query和Match query
前言 在Elasticsearch中Term query和Match query都可以用来对文档中的数据进行检索,但是在检索结果上会稍有不同,本文通过案例对两者的差异进行说明. 数据准备 建立一个索引 ...
- Elasticsearch DSL中Query与Filter的不同
Elasticsearch支持很多查询方式,其中一种就是DSL,它是把请求写在JSON里面,然后进行相关的查询. 举个DSL例子 GET _search {"query": { & ...
- ElasticSearch高级 (Query DSL查询 bulk批量操作 导入数据 各种查询 实战技巧-优化比重 全量与增量数据同步)
ElasticSearch高级 01-Query DSL(Domain Specific Language) 1 查询上下文 2 相关度评分:_score 3 元数据:_source 4 Query ...
- python 查询 elasticsearch 常用方法(Query DSL)
2019独角兽企业重金招聘Python工程师标准>>> 1. 建立连接 from elasticsearch import Elasticsearch es = Elasticsea ...
- Elasticsearch filter和query的不同
1.query和filter的本质区别? 以下几张图能更好的概括: query关注点:此文档与此查询子句的匹配程度如何? filter关注点:此文档和查询子句匹配吗? 2.Query检索细化关注点 ...
- 吃透 | Elasticsearch filter和query的不同
少啰嗦,直接看东西.--罗永浩 1.query和filter的本质区别? 以下几张图能更好的概括: query关注点:此文档与此查询子句的匹配程度如何? filter关注点:此文档和查询子句匹配吗? ...
- 15.Elasticsearch 7.15 Query DSL 之 Wildcard查询、Regexp查询
Wildcard查询 介绍 返回包含与通配符模式匹配的文档. 例子 以下搜索返回 user.id 字段包含以 ki 开头并以 y 结尾的文档.这些匹配项可以包括 kiy.kity 或 kimchy G ...
- [Power Query] 标题提升
数据源 将数据源导入到Power BI Desktop,单击[转换数据]选项,进入Power Query查询编辑器界面 在Excel中第一行为标题行,从第二行开始才是数据,但在Power Query查 ...
- ElasticSearch学习----ElasticSearch中高级检索(Query)
ElasticSearch中高级检索 ①. 检索方式 _search ②. URL检索 ②. DSL检索 1. 查询所有(match_all) 2. 查询结果中返回指定条数(size) 3. 分页查询 ...
最新文章
- TIME_CHECK_PLAUSIBILITY
- matlab高中必修三数学模拟,基于MATLAB的模拟调制实验报告
- Silverlight OOB Setup
- Python eval 与 exec 函数 - Python零基础入门教程
- linux 软件 runtime,Objective-C中runtime机制的应用
- Kotlin基础-对象声明和表达式
- ES6 — 箭头函数
- pythonfor循环是迭代器吗_Python学习——for循环,生成器,迭代器详解
- Pycharm_EmmyLua断点调试Lua
- 《IT时代周刊》:雅虎兵败中国
- 方维团购V3.07版本短信插件开发
- mysql通过Navcat 备份数据.psc 还原数据时 只有表没有数据解决方法
- 这40个冷知识,据说只有1%的人知道……颠覆你的认知!
- [转载]Matlab中的CVX工具包安装
- 在js中调用微信的扫描二维码功能
- 网校系统是怎样搭建的?
- java断路器原理_Netflix Hystrix断路器原理分析
- springBoot项目如何启动多个实例
- matlab实用教程第2版 答案,MATLAB实用教程(第2版)
- 【工具-TWRP-frp-Termux】旧手机暴改成免费云服务器-MIUI刷TWRP安装magisk获取root
热门文章
- JAVA中Action层, Service层 ,modle层 和 Dao层的功能区分
- linux vim 全删文件指定内容,Linux系统文本编辑器vim指令大全
- sklearn学习笔记(1)—make_blobs函数及参数
- 用telnet登录163服务器发邮件
- 网络负能量为何发展如此迅速?
- ws office ppt基础知识
- 【重识云原生】第六章容器基础6.4.10.4节——StatefulSet实操案例-使用 StatefulSet 部署Cassandra
- 【黄啊码】fastadmin接入微信支付和支付宝支付
- XML基础知识及四种解析方法
- deploy 在私有仓库部署包 aven-metadata.xml 出现空文档报错 解决方案