『备忘录』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中数据都存储在分片中,当执行搜索时每个分片独立搜索后,数据再经过整合返回.那么,如何实现分页查询呢? 按照一般的查询流程来说,如 ...
随机推荐
- 010——数组(十)compact extract in_array
<?php /** 10 数组 compact extract in_array */ //compact() (紧凑的,简洁的) 将变量转换为数组,变量名为数组键名,变量值为数组的键值. /* ...
- C# 设计模式巩固笔记 - 适配器模式
前言 多读书.多学习 介绍-适配器模式 定义:适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁.这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能. 实现 这里有 ...
- js常用正则表达式,滚蛋吧!你们测试组bug,让你挑
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- bfs+状态压缩dp
题目连接 题解 : 对两两管道进行bfs,然后用dp[i][j] 来表示在i状态下通过了前j个管道 参考博客 #include<bits/stdc++.h> using namespace ...
- LVS模式三:NAT模式
一.NAT模式 NAT(Network Address Translation,网络地址转换).数据包传输过程就是把客户端发来的数据包的IP头的目的地址,在负载均衡器上换成其中一台RS的IP地 ...
- vue.js 源代码学习笔记 ----- $watcher
/* @flow */ import { queueWatcher } from './scheduler' import Dep, { pushTarget, popTarget } from '. ...
- Ubuntu下执行mysql的sql文件
Ubuntu下执行mysql的.sql文件 方法一: 1.执行此命令,会提示输入mysql的root账户的密码,验证成功后,会在dbname这个数据库中执行filename.sql这个脚本,其中f ...
- 动态加载vs静态加载
动态加载: 1:灵活,可以在需要的时候用LoadLibrary进行加载,在不需要的时候用FreeLibrary进行卸载,这样可以不必占用内存. 2:可以在没有dll时候发现,而不致程序报错. 3:加载 ...
- TeamView
1.TeamView TeamViewer是一个能在任何防火墙和NAT代理的后台用于远程控制,桌面共享和文件传输的简单且快速的解决方案.为了连接到另一台计算机,只需要在两台计算机上同时运行 TeamV ...
- flowable DmnEngine和DmnEngineConfiguration
一.DmnEngineConfiguration创建实例 DmnEngineConfiguration 提供了7个公共的静态方法,用于创建自身实例. 其中5个是使用spring的机制加载配置文件. 另 ...