Não consigo que a pesquisa de texto completo funcione como gostaria e não entendo as diferenças nas listas de resultados.
Exemplos de declarações:
SELECT `meldungstext`
FROM `artikel`
WHERE `meldungstext` LIKE '%punkt%'
retorna 92 linhas. Recebo linhas que têm correspondências, por exemplo, como "Punkten", "Zwei-Punkte-Vorsprung" e "Treffpunkt" na coluna meldungstext.
Eu defini um fulltext-index na coluna "meldungstext" e tentei isto:
SELECT `meldungstext`
FROM `artikel`
WHERE MATCH (`meldungstext`)
AGAINST ('*punkt*')
isso retorna apenas 8 linhas. Eu recebo apenas linhas que correspondem ao próprio "Punkt" ou palavras que eu acho que são consideradas "Punkt" como em "i-Punkt".
Eu então tentei o modo booleano:
SELECT `meldungstext`
FROM `artikel`
WHERE MATCH (`meldungstext`)
AGAINST ('*punkt*' IN BOOLEAN MODE)
retorna 44 linhas. Recebo linhas que têm "Zwei-Punkte-Vorsprung" ou "Treffpunkt" na coluna meldungstext, mas não aquelas com "Punkten".
Por que isso acontece e como posso definir uma pesquisa de texto completo "totalmente" funcionando para evitar o uso de LIKE '%%' na cláusula where?
Peguei as três strings em sua pergunta e as adicionei a uma tabela mais três strings com
pankt
em vez depunkt
.O seguinte foi executado usando MySQL 5.5.12 para Windows
Executei essas consultas na tabela usando 3 abordagens diferentes
MATCH ... AGAINST
LOCATE
como na função LOCALIZARLIKE
Observe as diferenças
Todos os valores de PunktMatch devem ser 3 1's e 3 0's.
Agora observe-me consultá-los normalmente
OK usando MATCH .. AGAINST com punkt não funciona. Que tal pankt ???
Vamos executar minha grande
GROUP BY
consulta no panktIsso também está errado porque eu deveria ver 3 0's e 3 1's para PanktMatch.
eu tentei outra coisa
Adicionei um sinal de mais ao pankt e obtive resultados diferentes. O que 2 e não 3 ???
De acordo com a documentação do MySQL , observe o que diz sobre o caractere curinga:
Com base nisso, o caractere curinga é aplicável ao verso dos tokens e não à frente. Diante disso, a saída deve estar correta porque 2 dos 3 tokens iniciais do punkt. Mesma história com pankt. Isso pelo menos explica por que 2 de 3 e por que menos linhas.