Elasticsearch查询解析失败

时间:2016-07-11 15:59:32

标签: angularjs elasticsearch

为什么这个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 - 最后一次命中,就是数组。

1 个答案:

答案 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;

在你的角色代码中