Поиск по частям, не привязывая к языку

index indextags {
  type   = plain
  source = sourcetags
  path   = /var/lib/manticore/indextags
  ngram_chars = all  # какие символы участвуют в разбиении (все символы)
  ngram_len = 3        # длина "кусочков" слова (кошка → кош, ошк, шка)
}

FATAL: table 'indextags': 'ngram_chars': syntax error near 'll'

Как выполнить так, чтобы не привязываться к языку, индексировать каждые 3 символа.
При поиске к примеру

MATCH('кош') или MATCH('шка')

находила все возможные слова в которых есть кош или шка

ngram_chars = all

all не поддерживается. Изучите документацию, пожалуйста - Creating a table > NLP and tokenization > Low-level tokenization | Manticore Search Manual

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 ---
1 Like

Добавил параметр

LIMIT 10 OPTION fuzzy=1, distance=2

после лемита, ничего не находит, даже если отпечатков нет.

При генерации индекса, добавляю поле
'all' AS field

Далее в запросе использую

MATCH(' кошки | @field all')

Если пользователь не вводит ничего, все равно какой то результат выдаст изначально и в случаи если строк 3, добавит еще 7.

Без @field all, работают опечатки.

В моем случаи, получается, чтобы и то работало и то, необходим запрос с

(
//Запрос для релевантной выдачи
)
UNION
(
// Запрос чтобы просто закрыть не достающиеся записи до лимита
)

SQL fuzzy=1 не поддерживает большинство полнотекстовых операторов. Читайте доку, пожалуйста - Searching > Spell correction | Manticore Search Manual

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
}