我有一个ES索引,中等大小的文档(或多或少15-30 Mb)。
每个文档都有一个布尔字段,大多数时候用户只想知道特定文档ID是否将该字段设置为true。
文档大小会影响此查询的效果吗?
"size": 1,
"query": {
"term": {
"my_field": True
}
},
"_source": [
"my_field"
]
" size":0查询会带来更好的时间效果吗?
答案 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