2015-01-26 63 views
0

我有一個包含子文檔和父文檔的索引,我正在使用子查詢父母。我得到搜索結果但結果不一致。索引是靜態的,在這些測試中我沒有添加任何東西。當TopChildrenQueryBuilder查詢的最大值發生變化時,ElasticSearch頂部結果會有所不同

我削成碼到最基礎的:

\t 
 
int max = 50; 
 
String query = "politics"; 
 
SearchRequestBuilder builder = client.prepareSearch("users").setSearchType(SearchType.QUERY_THEN_FETCH); 
 

 
QueryBuilder b = QueryBuilders.topChildrenQuery("children", QueryBuilders.termQuery("name", query)); 
 
builder.setQuery(b); 
 
builder.setFrom(0).setSize(max); 
 

 
SearchResponse response = builder.execute().actionGet(); 
 

 
SearchHits hits = response.getHits(); 
 
List<Map> users = new ArrayList<Map>(); 
 

 
System.err.printlnt(hits.getTotalHits()); 
 

 
for(SearchHit hit : hits.getHits()) 
 
{ 
 
//do stuff

的問題是,當我改變最大它改變了頂部返回結果。前幾個結果轉移,但基於我使用的最大值是一致的。隨着我增加max,前幾項結果似乎在相關性上增加,幾乎就像它沒有實際搜索完整索引,除非我按下它。另外,它聲稱它發現的總點擊次數是變化的,隨着最大值增加,它會增加。最多10個,它表示總點擊率爲93.對於100,它表示731.對於1000,它表示8040.

這是TopChildrenQueryBuilder的錯誤,還是我做錯了什麼?

回答

0

顯然這是某種功能。

從文檔:

「使用top_children的一個缺點是,如果有更多的孩子文檔執行兒童查詢時匹配所需命中,那麼total_hits導致搜索響應將是不正確的。」

我不知道這是什麼意思,但似乎他們在設計此功能時沒有準確性或相關性。

我的修復程序(現在)是獲得比我需要更多的命中,並希望它不會太慢。

UPDATE

顯然你可以通過使用「factor」方法來控制它。這裏是一個解釋:

「控制從主查詢請求的子查詢所需的初始匹配的乘法因子,默認爲5」。

不知道這意味着什麼,但我把它設置爲1000,它似乎「固定」。查詢速度不是很快,但比使用上面提到的黑客更快,並且它看起來有相同的效果。

相關問題