2016-06-14 95 views
8

我想使用弹性搜索来搜索一个大型的地址数据库,并使它像一些其他应用程序,我首先从邮政编码开始,这是很好的缩小了其余的搜索查询。弹性搜索:使用过滤器,应该布尔查询

因此,与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作为强制条件,但也单独另外还有其他两个字段也作为全文搜索考虑在内。 我应该怎么做这个(IM看文档和可能被解释json-> perl的hashrefs错了,所以任何建议表示欢迎)

对于一个假设的例子: 用户输入NW1 4AQ,上面的查询将立即返回,说,奥尔巴尼街和波特兰街,如果用户查询Portland这个邮政编码,而不是得到这两个结果,我预计只有波特兰街才是结果。现在与上面它只是不断返回两个条目。

+0

是否有可能建立一个[最小的,完整的,和可核查的示例](HTTP:// ...计算器.com/help/mcve)? –

+0

增加了一个罗嗦的假设例子。 – Recct

回答

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

弹性医生说:

默认情况下,没有S的hould子句需要匹配,但有一个例外:如果没有必须子句,那么至少有一个子句必须匹配。正如我们可以控制匹配查询的精度,我们可以控制多少应该条款需要使用minimum_should_match参数匹配,无论是作为绝对数量或百分比”

因此,要做到这一点通过minimum_should_match就像你做了什么你做意味着要么地址必须匹配