『备忘录』elasticsearch 去重分页查询
一开始数据结构设计的很复杂,又是父子关系又是嵌套关系,结果发现不能通过简单的查询得到想要的结果:比如一个商店只出现一件符合条件的商品,弄得查询语句就变成这样了
curl -XPOST http://localhost:9200/bnb_shop_room/_search -H 'Content-Type:application/json' -d'
{
"query":{
"bool":{
"must":[
{"match":{"shop_name":"民宿"}},
{"has_child":{
"type":"roomBase",
"query": {
"bool":{
"must":[
{"has_child":
{
"type":"roomPrice",
"query":{
"bool":{
"must":[
{
"nested":{
"path":"room_prices",
"query": {
"bool":{
"must":[
{
"range":{
"room_prices.date":{
"gt":"2018-03-24",
"lt":"2019-09-26"
}
}
},
{
"term":{
"room_prices.status":1
}
},
{
"range":{
"room_prices.price":{
"gt":0
}
}
}
]
}
}
}
}
]
}
}
}
}
]
}
}
}
}
]
}
},
"size":5,
"from":0,
"sort": [
{
"_geo_distance": {
"shop_location" : {
"lat" : "22.5971370000",
"lon" : "114.5201730000"
},
"order": "asc",
"unit": "m"
}
}
],
"aggs": {
"shop": {
"terms": {
"field" : "shop_id"
},
"aggs": {
"room": {
"children": {
"type": "roomBase"
},
"aggs": {
"price": {
"children": {
"type": "roomPrice"
},
"aggs": {
"nestedPrice": {
"nested": {
"path": "room_prices"
},
"aggs": {
"statsPrice": {
"stats": {
"field": "room_prices.price"
}
}
}
}
}
}
}
}
}
}
}
}'
最后改了索引信息的结构,不做关联关系,全部平铺,冗余数据,发现查询语句简单多了,查询语句变成如下:
curl -XPOST http://localhost:9200/shop_room_day/_doc/_search -H 'Content-Type:application/json' -d'
{
"query":{
"bool":{
"must":[
{"match":{"shop_name":"主题 深圳"}},
{
"range":{
"day_date":{
"gt":"2018-03-27",
"lt":"2018-03-29"
}
}
},
{
"term":{
"day_status":1
}
},
{
"range":{
"day_price":{
"gt":0
}
}
}
]
}
},
"sort": [
{"day_price":{"order":"asc"}},
{
"_geo_distance": {
"shop_location" : {
"lat" : "22.5971370000",
"lon" : "114.5201730000"
},
"order": "asc",
"unit": "m"
}
}
],
"collapse": {
"field": "shop_id"
},
"size":2,
"from":0
}'
用 『collapse』功能能从搜索结果中去重,翻页靠『size』和『from』组合,当然也可以用『scroll』的方式实现翻页效果
折叠『collapse』功能推荐这篇案例文章:「Elasticsearch 5.x 字段折叠的使用」 https://elasticsearch.cn/article/132
分页『scroll』功能推荐这篇案例文章:「elasticsearch 深分页问题以及解决方法」https://blog.csdn.net/wild46cat/article/details/64123353
『备忘录』elasticsearch 去重分页查询的更多相关文章
- ES 25 - Elasticsearch的分页查询及其深分页问题 (deep paging)
目录 1 分页查询方法 2 分页查询的deep paging问题 1 分页查询方法 在GET请求中拼接from和size参数 // 查询10条数据, 默认从第0条数据开始 GET book_shop/ ...
- SpringBoot 整合 Elasticsearch深度分页查询
es 查询共有4种查询类型 QUERY_AND_FETCH: 主节点将查询请求分发到所有的分片中,各个分片按照自己的查询规则即词频文档频率进行打分排序,然后将结果返回给主节点,主节点对所有数据进行汇总 ...
- ElasticSearch——分页查询
前言 ElasticSearch实现分页查询,有3种方式,他们在数据查询中各自占据着不同的优势,因此在搜索引擎的数据分页过程中,如何更好地利用各自的优势来进行数据查询是一个非常重要的过程. 传统分页( ...
- 分页查询信息(使用jdbc连接mysql数据库实现分页查询任务)
分页查询信息 使用jdbc连接mysql数据库实现分页查询任务 通过mysql数据库提供的分页机制,实现商品信息的分页查询功能,将查询到的信息显示到jsp页面上. 本项目 ...
- 【分页问题】elasticsearch 深分页问题以及解决方法
本文主要参考: 1.https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-scroll.html ...
- es的查询、排序查询、分页查询、布尔查询、查询结果过滤、高亮查询、聚合函数、python操作es
今日内容概要 es的查询 Elasticsearch之排序查询 Elasticsearch之分页查询 Elasticsearch之布尔查询 Elasticsearch之查询结果过滤 Elasticse ...
- Elasticsearch——分页查询From&Size VS scroll
Elasticsearch中数据都存储在分片中,当执行搜索时每个分片独立搜索后,数据再经过整合返回.那么,如果要实现分页查询该怎么办呢? 更多内容参考Elasticsearch资料汇总 按照一般的查询 ...
- Oracle 分页查询与数据去重
1.rownum字段 Oracle下select语句每个结果集中都有一个伪字段(伪列)rownum存在.rownum用来标识每条记录的行号,行号从1开始,每次递增1.rownum是虚拟的顺序值,前提是 ...
- ElasticSearch—分页查询
ElasticSearch查询—分页查询详解 Elasticsearch中数据都存储在分片中,当执行搜索时每个分片独立搜索后,数据再经过整合返回.那么,如何实现分页查询呢? 按照一般的查询流程来说,如 ...
随机推荐
- UIWebView和WKWebView的使用及js交互
UIWebView和WKWebView的使用及js交互 web页面和app直接的交互是很常见的东西,之前尝试过flex和js的相互调用以及android和js的相互调用,却只有ios没试过,据说比较复 ...
- 【MySQL】查看当前存储引擎
一般情况下,mysql会默认提供多种存储引擎,你可以通过下面的查看: 看你的mysql现在已提供什么存储引擎: mysql> show engines; 看你的mysql当前默认的存储引擎: m ...
- Ansible 手册系列 二(安装)
通过yum(CentOS, RHEL)安装 系统版本: CentOS7.2 yum install ansible -y 通过pip安装 安装easy_install # 安装easy_install ...
- JDK的KeyTool和KeyStore等加密相关
Keytool是一个有效的安全钥匙和证书的管理工具. Java 中的 keytool.exe (位于JDK\Bin下)可以用来创建数字证书,所有的数字证书是以一条一条(用别名区别,不区分大小)地存储在 ...
- Linux安装apue.3e(基于ubuntu16.0.4)
本菜刚刚学习UNIX高级编程,无奈搭建本书编程环境时遇到不少问题,参考了网上各路大神的解决办法,最终解决了问题. (1)下载源代码,可以去官网下载:http://apuebook.com/code3e ...
- 一些常用的UI控件
让你的 EditText 全部清除: 网址:https://github.com/MrFuFuFu/ClearEditText
- UML_04_时序图
一.前言 时序图建模工具,推荐一个工具 https://www.zenuml.com/ 时序图是一种强调消息时序的交互图,他由对象(Object).消息(Message).生命线(Lifeline) ...
- Java发送短信
1.接口使用介绍 发送短信肯定需要使用第三方接口,Java本身是肯定不能直接发送短信的.第三方接口有很多,这里直接找个正规靠谱一点的学习一下 这里使用了中国网建(http://sms.webchine ...
- Shell 命令行批量处理图片文件名
Shell 命令行批量处理图片文件名 从网上下载了一堆图片,有的是*.jpg的,有的是*.jpeg的.并且文件名有长有短,很是糟心.因此,我想把这些文件给全部整理好,当然是用shell来处理啦! 说干 ...
- Java多线程编程实战指南(核心篇)读书笔记(二)
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76651408冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...