MySQL FullText Search por entidades HTML
-
12-09-2019 - |
Pergunta
Eu tenho que invadir um sistema de gerenciamento de conteúdo para oferecer suporte à pesquisa completa de texto por um idioma que contém caracteres especiais. Estes são armazenados no banco de dados como entidades HTML. Fora da caixa, o CMS não a suporta. O bug foi relatado há muito tempo, mas aparentemente não tem prioridade. Estou cumprindo esse CMS, o cliente está aguardando minha solução, então tenho que invadir. Droga...
OK ... O CMS armazena seu conteúdo, traduzindo caracteres especiais em entidades HTML (isso é realmente feito pelo editor empacotado). Então a palavra alemã "Möchten" recebe "Möchten" no banco de dados. O CMS cria uma sequência de consulta como
SELECT * FROM `SiteTree` WHERE MATCH( Content ) AGAINST (<SEARCH_STRING> IN BOOLEAN MODE);
A tabela é do tipo myisam, o campo possui um índice de texto completo.
Se você usar "Möchten" como string de pesquisa, o MySQL corresponderá a todas as páginas, como & é um operador que fará coisas loucas se estiver presente na sequência de pesquisa. A pesquisa não funcionará.
A próxima idéia é substituir o personagem especial por um * como espaço reservado. Mas isso também corresponderá a várias palavras, assim que você tiver qualquer coisa começando com um "M" e outra palavra seguinte terminando com um "chten". Não sei por que, mas substituir apenas os ampeiros e um asterisco (procurar "m*ouml; chten") também levará a resultados semelhantes.
O mesmo problema foi descrito aqui.
Ok, pessoal, eu preciso da sua ajuda! Alguma ideia?
Editar: Converter o conteúdo para UTF-8 não é opção.
Obrigado!
Craesh
Solução
Por que você está usando entidades HTML? Basta mudar para UTF8.
Caso contrário, tente citar sua string de pesquisa mais uma vez como ('"pesquisa"').Infelizmente não funciona - http://bugs.mysql.com/bug.php?id=26265 Há um bug longo. Eu acho que a única abordagem é:
E a última abordagem é armazenar coluna adicional apenas para fins de pesquisa com todos os sotaques substituídos.
Outras dicas
Você pode usar um mecanismo de pesquisa de texto completo. Apache Lucene é poderoso, mas um pouco difícil de aprender. Apache Solr é muito mais fácil de aprender e pode ser bastante útil. Esfinge é conhecido por sua fácil integração com o MySQL. Eu acredito que todos eles lidam bem com a internacionalização.