Как сделать полнотекстовый поиск - PullRequest
1 голос
/ 28 марта 2020

Я хочу сделать полнотекстовый поиск с метафоном. Все работает отлично. У меня есть 4 поля ie.

ID |Category     | Type          |Title                        |Meta
1  |Vehicle      |4 Wheelers     |Farrari Car for Sale         |FHKL WLRS FRR KR FR SL
2  |Real Estate  |Residential Apt|3BHK for sale                |RL ESTT RSTN APT BK FR SL
3  |Music        |Instruments    |Piano for sale               |MSK INST PN FR SL
4  |Stationary   |College        |Bag for $50                  |STXN KLJ BK FR
5  |Services     |Job            |Vacancy for Jr.Web Developer |SRFS JB FKNS FR JRWB TFLP

Выше приведены примеры данных. Здесь я хочу использовать метафон и полнотекстовый поиск, используя match () против (). Все отлично работает Однако некоторые слова, такие как Bag, Job и Car, игнорируются как минимальный символ по умолчанию 4. Теперь проблема в том, что я использую общий хостинг, и хостинг-провайдер сказал мне, что он не может предоставить мне файл конфигурации mysql, и при этом они не могут изменить это делать это в конфигурационном файле ft_min_word_len = 2 нельзя.

//Code for generating metaphone

<?php 
    $string = "Vacancy for Jr.Web Developer";
    $a = explode(" ", $string);
    foreach ($a as $value) {
        echo metaphone($value,4)."<br>";
    }
?>

Я использую обычный

SELECT * FROM tbl_sc WHERE MATCH(META) AGAINST('$USER_SEARCH');

Вся информация в базе данных генерируется пользователем, поэтому я не могу контролировать. Так как я пользуюсь mysql, PHP и на виртуальном хостинге. Я не могу использовать любую библиотеку поиска elasti c или подобные вещи. Я искал Google и переполнение стека, но я ничего не могу получить

Один из вариантов - использование оператора LIKE, но я хочу использовать MATCH () AGAINST (), если это возможно.

Пожалуйста, помогите мне с некоторой работой вокруг или альтернативным маршрутом.

1 Ответ

2 голосов
/ 28 марта 2020

сначала существует три типа полнотекстового поиска

полнотекстовый поиск на естественном языке

логический полнотекстовый поиск

Поисковый запрос расширения

здесь вам подходит полнотекстовый поиск на естественном языке, так как ваши запросы в основном на свободном языке и не используют специальных символов. Синтаксис в таком случае сначала

SELECT * FROM table_name WHERE MATCH(col1, col2)
AGAINST('search terms' IN NATURAL LANGUAGE MODE)

, добавьте в таблицу полнотекстовую функциональность

$stmt_txt_search = $conn->prepare("ALTER TABLE tbl_sc ADD FULLTEXT (Category, Type, Title, Meta)");
$stmt_txt_search->execute();

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

$stmt_match = $conn->prepare("SELECT * FROM tbl_sc WHERE MATCH (Meta) AGAINST(? IN NATURAL LANGUAGE MODE)");
$stmt_match->bind_param("s",$USER_SEARCH);
$stmt_match->execute();

чтобы изменить ft_min_word_len, вам нужно go файл my.cnf, измените его на желаемое значение, перезапустите сервер и перестройте ваши индексы следующим образом:

[mysqld]
set-variable = ft_min_word_len=3

затем

mysql> ALTER TABLE tbl_sc DROP INDEX Title, Category...;
mysql> ALTER TABLE tbl_sc ADD FULLTEXT Title, Category...;

но поскольку вы находитесь в учетной записи общего хостинга, вы не можете получить доступ к файлу my.cnf. Однако, используя SHOW VARIABLES и INFORMATION SCHEMA, вы можете видеть все установленные переменные и даже изменять их, используя SET в своем сеансе, так что все соединения БД будут основаны на вновь установленных значениях

, например, для SHOW VARIABLES в sql вы можете использовать

SELECT * FROM information_schema.global_variables;, это показывает все существующие переменные в вашем текущем сеансе, для такой переменной, как flush time, ее можно установить на 1, используя SET flush_time = 1;, так что теперь у базы данных будет время сброса 1 и далее, в вашем случае я предполагаю, что переменные ft_max_word_len и ft_min_word_len являются динамически изменяемыми, и поэтому я бы предложил попробовать

SET ft_min_word_len = 2; в текущем сеансе для получения дополнительной информации см системные переменные сервера

...