为什么这个ES multi-match query
会返回400错误(错误请求)?
"query": {
"multi_match": {
"query": searchTerms,
"fields": ["content", "title"],
"operator": "and"
}
},
size: 100,
from: 0,
highlight: {
fields: {
"title": {number_of_fragments: 0},
"content": {number_of_fragments: 10,fragment_size: 300}
}
}
}
我正在将此查询与AngularJS UI Bootstrap Typeahead代码结合使用
uib-typeahead="query as query._source.ymme for query in getSuggestions($viewValue)" typeahead-on-select="search($item)"
这是我的search()函数
$scope.search = function() {
console.log($scope.searchTerms);
$scope.currentPage = 0;
$scope.results.documents = [];
$scope.isSearching = true;
return searchService.search($scope.searchTerms, $scope.currentPage).then(function(es_return) {
var totalItems = es_return.hits.total;
var totalTime = es_return.took;
var numPages = Math.ceil(es_return.hits.total / $scope.itemsPerPage);
$scope.results.pagination = [];
for (var i = 1; i <= 100; i++) {
if(totalItems > 0)
$scope.results.totalItems = totalItems;
$scope.results.queryTime = totalTime;
$scope.results.pagination = searchService.formatResults(es_return.hits.hits);
$scope.results.documents = $scope.results.pagination.slice($scope.currentPage, $scope.itemsPerPage);
}
}
),
function(error){
console.log('ERROR: ', error.message);
$scope.isSearching = false;
}
};
我不太确定出了什么问题?我认为它与$ scope有关,但我不确定。当我使用ES的Sense插件时查询有效,如果我只输入搜索词而不是从自动完成下拉列表中选择它,它也可以工作。
如果是$scope
,我错过了什么?
更新 所有分片都因阶段失败:[query_fetch] org.elasticsearch.search.SearchParseException:[hugetestindex] [0]:from [-1],size [-1]:Parse Failure [无法解析源[{“query”:{“multi_match”:{“query”: {“_ index”:“hugetestindex”,“_ type”:“doc”,“_ id”:“57”,“_ score”:3.877801,“_ source”:{“ymme”:“bourne supremacy”}},“fields” :[ “内容”, “标题”], “运算符”: “和”}}, “尺寸”:100 “从” 0 “突出显示”:{ “字段”:{ “标题”:{“number_of_fragments “:0},” 内容 “:{” number_of_fragments “:10,” fragment_size“:300}}}}]]
更新2 Object {_index: "hugetestindex", _type: "doc", _id: "56", _score: 2.5276248, _source: Object}
我认为这是问题,而不是搜索术语,它接收“对象”......?
更新3 所以基本上就是这样,
[Object, Object, Object, Object, Object]
0: Object
_id: "229"
_index: "hugetestindex"
_score: 3.3071127
_source: Object
ymme: "bourne supremacy"
__proto__: Object
_type: "doc"
__proto__:
Object1:
Object2:
Object3:
Object4:
Object
length: 5
__proto__: Array[0]
其中“bourne supremacy”是_source对象中ymme字段的值,顶部有5个对象的数组是es return,es_return.hits.hits
- 最后一次命中,就是数组。
答案 0 :(得分:0)
解构对象的方式是执行以下操作:
object.data.hits.hits._source.field_name;
以上只是获取单个字段值的符号,您可能需要为每个值执行循环,所以可能是这样的:
$scope.list = []
for hit in object.data.hits.hits {
$scope.list.push(hit._source.field);
}
console.log(list);
然后,从您的HTML中,您希望使用此列表,通过对其执行ng-repeat或类似的操作来获取列表中的每个术语。
<div ng-repeat="term in list">{{term}}</div>
如果您可以根据对象的外观以及您想要的数据来更新您的问题,我可以更新此答案以使其完全匹配。
<强>更新强> 为了匹配您的数据结构,我假设您要从这些对象中提取每个ymme值。您需要执行以下操作:
<div ng-repeat="object in es_return.hits.hits">
{{object._source.ymme}}
</div>
确保&#34; es_return&#34;是一个$ scope变量,因此您可以像上面那样访问它,或者只是执行:
$scope.es_return = es_return;
在你的角色代码中