繁体   English   中英

当TopChildrenQueryBuilder查询的max改变时,ElasticSearch的顶部结果也会改变

[英]ElasticSearch top results vary when max is varied for TopChildrenQueryBuilder query

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

我将代码缩减为基本内容:

 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时,前几项结果的相关性似乎在增加,几乎就像它没有真正搜索完整的索引,除非我按下它。 另外,它声称发现的总点击数是变化的,随着我增加max。 对于最多10个,它表示总点击数是93。对于100个,它表示731。对于1000个,它表示8040。

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

显然,这是某种功能。

从文档:

“使用top_children的一个缺点是,如果在执行子查询时有更多子文档与所需的匹配匹配,那么搜索响应的total_hits结果将不正确。”

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

我目前的解决方法是获得比我所需更多的点击量,并希望它不会使速度降低太多。

UPDATE

显然,您可以使用“因子”方法来控制它。 这里是一个解释:

“控制子查询对主查询请求所需的初始命中的乘法因子。默认为5。”

不知道那到底是什么意思,但我将其设置为1000,它似乎是“固定的”。 查询不是很快,但是比使用我上面提到的hack更快,并且似乎具有相同的效果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM