精华内容
下载资源
问答
  • 修改10000条数据
    千次阅读
    2022-05-26 18:21:06

    es官方默认限制索引查询最多只能查询10000条数据,查询第10001条数据开始就会报错:

    Result window is too large, from + size must be less than or equal to。。。

    但是很多时候10000数据不能满足项目的需求,所以我们就要解除这个限制。

    解决方案:

    第一种办法.在kibana中执行,解除索引最大查询数的限制

    put _all/_settings
    	{
    	"index.max_result_window":200000
    	}
    

    _all表示所有索引,针对单个索引的话修改成索引名称即可

    第二种办法:在创建索引的时候加上

    “settings”:{
    		"index":{
    			"max_result_window": 500000
    				}
    			}
    

    但是修改完之后,通过api查询回来的totalhits还是只有10000条,解决如下 :

    在查询时候把 track_total_hits 设置为 true。

    track_total_hits 设置为false禁用跟踪匹配查询的总点击次数

    设置为true就会返回真实的命中条数。

    java代码在构建条件时候加上:

    searchSourceBuilder.trackTotalHits(true);
    

    kibana查询

    GET 索引名/_search
    	{
    	 "query": {
    		 "match_all": {}
    			 },
    		 "track_total_hits":true
    	}
    
    更多相关内容
  • 未使用事务之前-- 调用数据库use test;-- 先检查要使用的表是否存在,存在...-- 创建数据表CREATE TABLE `testtable` (`id` int(11) NOT NULL AUTO_INCREMENT,`testname` varchar(32) NOT NULL,PRIMARY KEY (`id`))...

    未使用事务之前

    -- 调用数据库

    use test;

    -- 先检查要使用的表是否存在,存在就删除

    DROP TABLE IF EXISTS `testtable`;

    -- 创建数据表

    CREATE TABLE `testtable` (

    `id` int(11) NOT NULL AUTO_INCREMENT,

    `testname` varchar(32) NOT NULL,

    PRIMARY KEY (`id`)

    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

    -- 存储过程

    delimiter $$

    -- 如果存储过程存在,先删除

    drop procedure if exists p1;

    -- 创建

    create procedure p1()

    begin

    -- 定义

    declare i int;

    declare user varchar(32);

    -- 赋值

    set i = 0;

    set user = 'user';

    -- 循环

    while i < 10000 DO

    -- CONCAT 字段拼接

    insert into testtable(testname) values ( CONCAT( user , i));

    set i = i + 1;

    end while;

    end$$

    delimiter ;

    -- 调用

    call p1();

    插入10000数据用时328秒

    0f5081f4390d

    image.png

    0f5081f4390d

    image.png

    EXPLAIN SELECT * FROM testtable;

    0f5081f4390d

    image.png

    type:表示MySQL在表中找到所需行的方式,或者叫访问类型,常见类型如下(从左到右,性能由差到好)

    ALL index range ref eq_ref const,system NULL

    ALL: 全表扫描

    index: 索引全扫描

    range:索引范围扫描

    ref:使用非唯一索引扫描

    eq_ref:使用唯一索引扫描

    const,system:单表中最多只有一个匹配行

    创建普通索引:

    ALTER TABLE 表名 ADD INDEX index_remark (remark);

    0f5081f4390d

    image.png

    使用事务之后插入100000条数据:

    -- 调用数据库

    use test;

    -- 先检查要使用的表是否存在,存在就删除

    DROP TABLE IF EXISTS `testtable`;

    -- 创建数据表

    CREATE TABLE `testtable` (

    `id` int(11) NOT NULL AUTO_INCREMENT,

    `testname` varchar(32) NOT NULL,

    PRIMARY KEY (`id`)

    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

    -- 存储过程

    delimiter $$

    -- 如果存储过程存在,先删除

    drop procedure if exists p1;

    -- 创建

    create procedure p1()

    begin

    -- 定义

    declare i int;

    declare user varchar(32);

    -- 赋值

    set i = 0;

    set user = 'user';

    -- 循环

    start transaction;#手动开启事务

    while i < 10000 DO

    -- CONCAT 字段拼接

    insert into testtable(testname) values ( CONCAT( user , i));

    set i = i + 1;

    end while;

    commit; #提交

    end$$

    delimiter ;

    -- 调用

    call p1();

    0f5081f4390d

    image.png

    展开全文
  • Mysql 循环插入10000条数据(案列)

    千次阅读 2019-09-30 13:42:53
    因为项目用user和data两张表,把user中的部分字段拆分到data中,这样两表都要通过user_id关联起来(作为两表主键),当注册新用户时只往use表写入了user_id,data表无法同时写入user_id,这样会导致用户无法修改资料...

    转载自:https://blog.csdn.net/CSDN2497242041/article/details/79256063

    前言:因为项目用user和data两张表,把user中的部分字段拆分到data中,这样两表都要通过user_id关联起来(作为两表主键),当注册新用户时只往use表写入了user_id,data表无法同时写入user_id,这样会导致用户无法修改资料。

    一、所以,按自己想法,写个循环1W次随便插入数据测试:

    DROP PROCEDURE IF EXISTS proc_initData;--如果存在此存储过程则删掉
    DELIMITER $
    CREATE PROCEDURE proc_initData()
    BEGIN
        DECLARE i INT DEFAULT 1;
        WHILE i<=10000 DO
            INSERT INTO data(user_id) VALUES(i);
            SET i = i+1;
        END WHILE;
    END $
    CALL proc_initData();

    二、 执行过程:

    1、第三行开始正式插入10000条数据,结果显示耗时 32.453秒

    2、第四行验证插入是否成功,Mysql WorkBench限制只返回了1000条数据

    3、第五行验证1000条以外的数据是否插入成功,返回了1行 user_id = 5231,成功插入!

    三、Mysql有批量处理的方法,更省时

      preareStatement.addBatch();
      preareStatement.executeBatch();

    展开全文
  • es解决只能查询10000条数据方案

    万次阅读 2021-10-20 18:06:57
    在使用es进行数据查询时,由于es官方默认限制了索引一次性最多只能查询10000条数据,查询第10001条数据开始就会报错, 错误的内容大致为:Result window is too large, from + size must be less than or equal to ...

    引言

    在使用es进行数据查询时,由于es官方默认限制了索引一次性最多只能查询10000条数据,查询第10001条数据开始就会报错,

    错误的内容大致为:Result window is too large, from + size must be less than or equal to

    通常,见到的一些网站的做法有:

    • 限制分页的最大页数,比如为100页,参见某东网站查询某品类的商品时的分页交互
    • 如果es中保存的数据不那么重要,如日志数据,可以考虑定期删除日志,维持数据量小于1万

    但是在更多的场景下,我们还是希望在查询时,可以突破这种限制,那么这里提供下面3种方式进行解决:

    方案1:在设置索引属性时解除索引最大查询数的限制

    put _all/_settings
    {
    "index.max_result_window":200000
    }
    

    _all表示所有索引,针对单个索引的话修改成索引名称即可

    方案2::在创建索引的时候加上

    "settings":{
            "index":{
                  "max_result_window": 500000
          }
    }
    

    这样设置完毕之后还不行,如果继续使用原来的API进行查询,查询到的结果最大数量仍然是10000,这时候需要在API中添加这样一行代码:

    searchSourceBuilder.trackTotalHits(true);
    

    如果是使用kibana等工具的dsl语句,可以参考下面编写

    GET 索引名/_search
    {
    "query": {
          "match_all": {}
    },
    "track_total_hits":true
    }
    

    示例演示

    在实际使用场景中,通常都是需要结合分页进行的,对于es来说,通常只需要传入 pageIndex 和pageSize即可获取到指定的页码数据,如果结合上面的问题一起来看,即突破1万条数据量的限制,单纯使用分页肯定不是最好的办法,因为es在突破1万的数据查询时候,查询性能会有一定的损耗,这就像从mysql中,从1000万条数据查询最后10条数据是一样的道理;

    为了合理的解决这个问题,es中提供了深度分页的概念,具体来说,在API代码层面,可以使用:searchAfter 这个API ,searchAfter需要在查询时传入上一次最后的那一条数据唯一标识的参数,这样的话,每次查询分页数据时,就从这一条开始向后查询10条即可

    基本思想

    searchAfter的方式可立即为维护了一个实时游标来记录每次查询的最后那条数据游标值,能保证滚动顺序读取数据,可用于实时请求和高并发场景,但search_after缺点是不能够随机跳转分页,只能一页一页向后翻,并且需要至少指定一个唯一不重复字段来排序。它与滚动API非常相似,但与它不同,search_after参数是无状态的,它始终针对最新版本的搜索器进行解析。因此,排序顺序可能会在步行期间发生变化(具体取决于索引的更新和删除)

    核心代码展示

    public Pagination<ComptrollerLogDTO> list(ComptrollerLogQuery logQuery) {
        SearchRequest searchRequest = new SearchRequest();
        //设置查询的索引
        searchRequest.indices(EsManager.LOG_INDEX_NAME_ALL);
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        // 如果未设置排序字段,默认用提交时间
        if (StringUtils.isNotBlank(logQuery.getSortField())) {
            if (DESC.toString().equals(logQuery.getOrderBy())) {
                searchSourceBuilder.sort(logQuery.getSortField(), DESC);
            } else {
                searchSourceBuilder.sort(logQuery.getSortField(), ASC);
            }
        } else {
            searchSourceBuilder.sort(SUBMIT_TIME, DESC);
        }
        searchSourceBuilder.sort(LOG_ID, DESC);
        searchSourceBuilder.query(getQueryBuilder(logQuery));
        searchSourceBuilder.trackTotalHits(true);
        searchRequest.source(searchSourceBuilder);
        Integer pageSize = logQuery.getPageSize();
        if (pageSize == null || pageSize < 0) {
            pageSize = 100;
        }
        if (logQuery.getPageIndex() == null) {
            ComptrollerLogDTO logDTO = get(logQuery.getAfterLogId());
            logQuery.setPageIndex(0);
            searchSourceBuilder.from(0);
            if (logDTO != null) {
                searchSourceBuilder.searchAfter(new Object[]{String.valueOf(logDTO.getSubmitTime()), logQuery.getAfterLogId()});
            }
        } else {
            searchSourceBuilder.from((logQuery.getPageIndex() - 1) * pageSize);
        }
        searchSourceBuilder.size(pageSize);
    
        SearchResponse search = EsManager.search(searchRequest);
        SearchHits hits = search.getHits();
        List<ComptrollerLogDTO> comptrollerLogs = convertToLogBeans(hits);
        return new Pagination<>(logQuery.getPageIndex(), pageSize, hits.getTotalHits().value, comptrollerLogs);
    }
    

    重点关注这里
    在这里插入图片描述
    上面这种做法可以解决顺序分页并突破查询10000条数据限制的问题,但使用场景也有一定的局限性,这个可以结合自身的需求合理使用,如果数据量特别大,但仍然希望一次性查询所有数据,又该如何处理呢?下面简单介绍下es提供的另一种强大的滚动查询方式

    es滚动查询

    这么讲吧,之前用的搜索,相当于MySQL的limit,即分页,数据量少的话无所谓啦,但如果量大呢,比如上亿的数据,你再使用Es分页试试,分页的前提是都查出来,然后排序,然后在内存做处理,你想,内存能有多大,多大的内存也顶不住这么大的数据量

    当然了,ES针对这个情况提前就考虑到了,于是就出现了滚动查询–Scroll,什么是滚动插叙呢,原理是什么呢?滚动查询和原生查询,一个相当于我们翻书,可以跳,一个相当于长图,看到哪里就显示哪里,这也是它们异同点:滚动查询无论查多少数据都可以,但不能翻页,也不支持分页,而普通查询,支持翻页分页,但是只支持一万笔以内的数据量(默认情况下,当然使用上面深度分页可以解决这个问题)

    Java中使用滚动查询API

    searchRequest.scroll(TimeValue.timeValueMinutes(1L));
    

    简单理解,查询条件中设置了滚动条件之后,在滚动的有效时间范围内,比如上面设置的是1分钟内,可以保持搜索的上下文环境的时间(滚动时间),在具体查询过程中,每滚动一次,es会产生一个scrollId,用于记录每次滚动的结果,直到滚动到无法继续查询数据的时候结束

    这么一来,我们就可以利用scroll的特性,从头到尾一直滚下去,每次设置一个合适的滚动数量,就可以将所有的数据一次性查询出来了,scroll使用完毕之后,一定要做清理

    演示代码

    public void exportLogCsv(Long startTime, Long endTime, String source, String details, String behaviourType, HttpServletResponse response) {
        List<ComptrollerLog> logList = new LinkedList<>();
        EsExpComptrollerLog scrollLogs = createScroll(UserContext.getBusinessUnitId(), startTime, endTime, source, details, behaviourType, 5000);
        String scrollId = "";
        if (scrollLogs != null) {
            scrollId = scrollLogs.getScrollId();
            logList.addAll(scrollLogs.getComptrollerLogList());
        }
        while (true) {
            EsExpComptrollerLog s = listLogByScrollId(scrollId);
            if (s == null || CollectionUtils.isEmpty(s.getComptrollerLogList())) {
                break;
            }
            scrollId = s.getScrollId();
            logList.addAll(s.getComptrollerLogList());
        }
        
    	//后续业务处理,使用上面的 logList
    }
    
    public EsExpComptrollerLog createScroll(String tenantId, Long startTime, Long endTime, String source,
                                            String details, String behaviourType, Integer rows) {
        SearchRequest searchRequest = new SearchRequest(EsManager.LOG_INDEX_NAME_ALL);
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
        if (StringUtils.isNotBlank(details)) {
            queryBuilder = queryBuilder.must(QueryBuilders.multiMatchQuery(details, "details", "realname", "email"));
        }
        if (StringUtils.isNotBlank(source)) {
            queryBuilder = queryBuilder.must(QueryBuilders.termQuery("source", source));
        }
        searchSourceBuilder.sort("submitTime", SortOrder.DESC);
        searchSourceBuilder.query(queryBuilder);
        searchSourceBuilder.size(rows);
        searchRequest.scroll(TimeValue.timeValueMinutes(1L));
        searchRequest.source(searchSourceBuilder);
        SearchResponse search = EsManager.search(searchRequest);
        return transformEsDataToComptrollerLog(search);
    }
    
    public EsExpComptrollerLog listLogByScrollId(String scrollId) {
        SearchScrollRequest scrollRequest = new SearchScrollRequest(scrollId);
        scrollRequest.scroll(TimeValue.timeValueSeconds(30));
        SearchResponse searchScrollResponse = EsManager.scroll(scrollRequest);
        return transformEsDataToComptrollerLog(searchScrollResponse);
    }
    
    public static SearchResponse scroll(SearchScrollRequest scrollRequest) {
        try {
            return getClient().scroll(scrollRequest, RequestOptions.DEFAULT);
        } catch (Exception e) {
            checkOrInit(e);
            return null;
        }
    }
    
    public static void clearScroll(ClearScrollRequest clearScrollRequest) {
        try {
            getClient().clearScroll(clearScrollRequest, RequestOptions.DEFAULT);
        } catch (Exception e) {
            checkOrInit(e);
        }
    }
    

    注意点:

    • 设置每次滚动的时间,时间不要设置的过大或者过小,这个可以根据接口每次分页的响应时间进行预估
    • 设置每次滚动时的数据量,这个根据查询数据的情况而定,再配合滚动时间而定
    展开全文
  • 解决Elasticsearch只能显示10000条数据

    千次阅读 2022-04-21 19:58:16
    Elasticsearch默认只能显示10000条数据,但是可以修改settings属性来设置显示的最大数。
  • 但是很多时候10000数据不能满足项目的需求,所以我们就要解除这个限制。 解决方案: 第一种办法: 在restful请求时,解除索引最大查询数的限制 put _all/_settings { "index.max_result_window
  • ElasticSearch查询大于10000条数据

    千次阅读 2022-04-19 14:26:00
    在使用es进行数据查询时,由于es官方默认限制了索引一次性最多只能查询10000条数据,查询第10001条数据开始就会报错, 错误的内容大致为: Result window is too large, from + size must be less than or equal ...
  • 查询的数超出这个值就会报错但是莫得慌,通过阅览了网友们的众多说法以及ES官方的资料得知,影响查询的是该配置 max_result_window,我们都知道很多时候10000数据不能满足项目的需求,因此我们需要自己来设置这个...
  • ElasticSearch 查询最多10000条数据

    千次阅读 2021-06-18 09:33:26
    ElasticSearch 查询最多10000条数据         因为有个需求是要将历史数据查出来以统计图的形式展示出来,数据量比较大,很容易就超过10000条了     &...
  • es本身默认限制了查找的量为10000条,即 from+size<=10000 报错: Result window is too large, from + size must be less than or equal to:[10000] but was [10010]. See the scroll api for a more ...
  • elsaticsearch是一个分布式的、RESTful 风格的搜索和数据分析引擎,由于是分布式的,在es中默认设置最多可以查询前10000条数据,当要查询10000条之后的数据,可以采用如下的两种方式配置,具体如下: (1)通过...
  • Mysql 循环插入10000条数据

    万次阅读 多人点赞 2018-02-05 00:17:40
    因为项目用user和data两张表,把user中的部分字段拆分到data中,这样两表都要通过user_id关联起来(作为两表主键),当注册新用户时只往use表写入了user_id,data表无法同时写入user_id,这样会导致用户无法修改资料...
  • 更新方式3:单线程,使用索引,一个commit,更新40×10000条 # coding: UTF-8 __author__ = 'letian' import MySQLdb import time host='127.0.0.1' user='root' passwd='123456' db='test' port = 3306 start_time...
  • ES查询数量超过10000条设置
  • 这是因为es默认的查询最大值是10000,查询的数超出这个值就会报错,通过查资料得知,影响查询的是这个配置 max_result_window,因此我们需要修改这个默认值。 这里我采用的是HttpPut请求的方式修改es的配置,代码...
  • 主要介绍了Thinkphp批量更新数据的方法汇总的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
  • 一个value是0 一个是1 我现在要在TP 的控制器里面写修改修改value是1的 怎么弄修改的sql语句里面的where吖? 我想的是 where id 但是对应的id我不知道怎么传值过去 控制器 public function admin(){ if(IS_...
  • 近期由于业务涉及的数据量比较大,进行查询时返回的结果集非常大,但是当查询一万以后的详细内容时,发现出错,后台日志提示最大的查询量不应该超过10000条,究竟是为什么呢,要做这样一个限制,于是就查阅了资料...
  • es本身默认限制了查找的量为10000条,即 from+size<=10000 报错: Result window is too large, from + size must be less than or equal to:[10000] but was [10010]. See the scroll api for a more ...
  • CREATE TEMPORARY TABLE tmp_table2 select isname,sex,isage,'3',telphone,g.illid,a1.mediaid,a2.doctorid,ordertime,remark, edittime... 这是我的SQL,我用临时表,当数据10000开始的时候,查询就卡死.不知道为什么.
  • 面试官对一次性插入1万条数据有疑问,认为不可以插入这么多数据,但是我做这个功能的时候确实是成功的,那具体能一次插入数据的上限我也不确定,后面就找时间做了下面这个实验。 首先自己搭建了SpringBoot+Mybatis...
  • 在kibana中修改,将最大可查询10000条扩大 第一步 第二步 选择要修改的索引库 第三步 选择Edit settings,添加"index.max_result_window": “50000”, 最后save就可以了
  • java随机生成一万条数据

    千次阅读 2022-03-23 11:09:54
    小白实现java随机生成一万用户数据
  • 1. 场景 : 往数据库插入10W记录2. 思考方案 : 单纯的我们这里不涉及其他任何操作,我们只是想生成一个10W记录而已,中间无其他步骤,得到的效果如下图所示,而我们又不会mysql脚本啊之类的,那我们不如用java...
  • es官方默认限制索引查询最多只能查询10000数据,查询第10001数据开始...但是很多时候10000数据不能满足项目的需求。 解决方案: 第一种办法.在kibana中执行,解除索引最大查询数的限制 put _all/_settings { “in...
  • ES 如何查询10000条后面的数据

    千次阅读 2020-06-28 16:31:17
    问题点:查询ES 1W条数据后报错 解决方案: 修改查询SQL 增加 search_after from 为 -1
  • 解决Elasticsearch查找 」10000条数据

    千次阅读 2020-07-01 17:27:07
    es本身默认限制了查找的量为10000条,即 from + size <= 10000, 官方文档的建议是不要修改,太大会影响性能和效率,建议使用 scroll 来代替。 若超过10000则会报错: 解决方法: 在kibana中执行api,...
  • ElasticSearch返回值数量超过10000条解决方案
  • 前端页面一次性渲染十万条数据的优化(时间分片) 在实际工作中,有时候会遇到一次性向页面插入大量数据的情况,比如:获取全国学校名称、获取专业名称等等。当遇到这样的需求时,如何才能在不卡页面的情况下渲染...
  • QTreeView处理大量数据(使用1000万条数据,每次都只是部分刷新) 如何使QTreeView快速显示1000万...我开始使用的QTreeWidget 控件来显示我的数据,发现该控件在显示10000行以下的数据还可以应付的过来,但超过100...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 254,639
精华内容 101,855
关键字:

修改10000条数据