2016-06-14 21 views
8

Chcę użyć elastycznego wyszukiwania do przeszukiwania dużej bazy adresowej, a żeby było jak kilka innych aplikacji, zaczynam od kodu pocztowego, który najlepiej jest zawęzić w pozostałej części zapytanie wyszukiwania.Elastic Search: użyj filtru i powinno bool zapytanie

Więc z Search::Elasticsearch

zrobić

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

jednak, że tylko wypluwa wszystko dla $postcode i niezależnie od tego, co $keyword jest wynikowa nie jest dodatkowo zmniejszona.

Muszę mieć $postcode jako warunek obowiązkowy, ale także osobno, a dodatkowo pozostałe dwa pola również należy uwzględnić jako wyszukiwanie pełnotekstowe. W jaki sposób należy to zrobić (Im patrząc na docs i może być interpretacji json-> Perl hashrefs źle więc wszelkie sugestie mile widziane)

Dla hipotetycznego przykładu: Użytkownik wchodzi NW1 4AQ, Powyższe zapytanie natychmiast wrócić, powiedzmy, Albany Street i Portland Street, jeśli użytkownik wypytuje ten kod pocztowy, zamiast otrzymać oba te wyniki, spodziewam się, że wynikiem będzie tylko Portland Street. W tej chwili z powyższym Po prostu wraca oba wpisy.

+0

Czy możliwe jest stworzenie [minimalny, kompletne i zweryfikowania przykład] (http:... // stackoverflow .com/help/mcve)? –

+0

Dodano przykład hipotetycznego hipotetycznego. – Recct

Odpowiedz

2

Po zdrowym rozsądkiem Okazało się, że dodaje się robi to, co chcę dla segmentu bool:

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

uwzględniając minimum_should_match jako 1 (co jest sprzeczne zamiast true/false), czuje się jakby to wstawienie OR w tych should s

1

Elastic doc mówi:

"domyślnie żadna z s klauzule hould są wymagane, aby dopasować, z jednym wyjątkiem: jeśli nie ma klauzul must, to przynajmniej jedna klauzula powinna pasować. Podobnie jak możemy kontrolować precyzję zapytania meczu, możemy kontrolować, ile powinno klauzule trzeba dopasować za pomocą parametru minimum_should_match, albo jako wartość bezwzględna lub jako procent”

więc sposobu, aby to zrobić jest przez minimum_should_match Podobnie jak ty co zrobiłeś oznacza, że ​​albo adres lub nazwa muszą być dopasowane

Powiązane problemy