2013-09-24 41 views
0

我有一個奇怪的問題,我需要一些幫助。如何搜索平均每個8000字的數百萬個文檔?

我有一個600萬個文檔的數據集,每個文檔包含8000個字。每個單詞總是一個數字,單詞/數字之間用空白分隔。編號索引所有數據(我現在只編制子集索引)後,我需要按數字列表執行查詢,但我只想要那些有所有這些數字(條件爲AND)的文檔。

我想出了這一點:

String [] codes_vec = ARRAY_WITH_500_STRINGS_ALL_NUMBERS; 

BoolQueryBuilder qBuilder = QueryBuilders.boolQuery(); 

for (int i =0; i < codes_vec.length; ++i) 
{ 

    qBuilder = qBuilder.must(QueryBuilders.matchQuery("code", codes_vec[i])); 

} 

的問題是,這似乎是非常低效的,我怎麼能加快搜索?有沒有更好的查詢ElasticSearch的方法,在我的情況下會更快?

親切的問候, 澤·瑪麗亞

+0

你知道這500個字符串是事先?你可以在索引中標記它們嗎? – femtoRgon

+0

你的索引是如何組織的? –

+0

那麼索引真的很簡單,基本上有一個文件id +字符串列表。 – user361526

回答

0

使用過濾器可能比匹配查詢更快。下面是布爾過濾器的文檔:http://www.elasticsearch.org/guide/reference/query-dsl/bool-filter/

這裏是你如何可以創建並使用一個:

// create the filter 
// to cache the results, add .cache(true); 
BoolFilterBuilder filterBuilder = FilterBuilders.boolFilter(); 

// did you mean to skip the first one? 
for (int i = 0; i < codes_vec.length; ++i) 
    filterBuilder.must(FilterBuilders.termFilter("code", codes_vec[i])); 

// add the filter to your search 
SearchResponse response = client.prepareSearch("index1") 
      .setFilter(filterBuilder) 
      .setFrom(0).setSize(10) 
      .execute() 
      .actionGet(); 
+0

我會盡力的!關於setSize的一個疑問是,它與SQL的LIMIT參數相似嗎? – user361526

+0

是的,尺寸是結果的最大數量;使用from來指定起始點(因此第10頁的結果將從= 10,size = 10開始)。見http://www.elasticsearch.org/guide/reference/api/search/from-size/ – kielni

+0

謝謝!我會嘗試 – user361526

0

斯普利特線程處理了。我會推薦使用Future

+0

感謝您的幫助,但您的意思是我應該在它自己的線程中執行N個查詢,並手動過濾結果?在此先感謝 – user361526

+0

您可以創建和使用多少個線程取決於您的硬件。如果我的理解正確,你有500個查詢......但我懷疑500個線程會幫助你:)也許從10個線程開始,並給每個50個查詢。使用Future的'get()'方法在最後收集它們。如果您創建10個線程,並且有5個線程無所事事,那麼減少創建的線程數。 – ubiquibacon

+0

嗯,這不是真的500個查詢,我確實是用Y字查詢,它應該返回所有這些Y字的所有文檔。 – user361526

相關問題