当前位置: 首页 > 知识库问答 >
问题:

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

柳威
2023-03-14

elasticsearch实例的一些背景:

  • 一个节点,在一台机器上
  • 特定索引由大小为1.23TB的26亿文档组成
  • 索引被分成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的正常行为,还是我遗漏了什么?当然,我希望在第一次尝试时得到正确的结果。。

根据评论更新:

“大小”: 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运行和上面相同的查询,但使用这些html" target="_blank">参数。。。。。?超时=100000

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

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

共有1个答案

魏元白
2023-03-14

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

首先还要检查原始查询需要多长时间(删除search_type参数)保留timeout参数。

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

这两个活动将让您了解查询时间。

你还需要了解你的要求,你是只需要计数还是你也需要文件。Search_type计数相对较快,如果你只对计数感兴趣,应该使用。

我希望您不会发现一个一次性需要100000个文档的用例。即使要显示,也要分页。

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

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

 类似资料:
  • 问题内容: 我有一个运行中的elasticsearch的内存实例,并做了一些探索性的编码来学习搜索Java API。我能够将文档提交到索引并使用GET检索它们,但是当我尝试简单的搜索查询时,没有得到任何结果。 经过一些测试后,我认为问题出在我如何设置节点和关联的客户端(在内存中): 问题答案: Googleelasticsearch小组中的某个人很友好,可以在这里帮助我。将文档提交到内存节点后,我

  • 问题内容: 我正在使用并希望elasticsearch返回搜索的单词而不仅仅是点击。当我搜索单词并且模糊搜索找到单词时,我想知道是谁找到了它。 数据: 查询: 该查询将返回,但不知道是否找到它。 有人知道该怎么做或一个主意吗?我希望输出为。 问题答案: 您可以为此命名查询,方法是为每个查询命名。在结果中,每个匹配都将包含一个数组,其中包含匹配的查询的名称(例如及以下)。

  • 问题内容: 我正在搜索索引中的文档,然后尝试通过获取其中的一些文档。尽管收到了一组结果,但是某些文档无法通过简单的get来检索。更糟糕的是,我可以通过URI搜索获得相同的文档,其中 例如,运行一个简单的GET 给我结果: 但是,如果我使用相同的_id进行搜索: 我得到了预期的结果: 我正在通过Stretcher ruby​​ API索引文档,索引后立即进行刷新。我的本地设置是 2个节点 。我正在运

  • 问题内容: 我想知道为什么搜索特定术语会返回索引的所有文档,而不返回包含所请求术语的文档。 这是索引以及我的设置方法:(使用elasticsearch头插件浏览器界面) 然后我添加了一些文档: 因此,现在触发“ plaat”搜索时,人们会希望搜索会返回包含“ plaatstaal”的文档。 但是为我节省了更多的搜索,elasticsearch会恢复所有文档的大小,无论其文本内容如何。我在这里想念什

  • 这是我得到的响应输出- 2018-11-20 18:25:34+0530:>{“查询”:{“布尔”:{“必须”:[{“匹配”:{“状态”:“活动”}},{“匹配”:{“is_published”:true}},{“匹配”:{“payed”:true}},{“match”:{“adverse_type”:“sell”}}]}},“排序”:[{“updated_at”:{“order”:“desc”}

  • 我是Elasticsearch的新手,我面临一个问题。我的任务是搜索一组文档。例如,我有这样结构的数据: 但是困难的是,我如何获取所有带有project_id=abc的文档,然后通过与关键字“测试”匹配的任何其他字段(代码、名称、状态)搜索它们(例如)。我如何在Elasticsearch查询中做到这一点,请帮助我! 谢谢