搜索
搜索算法
搜索引擎

如何聚合多个搜索引擎的结果?

很多时候google并不能满足我们的需求,因为很多网站不向爬虫开放,而是使用自己的站内搜索功能(比如hi-pda,六维空间,cnki等)。那么,可不可…
关注者
204
被浏览
142,313

10 个回答

用chrome的右键搜插件。有自定义搜索串和组合功能,可把多个搜索串放到一个组合里。

把关键词输入插件的搜索框,点组合名称,随后弹出的多个标签页就是各个网站的搜索结果。

但有些网站的搜索串不好提取(比如hipda,题主要是找到了通知我一下哈,来自地板带着爱~)

——————————————20150809更新——————————————————————

之前发在 简书,突然想起回答这个问题,转过来。

《搜索利器,用右键搜(chrome插件)同时搜索多个网站》

现在找东西很方便,外事谷歌,内事百度,只要把关键词往里面一扔,无数页面立即涌上来。但是搜索引擎有其局限——有的网站禁止爬虫,有的答案深藏于后面,更麻烦的是多种来源和类型的内容混杂在一起,让人难以辨识。即使设置搜索条件、使用搜索语法,也颇不顺手。接下来我简单地说一下尝试过的方法,再介绍一下右键搜的妙处。

谷歌自定义搜索,优点是利用谷歌的算法排序,缺点是无法区分来源查看,也没有其他过滤筛选的选项;聚合搜索引擎的网站,它们一般提供多种搜索引擎切换,或是在同一页面分屏显示多个搜索引擎,比如我以前常用的 baigoogledu.com(已悲剧)。

转战chrome后开始寻找各式插件。这些插件功能大同小异,一般是搜索引擎的切换和右键快捷搜索。这里推荐一个还不错的,名字叫 search all,它可以在搜索页面显示书签和历史记录的搜索结果。


search all 使用效果图

右键搜的常规功能没什么可道之处,普通的右键菜单搜索,加上右上插件栏的搜索入口。它的大杀招是组合搜索,只要把多个搜索串放到一个组合里,输入关键词,点击组合名,随后弹出的多个标签页就是各个网站的搜索结果。不太明白?看效果图。


右键搜使用效果图

第一步,提取搜索引擎的字符串。插件内置了常用的搜索引擎,我们也可以加入自定义的。如果右键点击网站搜索栏出现"添加为搜索引擎",即可直接复制。也可在搜索引擎中输入“搜索文字”,显示结果页面后复制完整的链接。归根到底是把搜索链接中的关键词更换为“%s”。

在搜索栏点击右键,再点击右键栏中的”添加为搜索引擎“


复制此网址


然后将网站名称和刚才复制的链接放入框中

第二步,设置搜索组合。



左边输入组合名称,点击右边输入框即可选择内置的和自定义的搜索引擎。

更新:大家可用这个验证短语来加载我的设置(qiwuyuwo),加载之后请自设短语,不要更改原始设置,方便后来者。

编辑于 2016-02-29 17:37

其他的方案绝大部分我都用过.有功能欠缺的,有慢的,有吃内存的.有用着用着挂掉的.

最后找到这个Chrome插件后,就一直没有换过.我用了五六年了,

这个插件是中国人做的,短小精悍,没有缺什么,也没有多出来不该有的.

我认为是完美的.无缺陷的.

推荐给大家.

以下是我私人配置后的效果展示.

大家可以根据自己的需求定制.理论上,可以定制任何网站的搜索.

同类别引擎按钮
不同类别顺滑切换


视频展示https://www.zhihu.com/video/1236697101180452864

GitHub和Chrome商店:
github.com/wurenny/sear

chrome.google.com/webst

编辑于 2020-04-23 17:17

可以试一下这个: 1258元搜索


1 . 搜索框输入一个关键词,同步搜索 百度、必应、搜狗、360,点击引擎logo切换

2 . 极简设计,只在网页上方有一个淡灰色小bar,下面全为搜索结果展示区,不拉扯用户的注意力。让用户专注于内容上。


视频介绍
https://www.zhihu.com/video/935087140149276672
编辑于 2018-01-12 09:58

答主同样有此痛点,创建了个聚合搜索项目,并已开源到 Github,可能是你想要的样子:

支持自定义搜索引擎,聚合搜索结果,充分利用PC大屏优势,提高搜索效率:)

猫搜一下,你就知道更多。 moresearch.ga

发布于 2020-01-11 23:19

没注意到这是个老问题了,其实自己搭一个是最简单的,利用docker实现。

比如Searx,大概使用方式可以参考:

类似的项目其实还有一些,如果熟悉docker的话,搭建起来可能只需要十分钟的功夫,无论放在vps上或者有公网ip的家里nas上都很合适。

这样最大的好处是无论什么设备,无论局域网还是公网都有一致的搜索体验。

发布于 2020-04-23 17:25

试一下 1sou

有一个3D效果,设置成手机或者电脑上的主页用起来都很方便

编辑于 2018-09-23 09:03

自行添加搜索引擎。聚合搜索的方法:

1.手机端

推荐使用m浏览器,支持聚合搜索,还可自行添加搜索引擎。

2.网页端

推荐gobaidugle,一款好用的联合搜索引擎。

网址 谷百度歌

3.PC端工具

推荐一款小工具quiker,可自行设置语法规则聚合一键搜索多个网站内容。

比如万方+知网一键搜索:

脚本规则:

同理,可用类似脚本设置搜索词key来实现一键搜索百度+必应+搜狗微信+搜狗知乎...

编辑于 2021-11-15 14:01

试试这个小工具,下载解压双击,装了浏览器就能运行。

无形的肖申克/searchit

编辑于 2022-11-17 17:59

聚合查询

什么是聚合查询

聚合查询可以对照数据库理解

注意事项

用于进行聚合的字段必须是exact value,分词字段不可进行聚合,对于text字段如果需要使用聚合,需要开启fielddata,但是通常不建议,因为fielddata是将聚合使用的数据结构由磁盘(doc_values)变为了堆内存(field_data),大数据的聚合操作很容易导致OOM

聚合分类

分桶聚合(Bucket agregations):类比SQL中的group by的作用,主要用于统计不同类型数据的数量

指标聚合(Metrics agregations):主要用于最大值、最小值、平均值、字段之和等指标的统计

管道聚合(Pipeline agregations):用于对聚合的结果进行二次聚合,如要统计绑定数量最多的标签bucket,就是要先按照标签进行分桶,再在分桶的结果上计算最大值。


基本语法







GET test_idx_aggs/_search
{
  "aggs": {
    "<aggs_name>": {
      "<agg_type>": {
        "field": "<field_name>"
      }
    }
  }
}

aggs_name:聚合函数的名称

agg_type:聚合种类,比如是桶聚合(terms)或者是指标聚合(avg、sum、min、max等)

field_name:字段名称或者叫域名。

聚合测试脚本

为了节省你的时间,把用到的脚本提前准备好


测试数据








# 聚合查询
DELETE test_idx_aggs
## 定义索引
PUT test_idx_aggs
{
  "mappings" : {
      "properties" : {
        "createtime" : {
          "type" : "date"
        },
        "date" : {
          "type" : "date"
        },
        "desc" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          },
          "analyzer":"ik_max_word"
        },
        "lv" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "name" : {
          "type" : "text",
          "analyzer":"ik_max_word",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "price" : {
          "type" : "long"
        },
        "tags" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "type" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
      }
    }
}

