Многие клиенты, которым мы помогали
интегрировать поиск в их приложения
, хотели, чтобы их поиск был умнее, чем просто строгое сопоставление запроса с документами.
Существует много способов это сделать. Manticore Search делает это очень легко, так как нечеткое сопоставление включено из коробки. Оно состоит из трех основных компонентов:
1. Кворум-оператор:
"computing and technology news"/2
Это означает, что как минимум два слова фразы должны совпадать, т.е. этот запрос найдет тексты, содержащие как “computing news”, так и “technology news”.
2. Оператор поиска с близостью:
"computing news"~3
Это означает, что между словами из запроса может быть менее N несовпадающих слов. Вот несколько примеров, если текст a b c d e f g h
:
"a h"~7
найдет этот текст, так какb c d e f h
- это 6 несовпадающих слов, и это меньше 7
однако"a h"~6
не найдет текст"a d h"~6
найдет этот текст"a d h"~5
не найдет
3. Оператор NEAR
computing NEAR/6 "technology news"
Вышеупомянутый proximity оператор работает только с наборами ключевых слов. NEAR более универсален и может принимать произвольные подвыражения в качестве своих двух аргументов, сопоставляя документ, когда оба подвыражения найдены в пределах N слов друг от друга, независимо от порядка.
Этот запрос будет:
- сопоставлен с документом, содержащим
computing is a popular topic in technology news
, так как первое слово и фраза найдены в пределах 6 слов - но не будет сопоставлен с
computing nowadays is a popular topic in* technology news
, так как разрыв уже 6 и превышает ограничение, установленное в оператореNEAR
.
Логика второго прохода
Многие наши клиенты используют логику второго прохода: сначала выполняется более строгий запрос, и если ничего не найдено или возвращено недостаточно результатов, выдается второй, менее строгий запрос. Может быть и более сложная логика с 3-м и 4-м проходами. Все зависит от ваших требований и того, хотите ли вы, чтобы пользователь в любом случае что-то нашел. Или, наоборот, вы можете позволить им найти что-то, что точно соответствует их запросу.
Иногда имеет смысл сделать наоборот и сделать запрос более строгим. Например, если ваша стратегия сопоставления по умолчанию - “должно совпадать любое слово”, и в вашем приложении нет расширенного синтаксиса, позволяющего пользователям самим указывать лучший запрос, имеет смысл сначала попробовать стратегию “должны совпадать все слова” или даже “должна совпадать фраза”. Это может значительно повысить качество поиска.
В некоторых приложениях имеет смысл распараллеливать запросы первого/второго прохода и т.д. Это легко можно сделать с помощью мультизапроса Manticore Search. Суть в том, чтобы заранее сделать запрос второго прохода, и если по запросу первого прохода ничего не найдено, результаты будут готовы, и так как запросы были сделаны одновременно, это улучшает производительность. Однако это зависит от многих вещей. Нужно быть осторожным, так как иногда это может снизить производительность. Это такие вещи:
- Какое у вас оборудование? Если оно недостаточно мощное, чтобы справиться с двумя запросами одновременно, или время отклика близко к удвоенному по сравнению с одним запросом, имеет мало смысла использовать этот метод.
- Какая у вас нагрузка? Если ваш экземпляр/сервер Manticore Search уже сильно загружен, вы получите худшее время отклика.
- Какова ваша статистика? Если для 99% запросов первый проход возвращает результаты, нет особого смысла делать запрос второго прохода вместе с первым, это просто напрасная трата ресурсов.