Elasticsearch搜索查询返回不同数量的文档

时间:2015-04-24 11:55:23

标签: search elasticsearch

elasticsearch实例的一些背景知识:

  • 一台机器上的一个节点
  • 特定索引包含26亿个文档,大小为1.23TB
  • 索引分为4个分片。
  • 堆大小设置为30 GB
  • 服务器有256GB内存和40个内核。
  • Elasticsearch(版本1.4.3)是此服务器上唯一运行的内容

我想返回所有具有特定名称的文档。 属性名称已映射:

"name": {
                    "type": "string",
                    "index": "not_analyzed"
                } 

我尝试过使用不同类型的搜索; filter,query_string,term。都具有相同的结果。当前查询如下所示:

    {   "query": {
            "query_string": {
                "default_field" : "name",
                "query": "test_run_435_tc"
            }
        },
        "size" : 10000000
    }

问题是查询在第一次尝试时没有返回正确数量的文档。我知道在索引中存在大约45000个文件,名称为“test_run_435_tc”。

但是当第一次运行查询时,它会返回大约5000个文档。 如果我在彼此之后直接重复查询,则返回的文档数量会增加。运行大约3-4个查询后,我在结果中获得了适当数量的文档。

我使用elasticsearch-py作为客户端。

似乎弹性搜索正在变暖,经过几次相同的查询后,弹性返回正确数量的文档..

为什么elasticsearch表现得像这样?这是弹性搜索的正常行为还是我错过了什么?当然我想在第一次尝试时得到正确的结果..

根据评论进行更新:

“size”:10000000起源于我不知道索引中有多少同名文档。

设置“size”:0并执行查询时,这是响应:

 {u'_shards': {u'failed': 0, u'successful': 4, u'total': 4},
  u'hits': {u'hits': [], u'max_score': 0.0, u'total': 28754},
  u'timed_out': True,
  u'took': 130}

当使用“size”:0再次运行相同的查询时,这是响应:

 {u'_shards': {u'failed': 0, u'successful': 4, u'total': 4},
  u'hits': {u'hits': [], u'max_score': 0.0, u'total': 39223},
  u'timed_out': True,
  u'took': 134}

使用“size”运行与上面相同的查询:0,但是使用这些参数.....?timeout = 100000& search_type = count会返回此响应:

{
"took": 525,
"timed_out": false,
"_shards": {
    "total": 4,
    "successful": 4,
    "failed": 0
},
"hits": {
    "total": 49501,
    "max_score": 0,
    "hits": []
}
}

上面的响应返回49501“hits_total”,实际上在第一次尝试时给出了正确的点击次数!

1 个答案:

答案 0 :(得分:0)

有一点可以从输出中确定您的查询已超时。这可能是由各种原因造成的。我没有使用python客户端,你需要检查你的客户端是否在进行连接等时设置任何全局超时。

首先还要检查原始查询占用的时间(删除search_type参数)保留超时参数。

由于@moliware建议将您的查询转换为术语查询以获得更好的性能并再次检查时间。

这两项活动可让您了解查询时间。

您还需要了解您是否只需要计算或需要文档的要求。 Search_type计数相对较快,如果您只对count感兴趣,则应该使用它。

我希望您不会找到一个需要100000个文档的用例。即使您想要显示,也需要进行分页。

最后,根据您的文档大小和硬件大小,我很惊讶您只有一个节点和30gb内存。如果您可以自由使用资源,则应考虑在同一服务器中创建更多节点。将ram限制为小于32gb是一个好主意,能够使用java的压缩指针。但是,当你拥有256GB(巨大的)ram时,你可以启动更多节点并从中获益。

使用多个节点,您可以重试查询并检查结果。