弹性搜索:使用过滤器并应该bool查询

时间:2016-06-14 16:09:28

标签: perl elasticsearch

我想使用弹性搜索来搜索大型地址数据库,并使其像其他一些应用程序一样首先使用邮政编码开始,这对于缩小搜索查询的其余部分非常有用。

所以使用Search::Elasticsearch

我做

my $scroll = $e->scroll_helper(index => 'pdb', search_type => 'scan', size => 100,
    body => {
        query => {
            bool => { 
                filter => [
                    {match => { pcode => $postcode }},
                ],
                should => [
                    {match => { address => $keyword }},
                    {match => { name => $keyword }},
                ],
            }
        }
    }
);

然而,这只会为$postcode吐出所有内容,无论$keyword是什么,结果集都不会进一步减少。

我需要将$postcode作为强制条件,但也需要另外将其他两个字段作为全文搜索考虑在内。 我应该怎么做(我正在查看文档,可能会解释json-> perl hashrefs错误,所以欢迎任何建议)

对于一个假设的例子: 用户输入NW1 4AQ,如果用户查询Portland 该邮政编码,上述查询将立即返回,例如,Albany Street和Portland Street,而不是同时获得这两个结果,我预计只有波特兰街成为结果。现在使用上面的内容它只是不断返回两个条目。

2 个答案:

答案 0 :(得分:2)

根据常识,我发现以下内容符合bool段的要求:

bool => { 
            must => [
                {match => { pcode => $postcode }},
            ],
            should => [
                {match => { address => $keyword }},
                {match => { name => $keyword }},
            ],
                minimum_should_match => 1,
        }

minimum_should_match设为1(这是一个计数器而不是真/假),感觉就像是在OR中插入should

答案 1 :(得分:1)

弹性文档说:

  

" 默认情况下,匹配不需要任何条款,但有一个例外:如果没有必须条款,那么至少应该有一个条款条款必须匹配。就像我们可以控制匹配查询的精度一样,我们可以通过使用minimum_should_match参数来控制需要匹配的子句数量,可以是绝对数字还是百分比"

所以做到这一点的方法是通过minimum_should_match。就像你做的那样。你做了什么意味着必须匹配地址名称