# Fuzzy matching and 2nd pass query

Многие клиенты, которым мы помогли [интегрировать поиск в их приложения](https://manticoresearch.com/services/), хотели, чтобы их поиск был более интеллектуальным, чем просто строгое сопоставление запроса с документами.
Существует множество способов сделать это. 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`.

## Логика второго прохода

Многие из наших клиентов используют логику второго прохода: сначала выполняется более строгий запрос, а если ничего не найдено или возвращено недостаточно результатов, выдаётся второй, менее строгий запрос. Также может быть более сложная логика с третьим и четвертым проходами. Всё зависит от ваших требований и от того, хотите ли вы, чтобы пользователь в любом случае нашёл что‑то. Или, наоборот, вы можете позволить ему найти именно то, что точно соответствует его запросу.

Иногда имеет смысл сделать наоборот и сделать запрос более строгим. Например, если ваша стратегия сопоставления по умолчанию — «любое слово должно совпасть», а в приложении нет расширенного синтаксиса, позволяющего пользователям самостоятельно задавать оптимальный запрос, имеет смысл сначала попробовать стратегию «все слова должны совпасть» или даже «фраза должна совпасть». Это может значительно повысить качество поиска.

В некоторых приложениях имеет смысл параллелить запросы первого и второго проходов и т.д. Это легко реализовать с помощью Manticore Search multiquery. Идея заключается в том, чтобы выполнить запрос второго прохода заранее, и если запрос первого прохода ничего не найдёт, результаты уже будут готовы, а поскольку запросы выполняются одновременно, это повышает производительность. Однако это зависит от множества факторов. Нужно быть осторожным, так как иногда это может снизить производительность. Эти факторы:
- Какое оборудование вы используете? Если оно недостаточно мощное для одновременной обработки двух запросов или время отклика почти вдвое превышает время одного запроса, то использование этой техники имеет мало смысла.
- Какова ваша нагрузка? Если ваш экземпляр/сервер Manticore Search уже сильно загружен, время отклика ухудшится.
- Каковы ваши статистические данные? Если для 99 % запросов первый проход возвращает результаты, то мало смысла выполнять запрос второго прохода вместе с первым — это будет лишь пустой тратой ресурсов.
