⚠️ Эта страница автоматически переведена, и перевод может быть несовершенным.
blog-post

OR Inside Phrase, Quorum and Proximity

Если вам когда‑нибудь приходилось писать несколько запросов, лишь бы охватить все варианты фразы, вы знаете, насколько это может быть повторяющимся и беспорядочным. С новой поддержкой OR внутри фраз вы можете сопоставлять "happy customer" и "sad customer" — а также любые другие варианты — в одном чистом запросе.

Что нового в Manticore Search 13.6.7

Мы рады объявить, что Manticore Search 13.6.7 выпущен с расширенной поддержкой этой полезной функции. Оператор OR (|) внутри операторов фраз (кавычек) обеспечивает гибкое сопоставление фраз, что может улучшить то, как вы строите поисковую функциональность.

Магия OR в фразах

Традиционные поисковые движки заставляют выбирать между точным совпадением фразы и свободным совпадением ключевых слов. Но что, если нужен промежуточный вариант? Именно здесь оператор OR внутри фраз проявляет себя. Каждый вариант проверяется на той же позиции внутри фразы, и фраза считается совпавшей, если любой из альтернатив подходит к этой позиции.

Синтаксис, который имеет смысл

"( a | b ) c"                           -- Either "a c" or "b c"
"( ( a b c ) | d ) e"                   -- Either "a b c e" or "d e"  
"man ( happy | sad ) but all ( ( as good ) | ( as fast ) )"  -- Complex nested possibilities

Посмотрим это в действии

Создадим реальный пример, используя данные отзывов клиентов. Сначала мы настроим нашу тестовую среду:

-- Clean slate for easy reproduction
DROP TABLE IF EXISTS phrase_or_demo;

CREATE TABLE phrase_or_demo (title TEXT, content TEXT, category TEXT);

INSERT INTO phrase_or_demo (id, title, content, category) VALUES 
(1, 'Happy Customer Review', 'I am a very happy customer with excellent service', 'reviews'),
(2, 'Sad Customer Feedback', 'I am a very sad customer with poor experience', 'reviews'), 
(3, 'Customer Service Report', 'The customer was happy but had some concerns', 'reports'),
(4, 'Angry Customer Complaint', 'I am an angry customer demanding refund', 'complaints'),
(5, 'Neutral Customer Survey', 'The customer seemed neutral about our service', 'surveys'),
(6, 'Fast Delivery Service', 'Our delivery service is really fast and reliable', 'services'),
(7, 'Slow Delivery Issues', 'The delivery was extremely slow this time', 'issues'),
(8, 'Good Service Quality', 'We provide good service to all customers', 'services'),
(9, 'Bad Service Report', 'There were complaints about bad service quality', 'reports'),
(10, 'Customer Happy Experience', 'The happy customer left positive feedback', 'feedback'),
(11, 'Premium Quality Product', 'This is a premium quality item with excellent features', 'products'),
(12, 'Budget Quality Option', 'A budget quality alternative for cost-conscious buyers', 'products'),
(13, 'Standard Quality Service', 'Our standard quality offering meets basic needs', 'services');

Пример 1: Захват всех эмоциональных состояний

Запрос: "(happy | sad | angry) customer"

SELECT * FROM phrase_or_demo WHERE MATCH('"(happy | sad | angry) customer"')

Результат:

+------+---------------------------+---------------------------------------------------+------------+
| id   | title                     | content                                           | category   |
+------+---------------------------+---------------------------------------------------+------------+
|    2 | Sad Customer Feedback     | I am a very sad customer with poor experience     | reviews    |
|    4 | Angry Customer Complaint  | I am an angry customer demanding refund           | complaints |
|    1 | Happy Customer Review     | I am a very happy customer with excellent service | reviews    |
|   10 | Customer Happy Experience | The happy customer left positive feedback         | feedback   |
+------+---------------------------+---------------------------------------------------+------------+
4 rows in set (0.00 sec)

Почему это важно: Вместо написания трёх отдельных запросов фраз и их объединения с помощью OR, вы получаете точное совпадение фразы одним элегантным запросом.

Пример 2: Вариации качества обслуживания

Запрос: "(good | bad | premium | budget | standard) (service | quality)"

SELECT * FROM phrase_or_demo WHERE MATCH('"(good | bad | premium | budget | standard) (service | quality)"');

Результат:

+------+--------------------------+--------------------------------------------------------+----------+
| id   | title                    | content                                                | category |
+------+--------------------------+--------------------------------------------------------+----------+
|    8 | Good Service Quality     | We provide good service to all customers               | services |
|    9 | Bad Service Report       | There were complaints about bad service quality        | reports  |
|   11 | Premium Quality Product  | This is a premium quality item with excellent features | products |
|   12 | Budget Quality Option    | A budget quality alternative for cost-conscious buyers | products |
|   13 | Standard Quality Service | Our standard quality offering meets basic needs        | services |
+------+--------------------------+--------------------------------------------------------+----------+
5 rows in set (0.00 sec)

Преимущество: Один запрос охватывает все комбинации качество‑услуга с точной фразовой точностью.

За пределами базовых фраз: кворум и близость

Оператор OR не ограничивается простыми фразами. Иногда требуется большая гибкость, например, сопоставление документов, даже если не каждый термин присутствует, или поиск терминов, находящихся рядом, но не обязательно в точном порядке. Здесь на помощь приходят операторы quorum и proximity , которые работают без проблем с OR.

Кворум с OR: гибкое нечеткое сопоставление

Оператор кворума с OR предоставляет вам сложное нечеткое сопоставление, где только одно слово из каждой группы OR учитывается при достижении порога:

