2013-08-16 74 views
6

我使用elasticsearch索引兩種類型的對象 -Elasticsearch查詢性能

數據細節

合同對象〜60點的屬性(對象大小 - 120個字節) 風險Item對象〜125點的屬性(對象大小 - 250個字節)

合同是

我存儲2.4億單指標2.1億風險的項目,對象(風險項目(_parent)的母公司, 30000000個合同)

指數大小爲 - 322 GB

羣集細節

11 m2.4x.large EC2盒[68 GB存儲器,1.6 TB存儲,8個內核(1盒是與node.data負載平衡器節點=假) 50碎片 1複製品

elasticsearch.yml

node.data: true 
http.enabled: false 
index.number_of_shards: 50 
index.number_of_replicas: 1 
index.translog.flush_threshold_ops: 10000 
index.merge.policy.use_compound_files: false 
indices.memory.index_buffer_size: 30% 
index.refresh_interval: 30s 
index.store.type: mmapfs 
path.data: /data-xvdf,/data-xvdg 

我開始了elasticsearch節點用下面的命令 - /home/ec2-user/elasticsearch-0.90.2/bin/elasticsearch -f -Xms30g -Xmx30g

我的問題是,我運行以下關於風險項目類型的查詢,並且返回數據需要大約10-15秒,對於20條記錄。

我使用50個併發用戶的負載和大約5000個風險項目的批量索引負載並行運行。

查詢(隨着加入父子)

的http://:9200/contractindex/riskitem/_search *

{ 
    "query": { 
     "has_parent": { 
      "parent_type": "contract", 
      "query": { 
       "range": { 
        "ContractDate": { 
         "gte": "2010-01-01" 
        } 
       } 
      } 
     } 
    }, 
    "filter": { 
     "and": [{ 
      "query": { 
       "bool": { 
        "must": [{ 
         "query_string": { 
          "fields": ["RiskItemProperty1"], 
          "query": "abc" 
         } 
        }, 
        { 
         "query_string": { 
          "fields": ["RiskItemProperty2"], 
          "query": "xyz" 
         } 
        }] 
       } 
      } 
     }] 
    } 
} 

查詢從一個表

查詢1(這查詢大約需要8秒。)

<!-- language: lang-json --> 

    { 
     "query": { 
      "constant_score": { 
       "filter": { 
        "and": [{ 
         "term": { 
          "CommonCharacteristic_BuildingScheme": "BuildingScheme1" 
         } 
        }, 
        { 
         "term": { 
          "Address_Admin2Name": "Admin2Name1" 
         } 
        }] 
       } 
      } 
     } 
    } 



**Query2** (This query takes around 6.5 seconds for Top 10 records (but has sort on top of it) 

<!-- language: lang-json --> 

    { 
     "query": { 
      "constant_score": { 
       "filter": { 
        "and": [{ 
         "term": { 
          "Insurer": "Insurer1" 
         } 
        }, 
        { 
         "term": { 
          "Status": "Status1" 
         } 
        }] 
       } 
      } 
     } 
    } 

有人可以幫助我如何提高此查詢性能?

+0

我對答案也很感興趣。您是否嘗試過其他類型的文檔之間的關係?我指的是嵌套對象。我可能是錯的,但我會說父子關係是一種「查詢連接」。嵌套對象位於相同的Lucene塊中,因此搜索查詢可能會更快。 – jackdbernier

+0

我也有一個問題......爲什麼'Xms30g -Xmx30g'而不是更多? – jackdbernier

+0

對象非常大,嵌套的對象需要很大的空間。 – Vishal

回答

3

您是否嘗試過自定義路由?如果沒有自定義路由,您的查詢需要查看所有50個分片以滿足您的請求。通過自定義路由,您的查詢知道要搜索哪些分片,使查詢更具性能。更多here

bulk api docs中所述,您可以通過在_routing字段中包含路由值來爲每個批量項目分配自定義路由。

+1

除定製路由之外,還有其他什麼選項? – Vishal

+0

正如jackdbernier在他的評論中提到的那樣,增加堆大小將有助於提升性能。這[線索](http://elasticsearch-users.115913.n3.nabble.com/Slow-Query-Performance-td4024165.html)現在已經快一年了,但它的信息可能還是不錯的。例如,Elasticsearch團隊在此建議將heap_size設置爲整個內存的60%。所以,在你的情況下,嘗試增加你的堆到40克。 –

+0

剛剛嘗試了41gb的堆大小,結果仍然相同。 – Vishal

1

我們通過使用位集進行了更改。

我們跑了50個併發用戶(只讀)一個小時。我們所有的查詢速度都提高了4到5倍,除了父子查詢(問題查詢),它已經從7秒降到3秒。

我還有一個has_child查詢。任何人有任何其他反饋,我們可以進一步改善這一點,或其他查詢。

{ 
    "query": { 
     "filtered": { 
      "query": { 
       "bool": { 
        "must": [{ 
         "match": { 
          "LineOfBusiness": "LOBValue1" 
         } 
        }] 
       } 
      }, 
      "filter": { 
       "has_child": { 
        "type": "riskitem", 
        "filter": { 
         "bool": { 
          "must": [{ 
           "term": { 
            "Address_Admin1Name": "Admin1Name1" 
           } 
          }] 
         } 
        } 
       } 
      } 
     } 
    } 
} 
+0

任何人都可以請評論/幫助? – Vishal

+0

基本上用BOOL替換你的AND/OR過濾器。利用位集。不知道爲什麼,但只是做它,看看它是否更快。 –