mysql> drop table if exists t; create table t(f text) min_infix_len='2' expand_keywords='1'; insert into t values(1, 'кошка'); select * from t where match('кош'); select * from t where match('шка');
--------------
drop table if exists t
--------------
Query OK, 0 rows affected (0.002 sec)
--------------
create table t(f text) min_infix_len='2' expand_keywords='1'
--------------
Query OK, 0 rows affected (0.004 sec)
--------------
insert into t values(1, 'кошка')
--------------
Query OK, 1 row affected (0.004 sec)
--------------
select * from t where match('кош')
--------------
+------+------------+
| id | f |
+------+------------+
| 1 | кошка |
+------+------------+
1 row in set (0.001 sec)
--- 1 out of 1 results in 245us ---
--------------
select * from t where match('шка')
--------------
+------+------------+
| id | f |
+------+------------+
| 1 | кошка |
+------+------------+
1 row in set (0.000 sec)
--- 1 out of 1 results in 107us ---
Note: When conducting a fuzzy search via SQL, the MATCH clause should not contain any full-text operators except the phrase search operator and should only include the words you intend to match.
Возможно, для вашего случая подойдёт JSON режим и fuzzy там.
При генерации индекса, добавляю поле
‘all’ AS field
sql_query = SELECT id, title, description, 'all' AS field FROM tags
Далее выборку SELECT *, WEIGHT() AS w FROM indextags WHERE MATCH('кош | @field all') ORDER BY w DESC LIMIT 10
Получаю 10 записей, сортировка по релевантности. Всегда 10 записей
SELECT *, WEIGHT() AS w FROM indextags WHERE MATCH('кош | @field all') ORDER BY w DESC LIMIT 10 OPTION fuzzy=1, distance=2
Необходимо допустить опечатки, но из-за @field all не работает. Без @field all, результат будет только релевантный поиск. Столько записей сколько найдет, может 1, может 2.
Пытаюсь выполнить так, чтобы результат всегда был 10, даже если пользователь ничего не ввел в поиск или дополнять результат необходимым количеством записей чтобы довести до 10.
Всегда 10 записей
Сортировка по весу вхождений
Допустить опечатки
Еще такой момент. Пользователь ищет по набору слов кошки телевизор
(В текущий момент не выдает ничего, поскольку подобного набора слов нет ни в одной записи)
Возможно получить результат:
Сперва записи в которых есть слово и ‘кошки’ и ‘телевизор’
Далее записи в торых есть что то одно
И далее дополнить до 10 если общий результат мнее.
Чтобы работали опечатки
И поиск по частям, по 2-3 символа.
index indextags {
type = plain
source = sourcetags
path = /var/lib/manticore/indextags
expand_keywords = 1
min_infix_len = 2
}