我使用Elasticsearch(v1.5)JS(AngularJS)客户端msearch()API调用使用2种类型的查询生成1个搜索请求 - multi_match查询和mlt查询。除了对multi_match查询的结果进行分页外,一切都有效。
ES返回一个响应[array],其中包含两个查询在其自己的命中[array]中的结果。所以基本上你有
responses: [[hits],[hits]]
第一个hits数组用于multi_match查询,第二个hits数组用于mlt查询的结果。 multi_match查询返回100个结果,mlt查询返回最大值8。
这就是我在我的控制器中的search()中处理响应[]的方式
return searchService.search(vm.searchTerms, vm.currentPage).then(function(es_return) {
var results = es_return.responses;
var totalItems = es_return.responses[0].hits.total;
var totalTime = es_return.responses[0].took;
var numPages = Math.ceil(es_return.responses[0].hits.total / vm.itemsPerPage);
vm.results.pagination = [];
vm.results.queries = [];
for (var i = 0; i < results.length; i++) {
for (var j = 0; j < results.length; j++) {
vm.results.totalItems = totalItems;
console.log(vm.results.totalItems);
vm.results.queryTime = totalTime;
vm.results.pagination = searchService.formatResults(es_return.responses[0].hits.hits);//load first 100 results
vm.results.documents = vm.results.pagination.slice(vm.currentPage, vm.itemsPerPage);
console.log(vm.results.documents);
vm.results.mlt = es_return.responses[1].hits.hits;
}
}
因为你可以看到我使用嵌套for循环来处理responses array []
- 这是正确的方法吗?我正在加载前100个结果并一次显示10个结果。
我正在使用AngularJS UI Boostrap分页指令。我的ng-change =&#34; changePage&#34; - 只需调用paginate()来执行此操作
vm.paginate = function() {
var begin = ((vm.currentPage - 1) * vm.itemsPerPage);
var end = vm.currentPage * vm.itemsPerPage;
vm.results.documents._source = vm.results.pagination.slice(begin, end);
console.log(vm.results.documents._source);
};
唯一没有按预期工作的是multi_match
查询的分页,当我从esClient.search()
切换到esClient.msearch()
并且必须处理responses[]
时,它开始了}。我不太确定如何处理响应数组?
更新好的,我想我已经开始明白这一切了。我真的不只是处理像这样的JSON响应,响应:[[hits],] [hits]]
更像是
{response:property: value,property: value, hits:{property: value, property: value}, hits: [{property:value,property:value}]... }
因此两个命中数组都充满了对象。如何正确地迭代这个以便分页也能正常工作?
更新2 好的,经过多次阅读后(希望能更好地理解)...我想我有这个。我终于找到了这个SO answer,而且我处理的数据非常相似所以看起来像angular.forEach会为此工作...我希望。我注意到我的问题与许多其他关于数组和迭代的问题非常类似 - 我猜这就是为什么这个问题没有得到太多牵引力。但是,当我开始工作时,我会在这里发布任何相关信息。