## 测试数据
PUT /test_idx_aggs/_doc/1
{
    "name" : "小米手机",
    "desc" :  "手机中的战斗机",
    "price" :  3999,
    "lv":"旗舰机",
    "type":"手机",
    "createtime":"2020-10-01T08:00:00Z",
    "tags": [ "性价比", "发烧", "不卡顿" ]
}
PUT /test_idx_aggs/_doc/2
{
    "name" : "小米NFC手机",
    "desc" :  "支持全功能NFC,手机中的滑翔机",
    "price" :  4999,
        "lv":"旗舰机",
    "type":"手机",
    "createtime":"2020-05-21T08:00:00Z",
    "tags": [ "性价比", "发烧", "公交卡" ]
}
PUT /test_idx_aggs/_doc/3
{
    "name" : "NFC手机",
    "desc" :  "手机中的轰炸机",
    "price" :  2999,
        "lv":"高端机",
    "type":"手机",
    "createtime":"2020-06-20",
    "tags": [ "性价比", "快充", "门禁卡" ]
}
PUT /test_idx_aggs/_doc/4
{
    "name" : "小米耳机",
    "desc" :  "耳机中的黄焖鸡",
    "price" :  999,
        "lv":"百元机",
    "type":"耳机",
    "createtime":"2020-06-23",
    "tags": [ "降噪", "防水", "蓝牙" ]
}
PUT /test_idx_aggs/_doc/5
{
    "name" : "红米耳机",
    "desc" :  "耳机中的肯德基",
    "price" :  399,
    "type":"耳机",
        "lv":"百元机",
    "createtime":"2020-07-20",
    "tags": [ "防火", "低音炮", "听声辨位" ]
}
PUT /test_idx_aggs/_doc/6
{
    "name" : "小米手机10",
    "desc" :  "充电贼快掉电更快,超级无敌望远镜,高刷电竞屏",
    "price" :  "",
        "lv":"旗舰机",
    "type":"手机",
    "createtime":"2020-07-27",
    "tags": [ "120HZ刷新率", "120W快充", "120倍变焦" ]
}
PUT /test_idx_aggs/_doc/7
{
    "name" : "挨炮 SE2",
    "desc" :  "除了CPU,一无是处",
    "price" :  "3299",
        "lv":"旗舰机",
    "type":"手机",
    "createtime":"2020-07-21",
    "tags": [ "割韭菜", "割韭菜", "割新韭菜" ]
}
PUT /test_idx_aggs/_doc/8
{
    "name" : "XS Max",
    "desc" :  "听说要出新款12手机了,终于可以换掉手中的4S了",
    "price" :  4399,
        "lv":"旗舰机",
    "type":"手机",
    "createtime":"2020-08-19",
    "tags": [ "5V1A", "4G全网通", "大" ]
}
PUT /test_idx_aggs/_doc/9
{
    "name" : "小米电视",
    "desc" :  "70寸性价比只选,不要一万八,要不要八千八,只要两千九百九十八",
    "price" :  2998,
        "lv":"高端机",
    "type":"耳机",
    "createtime":"2020-08-16",
    "tags": [ "巨馍", "家庭影院", "游戏" ]
}
PUT /test_idx_aggs/_doc/10
{
    "name" : "红米电视",
    "desc" :  "我比上边那个更划算,我也2998,我也70寸,但是我更好看",
    "price" :  2999,
    "type":"电视",
        "lv":"高端机",
    "createtime":"2020-08-28",
    "tags": [ "大片", "蓝光8K", "超薄" ]
}
PUT /test_idx_aggs/_doc/11
{
  "name": "红米电视",
  "desc": "我比上边那个更划算,我也2998,我也70寸,但是我更好看",
  "price": 2998,
  "type": "电视",
  "lv": "高端机",
  "createtime": "2020-08-28",
  "tags": [
    "大片",
    "蓝光8K",
    "超薄"
  ]
}






查询语法

简单查询








GET test_idx_aggs/_search
{
  // 这个含义是不要显示hit的source数据信息,只要聚合信息
  "size": 0, 
  "aggs": {
    "test_aggs_price": {
      "sum": {
        "field": "price"
      }
    }
  }
}




桶聚合 Bucket

分类,不同类一个桶; 比如根据标签分类

桶聚合查询







## 按照不同标签统计数量
GET test_idx_aggs/_search
{
  // 这个含义是不要显示hit的source数据信息,只要聚合信息
  "size": 0, 
  "aggs": {
    "test_aggs_tags": {
      // 使用terms分桶 
      "terms": {
        // 这样就是桶查询; 这里为什么用tags.keyword而不是用tags因为tags是text类型默认没有被正排索引所以无法使用聚合,需要设置fielddata为true才可以使用
        "field": "tags.keyword",
        // 限制桶数量或者也可以理解为分页
        "size": 99999,
        // 还支持很多其他属性,kibana可以看到提示,也可以官网查看手册
        "order": {
          "_key": "asc"
        }
      }
    }
  }
}

## 设置text使用聚合查询
POST test_idx_aggs/_mapping
{
  "properties": {
    // 你的字段名
    "tags": {
      // 之前属性保持一致
      "type": "text",
      // 设置fielddata为true即可
      "fielddata": true
    }
  }
}



指标聚合

最大/小; 平均,计数,求和;基数去重, top; 统计聚合

指标查询语法








## 自定义多指标查询
GET test_idx_aggs/_search
{
  "size": 0, 
  "aggs": {
    "test_aggs_name_price_max": {
      "max": {
        "field": "price"
      }
    },
    "test_aggs_name_price_min": {
      "min": {
        "field": "price"
      }
    }
  }
}

## 使用`stats`进行统计查询, 会列出所有指标
GET test_idx_aggs/_search
{
  "size": 0, 
  "aggs": {
    "test_aggs_name_stats": {
      "stats": {
        "field": "price"
      }
    }
  }
}



去重统计

使用cardinality关键字







GET test_idx_aggs/_search
{
  "size": 0, 
  "aggs": {
    "test_aggs_name_distinct_cnt": {
      // 去重
      "cardinality": {
        // 注意这里如果分词就不准确了,并且非正排索引的text类型不支持 
        "field": "name.keyword"
      }
    }
  }
}



管道聚合

类似linux命令行的管道,对聚合的结果进行多次聚合


管道聚合语法








GET test_idx_aggs/_search
{
  "size": 0, 
  "aggs": {
    // 第一层: 按照type聚合
    "test_agg_name_groupby_type_bucket": {
      // terms 就是分桶关键字
      "terms": {
        "field": "type.keyword",
        "size": 99999
      },
      // 第二层: 计算按照type聚合后的平均价格
      "aggs": {
        "test_aggname_price_avg": {
          "avg": {
            "field": "price"
          }
        }
      }
    }
  }
}


继续聚合








GET test_idx_aggs/_search
{
  "size": 0, 
  "aggs": {
    "test_agg_name_groupby_type_bucket": {
      // terms 就是分桶关键字
      "terms": {
        "field": "type.keyword",
        "size": 99999
      },
      // 第二层聚合
      "aggs": {
        "test_aggname_price_avg": {
          "avg": {
            "field": "price"
          }
        }
      }
    },
    // 要计算按照type聚合后平均价格最小值,就放这个平级位置
    "test_aggname_min_typebucket": {
        "min": {
          "field": "test_agg_name_groupby_type_bucket>test_aggname_price_avg"
        }
    }
  }
}




嵌套聚合

嵌套聚合就是这种场景:比如先按照品牌分桶, 然后不同品牌在按照同品牌下产品矩阵分桶比如旗舰机, 老年机.


嵌套聚合语法











GET test_idx_aggs/_search
{
  "size": 0, 
  "aggs": {
    "test_aggname_bucket_type": {
      "terms": {
        "field": "type.keyword",
        "size": 9999
      },
      "aggs": {
        "test_aggname_bucket_lv": {
          "terms": {
            "field": "lv.keyword",
            "size": 9999
          }
        }
      }
    }
  }
}



其他








