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

4

关于elasticsearch实例的一些背景信息:

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

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

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

我尝试使用不同类型的搜索方法,包括过滤、查询字符串和术语。但是它们都得到了相同的结果。当前的查询看起来像这样:

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

问题在于第一次查询没有返回正确数量的文档。我确实知道索引中存在大约45000个名称为“test_run_435_tc”的文档。
但是,当第一次运行查询时,它只返回了大约5000个文档。如果我连续重复查询,返回的文档数量将会增加。经过3-4次查询后,结果中返回了正确数量的文档。
我正在使用elasticsearch-py作为客户端。
看起来elasticsearch需要预热,并且在运行几次相同的查询之后,elastic才会返回正确数量的文档。
为什么elasticsearch会表现出这种行为?这是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”,实际上在第一次尝试中已经给出了正确的点击次数!


你是指“hit_count”正在增加还是返回的文档正在增加?您设置“size”为10000000的用例是什么?您可以通过将“size”参数设置为0来发布查询结果吗? - Prabin Meitei
@PrabinMeitei “hit_count”和返回的文档都在增加。 请查看更新的问题以获取有关您的评论的更多答案。 - ajgustafsson
从输出结果来看,您的搜索似乎已超时,但令人惊讶的是,所花费的时间显示为134。请尝试使用.........?timeout=100000&search_type=count再次查询,并发布结果。 - Prabin Meitei
@PrabinMeitei,请参考更新后的问题,以获取有关您评论的答案。 - ajgustafsson
还有一件事。如果您的字段未被分析(如映射中所示),我建议使用术语查询而不是查询字符串。术语查询不会分析关键字,因此性能应该更好。 - moliware
1个回答

0

从输出中可以确定一件事,即您的查询超时。这可能是由于各种原因引起的。我没有使用过Python客户端,您需要检查您的客户端在建立连接时是否设置了全局超时。

首先,请检查原始查询所花费的时间(删除search_type参数),保留timeout参数。

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

这两个步骤将让您了解查询所需的时间。

您还需要根据需求来确定您是只需要计数还是还需要文档。如果您只对计数感兴趣,那么search_type count相对较快,应该使用它。

希望您不会遇到需要一次获取100,000个文档的情况。即使您想要显示,您也需要进行分页。

最后,考虑到您的文档大小和可用硬件的大小,我很惊讶您只有一个节点和30GB的RAM。如果您可以自由使用资源,应该考虑在同一服务器上创建更多节点。将RAM限制在32GB以下是一个好主意,以便能够使用Java的压缩指针。但是,由于您拥有256GB(巨大)的RAM,您可以启动更多节点并利用资源。
通过多个节点,您可以重试查询并检查结果。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接