2016-06-14 5 views
8

弾性検索を使用して大規模な住所データベースを検索し、他のアプリケーションのようにするには、最初に郵便番号で始まります。検索クエリ。弾性検索:フィルタを使用してクエリを行う必要があります

のでSearch::Elasticsearch

と私はちょうど$postcodeのためにすべてを吐き出すことが

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 }}, 
       ], 
      } 
     } 
    } 
); 

を行うと、関係なく、$keywordが結果セットであるもののがさらに低減されていません。

私は$postcodeを必須条件とする必要がありますが、別途または別の2つのフィールドもフルテキスト検索として考慮に入れる必要があります。 はどのように私はこの(Imはドキュメントを見ているので、何か提案は歓迎間違っjson-> perlのハッシュリファレンスを解釈される可能性があります)仮想の例えば

を行う必要があります。ユーザーはNW1 4AQ入る 、上記のクエリはすぐに言う、戻ります、ユーザーがPortlandにその郵便番号を照会すると、両方の結果を得る代わりに、ポートランドストリートだけが結果になると予想しています。今のところこれで、両方の項目を返すだけです。それはORを挿入しているように感じている、(むしろ真/偽よりカウンタである)1としてminimum_should_matchを持つ

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

:私は次は私がboolセグメントのために何をしたいんことがわかっ常識に従い

+0

が、それは[、最小限の完全な、かつ検証例]を作成することができます(http:// stackoverflowの.com/help/mcve)? –

+0

単語的な仮説の例が追加されました。 – Recct

答えて

2

これらの中でshould

1

弾性DOCは言う:デフォルトで

"、Sのいずれもhould句はと一致する必要がありますが、例外はありません。には句が必要な場合は、少なくとも1つのshould節が一致する必要があります。我々は試合クエリの精度を制御することができるように、私たちは句は、絶対数としてまたはパーセントのいずれかとして、minimum_should_matchパラメータを使用して一致させる必要がある必要がありますどのように多くを制御することができます」

ので、それを実行する方法。。あなたがやったことはが一致しなければならないのいずれかアドレスまたは名ことを意味し、あなたがやったのと同じようにminimum_should_matchている