У меня не работает полнотекстовый поиск, как я хочу, и я не понимаю различий в результирующих списках.
Пример заявления:
SELECT `meldungstext`
FROM `artikel`
WHERE `meldungstext` LIKE '%punkt%'
возвращает 92 строки. Я получаю строки, которые имеют совпадения, например, такие как «Punkten», «Zwei-Punkte-Vorsprung» и «Treffpunkt» в столбце meldungstext.
Я установил полнотекстовый индекс в столбце «meldungstext» и попробовал это:
SELECT `meldungstext`
FROM `artikel`
WHERE MATCH (`meldungstext`)
AGAINST ('*punkt*')
это возвращает только 8 строк. Я получаю только те строки, которые соответствуют самому «Punkt» или словам, которые, я думаю, воспринимаются как «Punkt», как в «i-Punkt».
Затем я попробовал логический режим:
SELECT `meldungstext`
FROM `artikel`
WHERE MATCH (`meldungstext`)
AGAINST ('*punkt*' IN BOOLEAN MODE)
возвращает 44 строки Я получаю строки, у которых есть "Zwei-Punkte-Vorsprung" или "Treffpunkt" в столбце meldungstext, но не те с "Punkten".
Почему это происходит и как я могу установить «полностью» работающий полнотекстовый поиск, чтобы не использовать LIKE «%%» в предложении where?
источник
Ответы:
Я взял три строки в вашем вопросе и добавил их в таблицу плюс еще три строки
pankt
вместоpunkt
.Следующее было выполнено с использованием MySQL 5.5.12 для Windows
Я провел эти запросы к таблице, используя 3 разных подхода
MATCH ... AGAINST
LOCATE
как в функции LOCATELIKE
Пожалуйста, обратите внимание на различия
Все значения PunktMatch должны быть 3 1 и 3 0.
Теперь смотри, как я опрашиваю их как обычно
ОК, используя MATCH .. ПРОТИВ с punkt не работает. Что насчет pankt ???
Давайте запустим мой большой
GROUP BY
запрос против panktЭто также неправильно, потому что я должен видеть 3 0 и 3 1 для PanktMatch.
Я пробовал что-то еще
Я добавил знак плюс в pankt и получил разные результаты. Что 2 а не 3 ???
В соответствии с документацией MySQL обратите внимание на то, что говорится о подстановочных знаках:
Исходя из этого, подстановочный знак применим для задней части токенов, а не для передней. В свете этого вывод должен быть правильным, потому что 2 из стартовых токенов 3-х пунктов. Та же самая история с pankt. Это как минимум объясняет, почему 2 из 3 и почему меньше строк.
источник
COUNT(IF(MATCH
запросе.COUNT(…)
столбцы PunktMatch и PanktMatch?COUNT(IF(MATCH (
meldungstext всегда) AGAINST ('*pankt*' IN BOOLEAN MODE),1,0))
будет результатом , потому что он считает или , результат из .1
1
0
IF(…)