GET test_idx_aggs/_search
{
  "size": 0, 
  "aggs": {
    "type_agg": {
      "terms": {
        "field": "type.keyword"
      },
      "aggs": {
        "lv_agg": {
          "terms": {
            "field": "lv.keyword"
          },
          "aggs": {
            "price_stats": {
              "stats": {
                "field": "price"
              }
            },
            "tags_buckets": {
              "terms": {
                "field": "tags.keyword"
              }
            }
          }
        }
      }
    }
  }
}

## 统计每个商品类型中 不同档次分类商品中 平均价格最低的档次
GET test_idx_aggs/_search
{
  "size": 0,
  "aggs": {
    "type_bucket": {
      "terms": {
        "field": "type.keyword"
      },
      "aggs": {
        "lv_bucket": {
          "terms": {
            "field": "lv.keyword"
          },
          "aggs": {
            "price_avg": {
              "avg": {
                "field": "price"
              }
            }
          }
        },
        "min_bucket": {
          "min_bucket": {
            "buckets_path": "lv_bucket>price_avg"
          }
        }
      }
    }
  }
}



聚合和查询的相互关系



基于query或filter的聚合









GET test_idx_aggs/_search
{
  //"size": 0, 
  "query": {
    "range": {
      "price": {
        "gte": 4000
      }
    }
  },
  // 要聚合谁就写在谁的平级位置
  "aggs": {
    "test_aggname_bucket_type": {
      "terms": {
        "field": "type.keyword",
        "size": 9999
      }
    }
  }
}



基于filter聚合







GET test_idx_aggs/_search
{
  "size": 0, 
  "query": {
    "constant_score": {
      "filter": {
        "range": {
          "price": {
            "gte": 10,
            "lte": 99999
          }
        }
      },
      "boost": 1.2
    }
  }
  ,"aggs": {
    "test_aggname_bucket_types": {
      "terms": {
        "field": "type.keyword",
        "size": 99999
      }
    }
  }
}





基于聚合结果的查询

场景: 聚合后再过滤或者查询

但是注意query结果是过滤的,但是统计信息没有过滤







GET test_idx_aggs/_search
{
  "aggs": {
    "aggname_bucket_types": {
      "terms": {
        "field": "type.keyword",
        "size": 99999
      }
    }
  }
}
## 先聚合后过滤
GET test_idx_aggs/_search
{
  "aggs": {
    "aggname_bucket_types": {
      "terms": {
        "field": "type.keyword",
        "size": 99999
      }
    }
  }
  // post_filter 是关键
  ,"post_filter": {
    "range": {
      "price": {
        "gte": 4000
      }
    }
  }
}


查询条件的作用域

场景: 某些统计是基于过滤器比如统计4000以上的max,min,avg,但是还有一个指标想统计所有的价格的avg








GET test_idx_aggs/_search
{
  "size": 0, 
  "aggs": {
    "aggname_max_price": {
      "max": {
        "field": "price"
      }
    }
    ,"aggname_avg_price": {
      "avg": {
        "field": "price"
      }
    }
    ,"aggname_avg_all": {
      // global就表示不受queyr或者filter限制
      // 当然global也可以改成filter,用来统计特定条件下的聚合数据
      "global": {},
      // 注意aggs的层级
      "aggs": {
        "aggname_avg_all_inner": {
          "avg": {
            "field": "price"
          }
        }
      }
    }
  }
  ,"query": {
    "range": {
      "price": {
        "gte": 4000
      }
    }
  }
}



聚合排序


前边脚本已经写过了.

这里写一个多层聚合的不同排序







GET test_idx_aggs/_search
{
  "size": 0,
  "aggs": {
    "aggname_bucket_type": {
      "terms": {
        "field": "type.keyword",
        "order": {
          "_count": "asc"
        }
      },
      // 一定要注意这个层级位置
      "aggs": {
        "aggname_bck_lv2": {
          "terms": {
            "field": "lv.keyword",
            "size": 9999,
            "order": {
              "_count": "desc"
            }
          }
        }
      }
    }
  }
}



