2016-06-13 696 views
9

我有一箇中等大小的文檔(更多或更少15-30 Mb)的ES索引。Elasticsearch:文檔大小和查詢性能

每個文檔都有一個布爾型字段,用戶只需要知道特定文檔ID是否將該字段設置爲true的大部分時間。

文檔大小是否會影響此查詢的性能?

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

並將「大小」:0的查詢結果在更好的時間表現?

+0

不應該使用「fields」而不是「_source」? 順便說一句。 jordivador在他的回答中的建議應該有助於表現。 如果您有索引,只需進行測試即可! –

回答

1

"size":0添加到您的查詢,您將避免一些網絡轉移此行爲將提高您的性能時間。

但據我瞭解你使用的情況下,你可以使用count

示例查詢:

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

有了這個查詢只檢查是否有一些總,你就會知道,如果有一個文檔某些id根據您在查詢中在bool_field中指定的值將bool字段設置爲true/false。這將是相當快的。

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 
    ] 
    } 
} 
1

通過查看你的問題,我看到你沒有提到你正在使用的elasticsearch版本。我會說有很多因素會影響elasticsearch集羣的性能。

但是,假設它是最新的彈性搜索,並且考慮到您在單個值之後,最好的方法是將您的查詢更改爲非計分過濾查詢。彈性搜索中的過濾器非常快,並且非常容易緩存。使查詢不計分可以完全避免評分階段(計算相關性等)。

要這樣:

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

}

注意,我們使用的是搜索API。 constant_score用於將術語查詢轉換爲過濾器,該過濾器本質上應該很快。

欲瞭解更多信息。請參考