правило для окончаний

Приветствую, коллеги!
Очень долго немогу решить задачку - а именно:
К примеру я хочу создать правило для окончаний где требуется ‘с’ заменить на ‘сы’ итп. То есть, чтобы слова ‘сброс’ и ‘сбросы’ , ‘трус’ и ‘трусы’ итп. выводили одинаковые результаты. То есть - смысл объединение слов в множественные и одиночные числа. На моём языке нет готовых решений…

Можете ли Вы набросать внятный примерчик - как это сделать, так сказать, где то место где копать ?
Коллеги, подключайтсь - кто что знает але слышал через стенку… :wink::rofl:

Заранее благодарю.

вы можете использовать regexp_filter опцию индекса для такой трансформации, вам только нужно написать подходящие вам regex правила

Дорогие коллеги, ежели не очень утомительно - то не могли бы вы набросать примеров как и где это regexp_filter реализовать?
То есть - это нужно использовать где - в config к конкретному индексу але в запросе к бд как то новую ячейку добавляют…? :roll_eyes::thinking: :flushed::eyes:
Смотрите: задача создать окончания равными по значению к примеру ‘dog’ и ‘dogs’ или ‘category’ и ‘categories’… где в последнем случае нужно как-то объединить окончания ‘y’ и ‘ies’ а в первом ’ g’ с ‘gs’. Пример с документации с 13inch как то невзашол ибо не для средних умов создан…:flushed::laughing:

1.# index '13"' as '13inch'
regexp_filter = \b(\d+)\" => \1inch

2.# index 'blue' or 'red' as 'color'
regexp_filter = (blue|red) => color

Допустим как эти примеры можно превратить в правило - чтобы не только на дюйми, синий, красный, ну то есть использовать абстрактно, так сказать, применять ко всему, что имеет окончание допустим ‘g’ или 'у ’ … :roll_eyes:

Что-то типа этого:

mysql> drop table if exists t; create table t(f text) regexp_filter='(\\W|^)(\\w+)ies(\\W|$) => \\1\\2y\\3' regexp_filter='(\\W|^)(\\w+)s(\\W|$) => \\1\\2\\3'; call keywords('dogs', 't'); call keywords('categories', 't');
--------------
drop table if exists t
--------------

Query OK, 0 rows affected (0.01 sec)

--------------
create table t(f text) regexp_filter='(\\W|^)(\\w+)ies(\\W|$) => \\1\\2y\\3' regexp_filter='(\\W|^)(\\w+)s(\\W|$) => \\1\\2\\3'
--------------

Query OK, 0 rows affected (0.00 sec)

--------------
call keywords('dogs', 't')
--------------

+------+-----------+------------+
| qpos | tokenized | normalized |
+------+-----------+------------+
| 1    | dog       | dog        |
+------+-----------+------------+
1 row in set (0.00 sec)

--------------
call keywords('categories', 't')
--------------

+------+-----------+------------+
| qpos | tokenized | normalized |
+------+-----------+------------+
| 1    | category  | category   |
+------+-----------+------------+
1 row in set (0.00 sec)
1 Like

Спасибо! С этим уже можно начинать работать. Вы не скажете что значит буковки W, +w, b, d, y, s… в regexp_filter

:rofl: да уж

  • вы же не серьезно?

Я вполне серьёзно. Я полагаю что это регулярные выражения,типа элементы языка сопоставимые с текстом. Так кто могит знать что там в этом вашем regexp_filter… :thinking::laughing:

Там используется RE2 в качестве движка. Почитайте доку по нему - Syntax · google/re2 Wiki · GitHub

1 Like

Спасибо! Вы знаете - у меня жутко мало времени чтобы всё, всё буквально выучить. Я полагаю, что Вы в теме… Может Вы могли бы накидать простую конструкцию как с помощью regexp_filter окончаниях слов просто букву ‘x’ сопоставить с ‘y’ . Это всё что мне нужно.

Как понять сопоставить x с y?

Типа равные по значению - ‘ззззx’ и ‘ззззy’ один резултат.

mysql> drop table if exists t; create table t(f text) regexp_filter='x(\\W|$) => y\\1'; call keywords('3333x', 't');
--------------
drop table if exists t
--------------

Query OK, 0 rows affected (0.01 sec)

--------------
create table t(f text) regexp_filter='x(\\W|$) => y\\1'
--------------

Query OK, 0 rows affected (0.01 sec)

--------------
call keywords('3333x', 't')
--------------

+------+-----------+------------+
| qpos | tokenized | normalized |
+------+-----------+------------+
| 1    | 3333y     | 3333y      |
+------+-----------+------------+
1 row in set (0.00 sec)

Кстати, chatgpt вполне адекватно отвечает по этой теме, так что можете пытать его:

mysql> drop table if exists t; create table t(f text) regexp_filter = '\\b(\\w*)x\\b => \\1y'; call keywords('3333x', 't');
--------------
drop table if exists t
--------------

Query OK, 0 rows affected (0.01 sec)

--------------
create table t(f text) regexp_filter = '\\b(\\w*)x\\b => \\1y'
--------------

Query OK, 0 rows affected (0.01 sec)

--------------
call keywords('3333x', 't')
--------------

+------+-----------+------------+
| qpos | tokenized | normalized |
+------+-----------+------------+
| 1    | 3333y     | 3333y      |
+------+-----------+------------+
1 row in set (0.00 sec)
1 Like

Спасибо! Всё работает.