多层级排序字段 示例








GET test_idx_aggs/_search
{
  "size": 0,
  "aggs": {
    "tag_avg_price": {
      "terms": {
        "field": "type.keyword",
        "size": 9999,
        "order": {
          // `>`表示其下一级
          "test_aggname_stats>test_aggname_sum.sum": "desc"
        }
      }
      ,"aggs": {
        "test_aggname_stats": {
          "filter": {
            "terms": {
              "type.keyword": ["耳机", "手机", "电视"]
            }
          }
          ,"aggs": {
            "test_aggname_sum": {
              "extended_stats": {
                "field": "price"
               }
            }
          }
        }
      }
    }
  }
}



排序规则



多级排序

即排序的优先级,按照外层优先的顺序


多层排序

即按照多层聚合中的里层某个聚合的结果进行排序



常用的查询函数


histogram










## 按价格区间分桶,统计计数
GET test_idx_aggs/_search?size=0
{
  "aggs": {
    "test_range_bucket": {
      "range": {
        "field": "price",
        "ranges": [
          {
            "from": 0,
            "to": 1000
          },
          {
            "from": 1000,
            "to": 2000
          },
          {
            "from": 2000,
            "to": 3000
          },
          {
            "from": 4000,
            "to": 5000
          }
        ]
      }
    }
  }
}

## histogram实现

## histogram实现
GET test_idx_aggs/_search?size=0
{
  "aggs": {
    "test_historam": {
      "histogram": {
        // field如果date类型, 可以使用fix_interval支持毫秒/秒/分钟/小时/天, 1d表示一天; interval支持month,year,day,hour等等
        // 甚至支持格式化"format"
        "field": "price",
        "interval": 1000,
        // 是否用key value形式
        "keyed": true,
        // count >= min_doc_count才显示
        "min_doc_count": 0,
        // 空值处理,为空设置一个默认值
        "missing": 999
      }
    }
  }
}

## 日期histogram
GET test_idx_aggs/_search?size=0
{
  "aggs": {
    "test_historam": {
      "date_histogram": {
        // field如果date类型, 可以使用fix_interval支持毫秒/秒/分钟/小时/天, 1d表示一天; calendar_interval支持month,year,day,hour等等
        // 甚至支持格式化"format"
        "field": "createtime",
        "interval": "day",
        // 是否用key value形式
        "keyed": true,
        // count >= min_doc_count才显示
        "min_doc_count": 1,
        "extended_bounds": {
          "min": "2020-05",
          "max": "2029-12"
        }
      }
    }
  }
}
GET test_idx_aggs/_search?size=0
{
  "aggs": {
    "test_historam": {
      "date_histogram": {
        "field": "createtime",
        // 注意这里的 calendar_interval,fix_interval,interval
        // 注意这里即使不存在也会生成桶,可能造成大量的数据,造成服务不可用,如设置毫秒
        "calendar_interval": "day",
        "keyed": true,
        "min_doc_count": 1,
        // 这块限制桶产生的区间, 可以避免产生过多的数据
        "extended_bounds": {
          "min": "2020-05",
          "max": "2029-12"
        }
      }
    }
  }
}

GET test_idx_aggs/_search?size=0
{
  "aggs": {
    "test_historam": {
      "date_histogram": {
        "field": "createtime",
        // 间隔
        "calendar_interval": "month",
        "keyed": true,
        // 支持过滤
        "min_doc_count": 0,
        // 支持forma
        "format": "yyyy-MM", 
        // 支持范围限制
        "extended_bounds": {
          "min": "2020-01",
          "max": "2020-12"
        }
      }
    }
  }
}

## 支持自动感知分桶
GET test_idx_aggs/_search?size=0
{
  "aggs": {
    "test_historam": {
      "auto_date_histogram": {
        "field": "createtime",
        "format": "yyyy-MM"
      }
    }
  }
}


