Pergunta

Eu tenho uma tabela MySQL contendo 40 milhões de registros que estão sendo preenchidos por um processo sobre o qual não tenho controle. Os dados são adicionados apenas uma vez por mês. Esta tabela precisa ser pesquisada pela coluna Nome. Mas a coluna de nome contém o nome completo no formato 'Último primeiro meio'.

No sphinx.conf, eu tenho

sql_query = SELECT Id, OwnersName,
substring_index(substring_index(OwnersName,' ',2),' ',-1) as firstname, 
substring_index(OwnersName,' ',2) as lastname
FROM table1

Como uso a pesquisa da Esfinge para pesquisar por primeiro nome e/ou sobrenome? Eu gostaria de poder procurar por 'Smith' apenas no primeiro nome?

Foi útil?

Solução

A julgar pelas outras respostas, posso ter perdido alguma coisa ... mas para restringir uma pesquisa na Esfinge a um campo específico, verifique se está usando o modo de correspondência estendido (ou estendido2) e use a seguinte sequência de consulta: @firstname Smith.

Outras dicas

As funções por fila nas consultas SQL são sempre uma má idéia para mesas que podem crescer. Se você deseja pesquisar em parte de uma coluna, ela deve ser extraída para sua própria coluna e indexada.

Eu sugeriria que, se você tiver poder sobre o esquema (em oposição ao processo da população), inserindo novas colunas chamadas PropriedadesFirstName e PropriedadesLastName, juntamente com um gatilho de atualização/inserção que extrai as informações relevantes do nome de proprietários e populats as novas colunas adequadamente.

Isso significa que a despesa de descobrir o primeiro nome é feita apenas quando uma linha é alterada, não cada vez Você executa sua consulta. Esse é o momento certo para fazê -lo.

Então suas consultas se tornam cegamente rápidas. E, sim, isso quebra o 3NF, mas a maioria das pessoas não percebe que não há problema em fazer isso por razões de desempenho, desde que você entenda as consequências. E, como as novas colunas são controladas pelos gatilhos, a duplicação de dados que seria motivo de preocupação é "limpa".

A maioria dos problemas que as pessoas têm com os bancos de dados é a velocidade de suas consultas. Descair de um pouco de espaço em disco para obter uma grande quantidade de melhoria de desempenho geralmente é bom.

Se você tem absolutamente não Power sobre até o esquema, outra possibilidade é criar seu próprio banco de dados com o esquema "correto" e preencher -o periodicamente do banco de dados real. Então consulte o seu. Isso pode envolver um pouco de transferência de dados todos os meses, no entanto, a primeira opção é a melhor, se permitida.

Você pode usar a substring para obter as partes do campo em que deseja pesquisar, mas isso diminuirá o processo. A consulta não pode usar nenhum tipo de índice para fazer a comparação, por isso precisa tocar cada registro na tabela.

O melhor seria não armazenar vários valores no mesmo campo, mas colocar o nome componentes em três campos separados. Quando você armazena mais de um valor em campos, quase sempre são alguns problemas para acessar os dados. Eu vejo isso repetidamente em diferentes fóruns ...

Este é um ProBlrm intratável, porque os nomes completos podem contém prefixos, sufixos, nomes do meio e sem nomes do meio, composto primeiro e sobrenomes com e sem hífens, etc. Não há maneira razoável de fazer isso com 100% de confiabilidade

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top