Elasticsearch:文档大小和查询性能

时间:2016-06-13 13:57:05

标签: elasticsearch

我有一个ES索引,中等大小的文档(或多或少15-30 Mb)。

每个文档都有一个布尔字段,大多数时候用户只想知道特定文档ID是否将该字段设置为true。

文档大小会影响此查询的效果吗?

   "size": 1,
   "query": {
      "term": {
         "my_field": True
      }
   },
   "_source": [
      "my_field"
   ]

" size":0查询会带来更好的时间效果吗?

3 个答案:

答案 0 :(得分:1)

在您的查询中添加"size":0,您将避免一些网络转移此行为将改善您的性能时间。

但据我了解您的使用情况,您可以使用count

示例查询:

curl -XPOST 'http://localhost:9200/test/_count -d '{
      "query": {
        "bool": {
          "must": [
            {
              "term": {
                "id": xxxxx
              }
            },
            {
              "term": {
                "bool_field": True
              }
            }
          ]
        }
      }
    }'

使用此查询仅检查是否存在总计,您将知道具有某个id的doc是否已将bool字段设置为true / false,具体取决于您在查询时在bool_field中指定的值。这将非常快。

答案 1 :(得分:1)

考虑到Elasticsearch将索引您的字段,文档大小对性能来说不是一个大问题。使用大小0不会影响Elasticsearch内的查询性能,但会因为网络传输而对检索文档的性能产生积极影响。

如果您只想检查特定文档的一个布尔字段,只需使用Get API获取文档,只需检索要检查的字段,如下所示:

curl -XGET 'http://localhost:9200/my_index/my_type/1000?fields=my_field'

在这种情况下,Elasticsearch将只检索包含_id = 1000和字段my_field的文档。所以你可以检查布尔值。

{
  "_index": "my_index",
  "_type": "my_type",
  "_id": "1000",
  "_version": 9,
  "found": true,
  "fields": {
    "my_field": [
      true
    ]
  }
}

答案 2 :(得分:1)

通过查看您的问题,我发现您还没有提到您正在使用的弹性搜索版本。我想说有很多因素会影响elasticsearch集群的性能。

但是假设它是最新的elasticsearch并且考虑到您在单个值之后,最好的方法是将查询更改为非评分的过滤查询。过滤器在弹性搜索中非常快,并且非常容易缓存。使查询无评分完全避免评分阶段(计算相关性等)。

对此:

GET localhost:9200/test_index/test_partition/_search
{
"query" : {
    "constant_score" : { 
        "filter" : {
            "term" : { 
                "my_field" : True
            }
        }
    }
}

}

请注意,我们正在使用搜索API。 constant_score用于将术语查询转换为过滤器,过滤器本身应该很快。

了解更多信息。请参阅Finding exact values