Force Proximity Search в слове нескольких слов? - PullRequest
0 голосов
/ 21 мая 2019

Я использую Близость к хорошему использованию со Сфинксом, например. Twain NEAR/1 Mark вернется

Марк Твен

и

Твен, Марк

Но скажем, у меня была такая форма слова:

День недели> День недели

Как я могу настроить любой заданный поиск на использование Proximity NEAR/3 (или NEAR/X), чтобы он нашел

День недели

и

день недели

Я понимаю, что в этом случае есть и другие способы снять шкуру с кошки, но, в общем, я ищу способ, чтобы карта из нескольких слов не выдвигалась как 'Word1 Word2', то есть 'Week Day', потому что в противном случае я получаю документы, такие как

'Я работал целый день, прежде чем понял, что это займет

полная неделя '

1 Ответ

0 голосов
/ 27 мая 2019

Нет простого выхода из коробки. Возможно, вы можете внести изменения в свое приложение, чтобы оно заменяло каждое слово на «слово» ~ N в вашем поисковом запросе или, что еще лучше, делало это только для тех же словоформ, с которыми имеет дело Sphinx. Вот пример:

mysql> select *, weight() from idx_min where match('weekday');
+------+-------------------------------------------------------------------------------+------+----------+
| id   | doc                                                                           | a    | weight() |
+------+-------------------------------------------------------------------------------+------+----------+
|    1 | Weekday                                                                       |    1 |     2319 |
|    2 | day of week                                                                   |    2 |     1319 |
|    3 | I worked for one entire day before realizing it was going to take a full week |    3 |     1319 |
+------+-------------------------------------------------------------------------------+------+----------+
3 rows in set (0.00 sec)

mysql> select *, weight() from idx_min where match('"weekday"');
+------+---------+------+----------+
| id   | doc     | a    | weight() |
+------+---------+------+----------+
|    1 | Weekday |    1 |     2319 |
+------+---------+------+----------+
1 row in set (0.00 sec)

mysql> select *, weight() from idx_min where match('"weekday"~2');
+------+-------------+------+----------+
| id   | doc         | a    | weight() |
+------+-------------+------+----------+
|    1 | Weekday     |    1 |     2319 |
|    2 | day of week |    2 |     1319 |
+------+-------------+------+----------+
2 rows in set (0.00 sec)

mysql> select *, weight() from idx_min where match('"entire"~2 "day"~2');
+------+-------------------------------------------------------------------------------+------+----------+
| id   | doc                                                                           | a    | weight() |
+------+-------------------------------------------------------------------------------+------+----------+
|    3 | I worked for one entire day before realizing it was going to take a full week |    3 |     1500 |
+------+-------------------------------------------------------------------------------+------+----------+
1 row in set (0.00 sec)

mysql> select *, weight() from idx_min where match('weekday full week');
+------+-------------------------------------------------------------------------------+------+----------+
| id   | doc                                                                           | a    | weight() |
+------+-------------------------------------------------------------------------------+------+----------+
|    3 | I worked for one entire day before realizing it was going to take a full week |    3 |     2439 |
+------+-------------------------------------------------------------------------------+------+----------+
1 row in set (0.01 sec)

mysql> select *, weight() from idx_min where match('"weekday"~2 full week');
Empty set (0.00 sec)

Последний вариант будет лучшим, но вам придется:

1) разобрать ваш запрос. Например. как это:

mysql> call keywords('weekday full week', 'idx_min');
+------+-----------+------------+
| qpos | tokenized | normalized |
+------+-----------+------------+
| 1    | weekday   | week       |
| 2    | weekday   | day        |
| 3    | full      | full       |
| 4    | week      | week       |
+------+-----------+------------+
4 rows in set (0.00 sec)

и если вы видите, что для одного и того же токенизированного слова вы получаете 2 разных нормализованных слова, которые могут служить сигналом для вашего приложения, чтобы превратить токенизированное слово в «слово» ~ N.

2) запустить запрос. В данном случае «будний день» ~ 2 полных недели

...