不为失败找理由,要为成功找方法。

请问大家,ES有没有限制搜索结果数的功能?

匿名 | 发布于2017年12月13日 | 阅读数:17379

目前碰到一个问题,当ES搜索匹配结果数比较多时(超过200万左右),耗时很长,大概要1s多,如下所示:
(匹配结果数为:3129364)
{  "took": 1685,
  "timed_out": false,
  "_shards": {
  "total": 1,
  "successful": 1,
  "failed": 0
  },
  "hits": {
    "total": 3129364,
    "max_score": null,
    ......
  }
}
 
想问下,ES是否有这样的功能:
当搜索结果匹配数到达一定数目时(比如10000),就结束搜索,直接返回结果,限制搜索结果匹配总数
已邀请:

rockybean - Elastic Certified Engineer, ElasticStack Fans,公众号:ElasticTalk

赞同来自: elisha laoyang360 张鹏 ziyou Javmain

我觉得吧,你这个本质是一个语句调优的问题,结果你把大家带跑偏了,es 对于几百万数据的查询肯定是在 ms 级,所以你应该把你的查询语句还有数据模型讲一下,优化你的查询才是正道,不要想这些没用的。

phoenix

赞同来自: laoyang360 wokeyi

elasticsearch的搜索分为分为两个阶段query和fetch,query阶段仅仅是获取_id和_score,fetch阶段才是根据_id获取数据,index.max_result_window定义了最大返回条数,默认是10000,可以通过以下语句修改:
curl -XPUT http://127.0.0.1:9200/book/_settings -d '{ "index" : { "max_result_window" : 200000000}}'
 
不确定的该字段限制在query还是fetch阶段起作用。

ELKer

赞同来自: phoenix

我的理解应该是没有,如果是这样的话,怎么确定没有进行匹配的文档的相关性比已经匹配到的更高呢

laoyang360 - 《一本书讲透Elasticsearch》作者,Elastic认证工程师 [死磕Elasitcsearch]知识星球地址:http://t.cn/RmwM3N9;微信公众号:铭毅天下; 博客:https://elastic.blog.csdn.net

赞同来自: elisha

你用from size机制查询试试了吗

sqyES

赞同来自: elisha

我觉的是你在存储数据的时候有问题,或者是你的查询语句有问题。下面是我的搜索结果!你应该从这两方面优化,不要这些没用的!
{"took": 774,
"timed_out": false,
"_shards": {

"total": 1,
"successful": 1,
"failed": 0

},
"hits": {

"total": 2101302,
"max_score": 3.141577,
"hits": [

{
.....
}

elisha - 80后 IT

赞同来自:

是我查询语句里面用到了聚合,从三个维度进行聚合,就是这个对查询性能影响特别大,查询语句里面必须要用到聚合,现在也没好的办法:
 "aggs": {
    "aggs_industry": {
      "terms": {
        "field": "industry_name"
      }
    },
    "aggs_province": {
      "terms": {
        "field": "province"
      }
    },
    "aggs_tags": {
      "terms": {
        "field": "corp_tags"
      }
    }
  }

gtexpanse

赞同来自:

profile看看查询耗时吧
如果你仅仅是query阶段就这么慢,那肯定要做index优化了

kurisu

赞同来自:

弱弱的说一句,这样设置size不行么.....而且设置max_result_window是限制最多的返回个数吧....

zhihuizhou

赞同来自:

你自己在代码的处理上,设置一个最大分页页数和分页条数;请求的时候做个判断就行了,当es查询出来的总条数大于你设置的总条数时,对应的返回(总条数/分页条数)*分页条数就行了

EricShane

赞同来自:

想问下楼主,这个问题解决了吗。我也遇到了相同的问题,想请教下

intergret

赞同来自:

网页搜索里面一般叫 early termination,只看每个segment里面topN个已经按某个字段排了序的doc。es 里面里面也支持了。
 

hapjin

赞同来自:

有个terminater after参数:


"The maximum number of documents to collect for each shard, upon reaching which the query execution will terminate early"


另外,还有个timeout参数,可防止搜索长时间不响应。你可以参考这篇:minimum_should_match 能够减少单字段 match 查询的响应时间吗?

aspcat

赞同来自:

Improve Heavy Elasticsearch Aggregations with Random Score and Sampler Aggregation
( https://medium.com/cognigo/imp ... 71059 )
看到这篇文章,看看对你有没有用。

要回复问题请先登录注册