【问题标题】:Elastic Search: use filter and should bool query弹性搜索:使用过滤器和应该布尔查询
【发布时间】:2016-06-14 16:09:28
【问题描述】:

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

所以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那个邮政编码,而不是得到这两个结果,我只希望波特兰街是结果。现在有了上面它只是不断返回两个条目。

【问题讨论】:

标签: perl elasticsearch


【解决方案1】:

按照常识,我发现以下内容可以满足我对 bool 段的要求:

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

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

【讨论】:

    【解决方案2】:

    弹性文档说:

    "默认情况下,所有的 should 子句都不需要匹配,但有一个例外:如果没有 must 子句,则至少有一个 should 子句必须匹配. 正如我们可以控制匹配查询的精度一样,我们可以通过使用minimum_should_match 参数来控制需要匹配多少个should 子句,可以是绝对数,也可以是百分比"

    所以方法是通过minimum_should_match。就像你做的那样。您所做的意味着 addressname 必须匹配。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-25
      • 2012-03-12
      • 2015-10-31
      • 1970-01-01
      相关资源
      最近更新 更多