Não faço a pesquisa de texto completo funcionar como eu quero e não entendo as diferenças nas listas de resultados.
Exemplos de instruções:
SELECT `meldungstext`
FROM `artikel`
WHERE `meldungstext` LIKE '%punkt%'
retorna 92 linhas. Recebo linhas que possuem correspondências, por exemplo, como "Punkten", "Zwei-Punkte-Vorsprung" e "Treffpunkt" na coluna meldungstext.
Eu configurei um índice de texto completo na coluna "meldungstext" e tentei o seguinte:
SELECT `meldungstext`
FROM `artikel`
WHERE MATCH (`meldungstext`)
AGAINST ('*punkt*')
isso retorna apenas 8 linhas. Eu recebo apenas linhas que correspondem ao "Punkt" ou palavras que considero "Punkt" como em "i-Punkt".
Eu tentei o modo booleano:
SELECT `meldungstext`
FROM `artikel`
WHERE MATCH (`meldungstext`)
AGAINST ('*punkt*' IN BOOLEAN MODE)
retorna 44 linhas. Recebo linhas com "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" para impedir o uso de LIKE '%%' na cláusula where?
fonte
Respostas:
Peguei as três seqüências de caracteres em sua pergunta e a adicionei a uma tabela, mais três seqüências com, em
pankt
vez depunkt
.O seguinte foi executado usando o MySQL 5.5.12 para Windows
Eu executei essas consultas na tabela usando 3 abordagens diferentes
MATCH ... AGAINST
LOCATE
como na função LOCATELIKE
Observe as diferenças
Todos os valores de PunktMatch devem conter 3 1 e 3 0.
Agora observe-me consultá-los normalmente
OK usando MATCH. CONTRA com punkt não funciona. E o pankt ???
Vamos executar minha grande
GROUP BY
consulta no panktIsso também está errado, porque eu deveria ver 3 0 e 3 1 no PanktMatch.
Eu tentei outra coisa
Eu 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 ao front. À luz disso, a saída deve estar correta porque 2 dos 3 tokens de inicialização do punkt. A mesma história com pankt. Isso pelo menos explica por que 2 de 3 e por que menos linhas.
fonte
COUNT(IF(MATCH
consulta.COUNT(…)
nas colunas PunktMatch e PanktMatch?COUNT(IF(MATCH (
meldungstext) AGAINST ('*pankt*' IN BOOLEAN MODE),1,0))
vai sempre resultar em1
, porque é a contagem1
ou0
, o resultado doIF(…)
.