合并弹性搜索查询和过滤器无法正常工作
Merging elastic search query and filter doesn't work correctly
我必须合并才能查询和过滤。我们在合并查询和过滤器后使用 filter_mode(:must) 在 elastic search 2.4 中做到了这一点。
现在 filter_mode 和 query_mode 不兼容。我正在使用 'and' 合并查询。我正在使用 Chewy 在 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}}]}}}}
您需要将您的域过滤器添加到 bool/filter
子句中,像这样
query = index.query(bool: { minimum_should_match: 1, should: [{ term: { title: query } }, { term: { tags: query } }], filter: [{term: { domain_id: domain_id }}] })
我必须合并才能查询和过滤。我们在合并查询和过滤器后使用 filter_mode(:must) 在 elastic search 2.4 中做到了这一点。
现在 filter_mode 和 query_mode 不兼容。我正在使用 'and' 合并查询。我正在使用 Chewy 在 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}}]}}}}
您需要将您的域过滤器添加到 bool/filter
子句中,像这样
query = index.query(bool: { minimum_should_match: 1, should: [{ term: { title: query } }, { term: { tags: query } }], filter: [{term: { domain_id: domain_id }}] })