cumulate

累加和







GET test_idx_aggs/_search?size=0
{
  "aggs": {
    "test_historam": {
      "date_histogram": {
        "field": "createtime",
        "interval": "month",
        "format": "yyyy-MM", 
        "keyed": true,
        "extended_bounds": {
          "min": "2020-01",
          "max": "2029-12"
        }
      }
      // 基于上边分桶进行统计,比如统计每月销售额
      ,"aggs": {
        "sum_total": {
          "sum": {
            "field": "price"
          }
        }// 比如我们要统计累加销售额怎么办呢如2月份统计1+2月份,3月份统计1+2+3月份,以此类推
      ,"my_acumulate":{
        "cumulative_sum": {
          // 这个path是要你指定到底使用哪个值,这里我们使用sub_total统计的sum price
          "buckets_path": "sum_total"
        }
      }
      }
    }
  }
}


percentile

饼图,百分比

它的数据先按照指定的字段分段,然后统计每个段极其以内的占比









GET test_idx_aggs/_search?size=0
{
  "aggs": {
    "my_percentil_statics": {
      "percentiles": {
        "field": "price",
        "percents": [
          1,
          5,
          25,
          50,
          75,
          95,
          99
        ]
      }
    }
  }
}
## 查出来结果类似,表示每种价格之内的占比
  "aggregations" : {
    "my_percentil_statics" : {
      "values" : {
        "1.0" : 399.00000000000006, 
        "5.0" : 399.0,  // 表示399之内的价格占比
        "25.0" : 2998.0,// 表示2998以内的占比
        "50.0" : 2999.0,
        "75.0" : 3999.0,
        "95.0" : 4999.0,
        "99.0" : 4999.0
      }
    }
  }










GET test_idx_aggs/_search?size=0
{
  "aggs": {
    "my_percentil_statics": {
      "percentile_ranks": {
        "field": "price",
        "values": [
          1000, // 表示小于1000的占比多少
          3000, // 小于3000的占比多少
          5000
        ]
      }
    }
  }
}


聚合原理初步


底层存储

聚合使用doc_values数据结构(正排索引)

只有在正排索引的字段上才支持聚合查询

如text的类型就默认不创建正排索引的.

keyword默认创建正排索引

fielddata是搜索时动态创建,放在内存中,不像doc_values是提前放到磁盘中的,需要注意内存使用问题

另外注意如果使用fieldata会被分词,统计结果可能不准确, 所以还是建议直接keyword,这样不会被分词


设置fielddata

如果强行对text类型进行聚合查询,可以设置field_data







POST test_idx_aggs/_mapping
{
  "properties": {
    // 你的字段名
    "tags": {
      // 之前属性保持一致
      "type": "text",
      // 设置fielddata为true即可
      "fielddata": true
    }
  }
}

POST test_idx_aggs/_mapping
{
  "properties": {
    "name": {
      "type": "text",
      // 如果是中文要注意分词
      "analyzer": "ik_max_word",
      "fielddata": true
    }
  }
}


优化点

仅检索的字段一般不创建正排索引; 需要聚合的才建

发布于 2023-07-03 20:46

分享个chrome浏览器扩展,可以快速切换到其他搜索引擎 chrome.google.com/webst ,扩展最近更新时间2022年3月3日。


左侧默认分组有国内外常用搜索引擎,视频网站,音乐网站,学术网站,摸鱼网站等,比如使用谷歌搜索的时候点击左侧的百度进入百度搜索,不用再打开百度复制搜索了。

右键也可以自定义添加搜索引擎。


也可以添加分组,双击标题就能自定义图标,自定义分组名称,自定义分组排序(长按后拖动鼠标),按Enter保存 。

除了chrome扩展还有个类似的搜索引擎快捷跳转油猴脚本 greasyfork.org/zh-CN/sc

当然也支持自定义搜索来源。

编辑于 2022-03-15 23:35
( 为什么?)