2016-06-14 1 views
8

Я хочу использовать поиск эластичных объектов для поиска по большой базе данных адресов, а чтобы сделать его похожим на некоторые другие приложения, я начинаю сначала с почтового индекса, который отлично подходит для остальной части поисковый запрос.Эластичный поиск: используйте фильтр и должен bool query

Так с 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:... // StackOverflow .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

Упругие док говорит:

"по умолчанию, ни один из с Предложения hould требуются для соответствия, за одним исключением: если нет должно быть, то должно быть как минимум одно обязательное условие должно совпадать. Подобно тому, как мы можем контролировать точность запроса матча, мы можем контролировать, сколько пункты должны должны совпадать с помощью параметра minimum_should_match, либо как абсолютное число или процент»

Так на пути, чтобы сделать это через minimum_should_match так же, как вы сделали, что вы сделали означает, что либо адрес или имя должно быть согласовано

Смежные вопросы