我必须合并才能查询和过滤。我们在弹性搜索2.4中使用filter_mode(:must)在合并查询和过滤后执行此操作。
现在filter_mode和query_mode不兼容。我正在使用'和'合并查询。我正在使用耐用的在rails框架中使用弹性搜索
query_string = index.query(bool: { should: [{ term: { title: query } }, { term: { tags: query } }] })
domain_filter = index.filter(term: { domain_id: domain_id })
merged_query = query_string.and(domain_filter)
现在query_string产品1的结果。所以过滤器应该产生该结果的子集。
而是当我做query_string.filter(term: { domain_id: domain_id })
它产生44个结果。我的主要目标是合并查询以过滤domain_id上的结果。当我将domain_filter写为查询时,它会生成一个过滤结果
domain_filter = index.query(term: { domain_id: domain_id })
merged_query = query_string.and(domain_filter)
上面合并的查询会产生正确的结果。但我认为这样使用它是错误的。我想使用ES过滤器。有人可以帮我弄这个吗?
详细查询 使用query_string.and(domain_filter)生成
{:index=>["resource_domain"], :type=>["resource_domain"], :body=>{:query=>{:bool=>{:should=>[{:term=>{:title=>"club-4"}}, {:term=>{:tags=>"club-4"}}], :filter=>{:term=>{:domain_id=>6}}}}}}
上面的一个会产生错误的结果
预期:
{:index=>["resource_domain"], :type=>["resource_domain"], :body=>{:query=>{:bool=>{:must=>[{:bool=>{:should=>[{:term=>{:title=>"club-4"}}, {:term=>{:tags=>"club-4"}}]}}, {:term=>{:domain_id=>6}}]}}}}
答案 0 :(得分:1)
您需要将域过滤器推送到bool/filter
子句,如此
query = index.query(bool: { minimum_should_match: 1, should: [{ term: { title: query } }, { term: { tags: query } }], filter: [{term: { domain_id: domain_id }}] })