Я немного запутался при попытке настроить поиск, используя полнотекстовый поиск в логическом режиме. Вот запрос, который я использую:
$query = "SELECT *, MATCH(title) AGAINST('$q' IN BOOLEAN MODE) AS score FROM results WHERE MATCH(title) AGAINST('$q' IN BOOLEAN MODE) ORDER BY score DESC";
Когда я запускаю поиск +divorce+refinance
, возвращенные результаты:
1) Divorce: Paying Off Spouse = Rate/Term Refinance 2) Divorce - What to Look Out For Regarding Divorced Borrowers
Правильно ли я считаю, что второй результат не должен появляться, поскольку у него нет обоих слов? Если нет, как я могу создать эту функциональность?
Может быть, я ошибаюсь, но если вы будете искать эту строку +divorce+refinance
вы получите странный результат. Если вы хотите искать оба слова, вам следует искать +divorce +refinance
(пробел между ними).
Я тестировал его, и он возвращает только одну строку:
Divorce: Paying Off Spouse = Rate/Term Refinance
Ваша проблема связана с созданием приоритетного логического запроса, и для этого типа запросов нужно глубже входить в булевский поиск и теперь, как выполняется логический поиск. Простыми словами позвольте мне объяснить вам, почему показан второй результат результата.
Как только сначала нужно понять, что означает булевы в программировании? Это означает, что любое условие истинно или false i, e 0 – 1.
Теперь позвольте мне объяснить, что выполняется булевский поиск? Вы дали два слова. Давайте будем искать строку за строкой в булевом режиме. Поисковая система запускает и ищет строку за строкой, где когда-либо найдено первое слово, оно делает запись истинной и дает оценку как 1 для строк, в которых найдено первое слово, а также подготавливает количество слов, найденных в строке.
Теперь он перемещает следующее слово и выполняет тот же процесс, что дает запись True и делает список записей везде, где находится слово, а также подготавливает количество слов, найденных в строке.
Теперь есть две строки результатов, которые доступны, и они сгруппированы, а приоритет отдается словам с максимальным количеством слов и строк, вот главная проблема.
пример
Первый >>> общий номер. >> Второе >> общее количество. >>> Финал >> строка
Word >>> Результаты >> Word >>>> слов>>> Результаты >> нет >> Ответ
1 >>>>>>>> 2 >>>>>>>> 1 >>>>>>>>> 1 >>>>>>>> 1.33 >>>> 1 >>> 1.33
0 >>>>>>>> 0 >>>>>>>> 2 >>>>>>>>> 2 >>>>>>>> 1.25 >>>> 2 >>> 1.25
0 >>>>>>>> 0 >>>>>>>> 1 >>>>>>>>> 0 >>>>>>>> 1.25 >>>> 3 >>> 1
В то время как клубы с двумя списками результатов, когда true добавлено с ложным, тогда результат верен, как если бы вы добавили 1 + 0 = 1, а результаты должны иметь значение больше 1. Таким образом, при подсчете релевантности найденных слов всегда оказывается, что поисковая система показывает результаты, где оно находило любое слово.
Задание запросов релевантности выполняется в двух типах: либо игнорировать оценки, которые равны единице, а только расчеты по учетным записям, чей счет больше 1. Второй – сделать такой запрос, чтобы он никогда не показывал записи, равные единице. Как и в вашем случае, вы можете так сказать, чтобы получить правильные результаты для двух слов:
SELECT *, ( (1.3 * (MATCH(title) AGAINST ('+term +term2' IN BOOLEAN MODE))) + (0.6 * (MATCH(text) AGAINST ('+term +term2' IN BOOLEAN MODE))) ) AS score FROM results WHERE ( MATCH(title, text) AGAINST ('+term +term2' IN BOOLEAN MODE) ) HAVING relevance > 0 ORDER BY relevance DESC;
Я знаю, что использование слова HAVING делает запрос медленным, но другого решения нет. Надеюсь, это решает ваш запрос.