Добрый день!
Есть ли какая-нибудь возможность найти документы в которых есть фраза A, но перед ней нет фразы B (или даже нет ни одной фразы из нескольких)?
На примере:
find me fast
find me quick and fast
find me fast now
Фраза A=“fast”, фраза B=“quick and”
Такой запрос должен вернуть
find me fast
find me fast now
Нашёл оператор NOTNEAR/1 в документации, но он ищет левое при отсутствущем правом, а надо наоборот.
Также думал сделать через “!” и NEAR: !"quick and" NEAR/1 fast, но выдаёт ошибку NOT is not allowed within NEAR
Возможности Мантикоры я только начал изучать, думаю можно ли ею заменить Эластик в нашем проекте.
Функциональности NOTNEAR в другую сторону нет. Есть strict order operator<<, но он не принимает NOT слева. Так что лучшее, что можно сделать - это убрать требование про порядок и тогда можно как-то так:
mysql> drop table if exists t; create table t(f text); insert into t values(1,'find me fast'),(2,'find me quick and fast'),(3,'find me fast now'),(4,'fast quick and'); select * from t where match('-"quick and" fast');
--------------
drop table if exists t
--------------
Query OK, 0 rows affected (0.02 sec)
--------------
create table t(f text)
--------------
Query OK, 0 rows affected (0.00 sec)
--------------
insert into t values(1,'find me fast'),(2,'find me quick and fast'),(3,'find me fast now'),(4,'fast quick and')
--------------
Query OK, 4 rows affected (0.00 sec)
--------------
select * from t where match('-"quick and" fast')
--------------
+------+------------------+
| id | f |
+------+------------------+
| 1 | find me fast |
| 3 | find me fast now |
+------+------------------+
2 rows in set (0.00 sec)
Но из-за отсутствия требования про порядок в этом случае не находится документ 4.
Что ещё можно сделать - в отдельное поле сохранять документ в обратном порядке, при поиске тоже инвертировать всё - и тогда NOTNEAR может быть подойдёт.
Более-менее получилось решить этот вопрос.
Делаю 2 запроса:
Просто фраза А
Фраза B+A
Потом вычитаю из первого ответа первого запроса второй (вычитается количество вхождений по каждому из документов, там где получилось 0 - выкидываю из ответа)