当TopChildrenQueryBuilder查询的max变化时,ElasticSearch顶部结果会有所不同

时间:2015-01-26 23:11:05

标签: java elasticsearch

我有一个包含子文档和父文档的索引,我正在使用子项来查询父项。我得到搜索结果,但结果不一致。索引是静态的,我在这些测试中没有添加任何内容。

我将代码缩减为基础知识:

	
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

问题是,当我改变最大值时,它会更改返回的最高结果。前几个结果会转移,但基于我使用的最大值是一致的。当我增加最大值时,前几个结果似乎相关性增加,几乎就像它实际上没有搜索完整索引,除非我按下它。此外,它声称它发现的总命中数有所不同,它会随着我增加最大值而增加。最多10个表示总命中率为93.对于100表示​​731表示。对于1000表示总计为8040。

这是TopChildrenQueryBuilder的错误,还是我做错了什么?

1 个答案:

答案 0 :(得分:0)

显然这是某种功能。

来自文档:

&#34;使用top_children的一个缺点是,如果在执行子查询时有更多匹配所需命中的子文档,则搜索响应的total_hits结果将不正确。&#34;

我不知道这意味着什么,但在设计此功能时似乎没有准确性或相关性。

我的修复(暂时)是获得比我需要的更多的点击量,并希望它不会减慢太多的速度。

更新

显然你可以通过使用&#34;因子&#34;来控制它。方法。这是一个解释:

&#34;控制子查询对主查询请求所需的初始命中的倍增因子。默认为5。&#34;

不确定这究竟是什么意思,但我将其设置为1000,似乎&#34;已修复&#34;。查询速度不是很快,但它比使用我上面提到的黑客攻击更快,而且似乎也有同样的效果。