Intereting Posts
Сессии – это состояние, PHP-код пользователя не Цифровые подписи с PHP Как увеличить максимальную переменную POST в PHP? Как добавить свойство к объекту в PHP> = 5.3 строгий режим без генерации ошибки Как я могу получить access_token из официального php-клиента tumblr? Как минимизировать вывод php html без удаления условных комментариев IE? Сохранить изображение профиля facebook с помощью cURL php preg_replace с символами Unicode Как перенаправить ошибки, сгенерированные в Bootstrap, на ErrorController? PHP Warning: POST Content-Length из 8978294 байт превышает предел 8388608 байт в Unknown в строке 0 Можем ли мы сделать перенаправление 302 с помощью javascript? Аутентификация самозаверяющего сертификата для подключения LDAPS Как безопасно обновить версию php на сервере Wamp Php Curl HTTP POST REQUEST устанавливает настраиваемый заголовок с вложенными парами значений ключа Не удалось вызвать встроенный метод mb_internal_encoding?

MySQL полнотекстовый поиск путаницы в булевом режиме

Я немного запутался при попытке настроить поиск, используя полнотекстовый поиск в логическом режиме. Вот запрос, который я использую:

$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 

Правильно ли я считаю, что второй результат не должен появляться, поскольку у него нет обоих слов? Если нет, как я могу создать эту функциональность?

Solutions Collecting From Web of "MySQL полнотекстовый поиск путаницы в булевом режиме"

Может быть, я ошибаюсь, но если вы будете искать эту строку +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 делает запрос медленным, но другого решения нет. Надеюсь, это решает ваш запрос.