【问题标题】:Merging elastic search query and filter doesn't work correctly合并弹性搜索查询和过滤器无法正常工作
【发布时间】:2018-01-03 14:01:06
【问题描述】:

我必须合并才能查询和过滤。在合并查询和过滤器后,我们在弹性搜索 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)

现在查询字符串产品 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}}]}}}}

【问题讨论】:

    标签: ruby-on-rails elasticsearch chewy-gem


    【解决方案1】:

    您需要将您的域过滤器放入 bool/filter 子句中,像这样

    query = index.query(bool: { minimum_should_match: 1, should: [{ term: { title: query } }, { term: { tags: query } }], filter: [{term: { domain_id: domain_id }}] })
    

    【讨论】:

    • 它产生了相同的查询,但我希望两者都应该与 must 子句合并。以上在布尔查询中产生不正确的结果
    • 考虑像这样的例子 scope = PlacesIndex.query(match: {name: 'Moscow'}) scope.query.and(match: {name: 'London'}) 它产生这样的结果 {:query=>{:bool=>{ # # :must=>[{:match=>{:name=>"Moscow"}}, {:match =>{:name=>"London"}}]}}}}> 我需要相同类型的过滤器结果。与必须合并
    • 原来的过滤器现在应该合并到bool/filter,这和bool/must一样,但没有评分。您能否展示生成的查询以及它与您的预期有何不同?
    • 用生成的和预期的查询更新了我的问题
    • 嗯,我的错,你还需要加minimum_should_match: 1。请参阅我的更新答案。
    猜你喜欢
    • 2020-08-17
    • 1970-01-01
    • 2019-08-05
    • 1970-01-01
    • 1970-01-01
    • 2015-01-25
    • 2019-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多