-- Find documents with at least 2 out of these word groups
SELECT id, content FROM phrase_or_demo  WHERE MATCH('@content "(excellent | good | premium) (service | quality | experience) customer"/2');

Результат:

+------+--------------------------------------------------------+
| id   | content                                                |
+------+--------------------------------------------------------+
|    8 | We provide good service to all customers               |
|    1 | I am a very happy customer with excellent service      |
|   11 | This is a premium quality item with excellent features |
|    2 | I am a very sad customer with poor experience          |
|    5 | The customer seemed neutral about our service          |
+------+--------------------------------------------------------+
5 rows in set (0.00 sec)

Объяснение: Это сопоставляет документы, содержащие как минимум 2 из 3 групп слов: (excellent|good|premium), (service|quality|experience) и «customer».

Расширенный пример кворума

-- Match documents with at least 50% of these emotion/service combinations
SELECT id, title FROM phrase_or_demo 
WHERE MATCH('"(happy | satisfied) (customer | experience) (excellent | good) (service | quality)"/0.5');

Близость с OR: соседние альтернативы

Оператор близости с OR проверяет каждую альтернативу отдельно в пределах указанного расстояния:

-- Find "delivery" within 3 words of either "fast" or "slow"
SELECT id, title, content FROM phrase_or_demo WHERE MATCH('"(fast | slow) delivery"~3');

Результат:

+------+-----------------------+--------------------------------------------------+
| id   | title                 | content                                          |
+------+-----------------------+--------------------------------------------------+
|    7 | Slow Delivery Issues  | The delivery was extremely slow this time        |
|    6 | Fast Delivery Service | Our delivery service is really fast and reliable |
+------+-----------------------+--------------------------------------------------+
2 rows in set (0.00 sec)

Сложный пример близости

-- Customer and emotional state within 5 words, plus quality terms
SELECT id, title, content FROM phrase_or_demo  WHERE MATCH('"customer (happy | sad | angry)"~2 (quality | service | experience)');

Результат:

+------+---------------------------+---------------------------------------------------+
| id   | title                     | content                                           |
+------+---------------------------+---------------------------------------------------+
|   10 | Customer Happy Experience | The happy customer left positive feedback         |
|    2 | Sad Customer Feedback     | I am a very sad customer with poor experience     |
|    1 | Happy Customer Review     | I am a very happy customer with excellent service |
|    3 | Customer Service Report   | The customer was happy but had some concerns      |
+------+---------------------------+---------------------------------------------------+
4 rows in set (0.00 sec)

Сравнение: традиционный vs. продвинутый

Традиционный подход (множество полнотекстовых утверждений)

-- The old way: multiple separate queries
SELECT id, title FROM phrase_or_demo WHERE MATCH('"happy customer"|"sad customer"|"angry customer"');

Современный подход (одна OR‑фраза)

-- The elegant way: one query to rule them all
SELECT id, title FROM phrase_or_demo WHERE MATCH('"(happy | sad | angry) customer"');

Применения в реальном мире

1. Поиск товаров в электронной коммерции

-- Capture all color and size variations
"(red | blue | green | black) (shirt | t-shirt | tee) (small | medium | large)"

2. Системы управления контентом

-- Track document status changes
"(draft | published | archived | deleted) (document | article | post)"

3. Анализ заявок службы поддержки

-- Categorize support issues with quorum
"(urgent | critical | high) (priority | importance) (bug | issue | problem)"/2

4. Мониторинг настроений в социальных сетях

-- Capture brand mentions with emotional context  
"@brand (love | hate | like | dislike) (product | service | experience)"~5

5. Поиск в медицинских записях

-- Find patient symptoms with proximity
"patient (experienced | reported | complained) (pain | discomfort | symptoms)"~4

6. Анализ финансовых транзакций

-- Track transaction types and statuses
"(credit | debit | transfer) (completed | pending | failed | cancelled)"

Продвинутые шаблоны использования

1. Слоистая точность

Объедините OR фразы с другими операторами для хирургической точности:

@title "(urgent | critical) (update | patch)" @body "security"

2. Оптимизация производительности

Используйте кворум с OR для нечеткого сопоставления, которое может быть быстрее, чем поиск по шаблону:

"(run | running | runner | runs) (fast | quick | speed)"/1

3. Контекстуальная гибкость

Используйте OR близости для вариаций естественного языка:

"user (wants | needs | requires) (feature | functionality)"~3

Ключевые преимущества

  1. Точность: Сохраняйте точную структуру фразы, одновременно учитывая вариации
  2. Поддерживаемость: Один запрос для обновления вместо управления множеством вариаций
  3. Аналитика: Объединённые наборы результатов делают анализ и ранжирование более осмысленными
  4. Гибкость: Эффективно обрабатывает реальные языковые вариации

Итог

Операторы OR внутри фраз предоставляют полезный компромисс между жёстким точным поиском и свободным поиском по ключевым словам. Независимо от того, создаёте ли вы поиск в электронной коммерции, анализируете отзывы клиентов или разрабатываете системы обнаружения контента, эта функция предлагает точность фраз с гибкостью альтернатив.

Manticore Search 13.6.7 включает эту функциональность как часть своих всесторонних возможностей текстового поиска. Комбинация операторов фраз, близости и кворума с функцией OR предоставляет дополнительные варианты для решения сложных поисковых требований.

Чтобы узнать больше об этой функции и других улучшениях, см. заметки о выпуске Manticore Search 13.6.7 .

Установить Manticore Search

Установить Manticore Search