Подстановочные знаки FULLTEXT search в NATURAL LANGUAGE MODE - PullRequest
4 голосов
/ 09 июля 2020

Я работаю с jquery автозаполнением и хочу возвращать предложения даже при частичном вводе слов.

Прямо сейчас у меня есть этот запрос

SELECT field FROM table WHERE MATCH (field) AGAINST ('$search_query*' IN BOOLEAN MODE)");

Он работает хорошо, но в отличие от NATURAL LANGUAGE MODE, BOOLEAN MODE имеет плохую сортировку по релевантности.

Итак, я пытаюсь заставить подстановочный знак работать в режиме естественного языка. Насколько я знаю, по умолчанию это не поддерживается, но, может быть, это можно сделать как-то иначе? Как, например, при использовании функции PHP.

Ответы [ 4 ]

2 голосов
/ 30 июля 2020

Мне почти стыдно признаться в этом, но я столкнулся с аналогичной проблемой с неиндексированным полнотекстовым поиском. Я создал таблицу базы данных с моим любимым списком слов, 18 из которых выглядят так:

+------+-------------+
| ID   | WORD        |
+------+-------------+
| 2336 | Babble      |
| 2337 | Babbled     |
| 2338 | Babbling    |
| 2339 | Babian      |
| 2348 | Babied      |
| 2346 | Babies      |
| 2340 | Babion      |
| 2341 | Babiroussa  |
| 2342 | Babirussa   |
| 2343 | Baboo       |
| 2344 | Babu        |
| 2345 | Baby        |
| 2347 | Baby        |
| 2349 | Babying     |
| 2350 | Babylonic   |
| 2351 | Babylonical |
| 2352 | Babyroussa  |
| 2353 | Babyrussa   |
+------+-------------+

Это не очень красиво, но вы выбираете слова, которые начинаются с того, что вводит пользователь (СЛОВО типа 'bab% ', как показано выше для моего списка), исключая стоп-слова, а затем передать их в поиск на естественном языке. Списки слов доступны на многих языках, если ваше приложение не соответствует английскому sh. Вы можете добавить в списки имен и т. Д. c, если хотите.

0 голосов
/ 02 августа 2020

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

Вы должны использовать предложения HAVING и ORDER BY, поскольку функция ПОИСКПОЗ возвращает оценку релевантности, которая вы использовали бы для сортировки результатов (order by) и сохранения только ненулевых результатов (having).

SELECT field,
    MATCH (field) AGAINST ('$search_query*' IN BOOLEAN MODE) as score
    FROM table
    HAVING score > 0
    ORDER BY score DESC;
0 голосов
/ 31 июля 2020

Надеюсь, это сработает для вас.

SELECT  MATCH (field)
    AGAINST ('$search_query' IN NATURAL LANGUAGE MODE) AS result
    FROM table;
0 голосов
/ 13 июля 2020

Вам понадобится что-то вроде

SELECT *, MATCH(field) AGAINST '$search_query' AS `relevance`
WHERE MATCH (field) AGAINST ('$search_query*' IN BOOLEAN MODE)
ORDER BY `relevance` DESC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...