2014-10-06 67 views
0

排除零值,我就是用这个查询,以获得最显著值:从ElasticSearch聚集

keywords = Answer.search( 
    :size => 5, 
    :query => { 
     :match => { 
      :question_id => 32481 
     } 
    }, 
    :aggregations => { 
     :keywords => { 
      :significant_terms => { 
       :field => 'text' 
      } 
     } 
    } 
) 

领域是:文本,但它具有零值,所以答案永远是:

2.1.2 :135 > keywords.map(&:text) 
=> [nil, nil, nil, nil, nil] 

我试图添加一个过滤器,为the documentation建议,但它给了我一个解析错误:

keywords = Answer.search( 
    :size => 5, 
    :query => { 
     :match => { 
      :question_id => 32481 
     }, 
     :filtered => { 
      :filter => { 
       :exists => { :field => 'text' } 
      } 
     } 
    }, 
    :aggregations => { 
     :keywords => { 
      :significant_terms => { 
       :field => 'text' 
      } 
     } 
    } 
) 

我试过很多组合,没有成功。我怎样才能得到有效的文本答案?

+0

尝试keywords.map(&:text).compact – 2014-10-06 13:52:36

+1

我相信这不是解决方案。我得到了后者查询的elasticsearch的解析错误。第一个结果的紧凑方法只会返回一个空数组。 – 2014-10-06 13:54:57

回答

1

我相信你ES查询应该转换为这样的事情:

"size": 5, 
    "query": { 
    "filtered": { 
     "query": { "match": { "question_id" : 32481 } }, 
     "filter": { 
     "exists": { 
      "field": "text" 
     } 
     } 
    } 
    }, 
    "aggs": { 
    "keywords": { 
     "significant_terms": { 
     "field": "text" 
     } 
    } 
    } 

这意味着你的“question_id”“匹配”应括在“过滤”元素。