Como você faz com que as pesquisas de texto completo com caracteres curinga principais funcionem no SQL Server?

Nota: Estou usando os resources de pesquisa de texto completo do SQL, cláusulas CONTAINS e all – o * é o curinga em texto completo,% é apenas para cláusulas LIKE.

Eu li em vários lugares agora que as pesquisas “principais curingas” (por exemplo, usando “* estouro” para coincidir com “stackoverflow”) não são suportadas no MS SQL. Estou pensando em usar uma function CLR para adicionar correspondência de regex , mas estou curioso para ver que outras soluções as pessoas podem ter.

Mais informações : Você pode adicionar o asterisco somente no final da palavra ou frase. – juntamente com a minha experiência empírica: Ao combinar “myvalue”, “my *” funciona, mas “valor (asterisco)” não retorna correspondência, ao fazer uma consulta tão simples quanto:

SELECT * FROM TABLENAME WHERE CONTAINS(TextColumn, '"*searchterm"'); 

Assim, minha necessidade de uma solução alternativa. Estou usando apenas a pesquisa no meu site em uma página de pesquisa real. Por isso, ela precisa funcionar basicamente da mesma maneira que o Google funciona (aos olhos de um usuário do tipo Joe Sixpack). Não é tão complicado, mas esse tipo de jogo realmente não deveria falhar.

Solução apenas para o curinga principal:

  • armazenar o texto invertido em um campo diferente (ou na visão materializada)
  • criar um índice de texto completo nesta coluna
  • encontre o texto invertido com um *

     SELECT * FROM TABLENAME WHERE CONTAINS(TextColumnREV, '"mrethcraes*"'); 

Claro que existem muitos inconvenientes, apenas para uma solução rápida …

Sem mencionar CONTAINSTABLE …

O problema com os Wildcards principais: eles não podem ser indexados, portanto, você está fazendo uma varredura completa na tabela.

Vale a pena ter em mente que as principais consultas curinga têm um desempenho significativo, comparado a outros usos de curingas.

É possível usar o caractere curinga “*” no final da palavra ou frase (pesquisa de prefixo).

Por exemplo, essa consulta encontrará todos os “datab”, “database”, “databases” …

 SELECT * FROM SomeTable WHERE CONTAINS(ColumnName, '"datab*"') 

Mas, sem querer, não é possível pesquisar com o curinga principal.

Por exemplo, esta consulta não encontrará “database”

 SELECT * FROM SomeTable WHERE CONTAINS(ColumnName, '"*abase"') 

Para talvez adicionar clareza a esta discussão, dos meus testes em 2008 R2, Franjo está correto acima. Ao lidar com a pesquisa de texto completo, pelo menos ao usar a frase CONTAINS, você não pode usar um entrelinhamento , apenas um funcionalmente à direita . * é o caractere curinga, não% em texto completo.

Alguns sugeriram que * é ignorado. Esse não parece ser o caso, meus resultados parecem mostrar que a funcionalidade trailing * funciona. Eu acho que a liderança * é ignorada pelo mecanismo.

Meu problema adicional, porém, é que a mesma consulta, com um trailing *, que usa texto completo com curingas funcionou relativamente rápido em 2005 (20 segundos) e diminuiu para 12 minutos após a migration do database para 2008 R2. Parece que pelo menos um outro usuário teve resultados parecidos e ele iniciou um post no fórum que eu adicionei ao … O FREETEXT trabalha rápido ainda, mas algo “parece” ter mudado com a maneira como os processos de 2008 foram arrastados * em CONTAINS. Eles dão todos os tipos de avisos no Upgrade Advisor de que eles “melhoraram” o TEXTO COMPLETO para que seu código possa quebrar, mas infelizmente eles não fornecem avisos específicos sobre determinados códigos obsoletos, etc. … apenas um aviso de que eles o alteraram, Use por sua conta e risco.

http://social.msdn.microsoft.com/Forums/ar-SA/sqlsearch/thread/7e45b7e4-2061-4c89-af68-febd668f346c

Talvez, este seja o MS mais próximo relacionado a esses problemas … http://msdn.microsoft.com/en-us/library/ms143709.aspx

O caractere curinga no SQL Server é o sinal % e funciona bem, à direita, à direita ou de outra forma.

Dito isto, se você estiver indo fazer qualquer tipo de pesquisa séria de texto completo, então eu consideraria utilizar os resources do Índice de Texto Completo. Usar % e _ curingas fará com que seu database sofra um sério impacto no desempenho.

Dos manuais online do SQL Server:

Para escrever consultas de texto completo no Microsoft SQL Server 2005, você deve aprender como usar os predicados CONTAINS e FREETEXT Transact-SQL e as funções CONTAINSTABLE e FREETEXTTABLE com valor de conjunto de linhas.

Isso significa que todas as consultas escritas acima com% e _ não são consultas de texto completo válidas.

Aqui está uma amostra de como uma consulta se parece ao chamar a function CONTAINSTABLE.

SELECT RANK, * FROM TableName, CONTAINSTABLE (TableName, *, ‘”* WildCard”‘) searchTable WHERE [KEY] = TableName.pk ORDER BY searchTable.RANK DESC

Para que a function CONTAINSTABLE saiba que estou usando uma pesquisa de curinga, eu tenho que envolvê-la entre aspas duplas. Eu posso usar o caractere curinga * no início ou no final. Há muitas outras coisas que você pode fazer ao criar a string de pesquisa para a function CONTAINSTABLE. Você pode pesquisar uma palavra próxima a outra palavra, pesquisar palavras flexionadas (unidade = unidades, dirigir, dirigir e dirigir) e procurar sinônimo de outra palavra (o metal pode ter sinônimos como alumínio e aço).

Acabei de criar uma tabela, colocar um índice de texto completo na tabela e fazer algumas pesquisas de teste e não tive nenhum problema, portanto, a pesquisa de curingas funciona conforme o esperado.

[Atualizar]

Vejo que você atualizou sua pergunta e sabe que precisa usar uma das funções.

Você ainda pode pesquisar com o caractere curinga no início, mas se a palavra não for uma palavra completa após o caractere curinga, será necessário adicionar outro caractere curinga no final.

 Example: "*ildcar" will look for a single word as long as it ends with "ildcar". Example: "*ildcar*" will look for a single word with "ildcar" in the middle, which means it will match "wildcard". [Just noticed that Markdown removed the wildcard characters from the beginning and ending of my quoted string here.] 

[Atualização 2]

Dave Ward – Usar um curinga com uma das funções não deve ser um grande sucesso. Se eu criei uma string de pesquisa com apenas “*”, ela não retornará todas as linhas, no meu caso de teste, retornou 0 registros.

Apenas para FYI, o Google não faz pesquisas de substring ou truncamento, à direita ou à esquerda. Eles têm um caractere curinga * para encontrar palavras desconhecidas em uma frase, mas não uma palavra.

O Google, junto com a maioria dos mecanismos de pesquisa de texto completo, configura um índice invertido baseado na ordem alfabética das palavras, com links para seus documentos de origem. A pesquisa binária é rápida, até mesmo para índices enormes. Mas é realmente muito difícil fazer um truncamento à esquerda nesse caso, porque ele perde a vantagem do índice.

Como parâmetro em um procedimento armazenado, você pode usá-lo como:

 ALTER procedure [dbo].[uspLkp_DrugProductSelectAllByName] ( @PROPRIETARY_NAME varchar(10) ) as set nocount on declare @PROPRIETARY_NAME2 varchar(10) = '"' + @PROPRIETARY_NAME + '*"' select ldp.*, lkp.DRUG_PKG_ID from Lkp_DrugProduct ldp left outer join Lkp_DrugPackage lkp on ldp.DRUG_PROD_ID = lkp.DRUG_PROD_ID where contains(ldp.PROPRIETARY_NAME, @PROPRIETARY_NAME2) 

% Corresponde a qualquer número de caracteres _ Corresponde a um único caractere

Eu nunca usei indexação de texto completo, mas você pode realizar consultas de pesquisa bastante complexas e rápidas simplesmente usando as funções de string de compilation em T-SQL.

Quando se trata de pesquisa de texto completo, para o meu dinheiro nada bate Lucene . Há uma porta .Net disponível compatível com índices criados com a versão Java.

Há um pequeno trabalho envolvido em que você tem que criar / manter os índices, mas a velocidade de busca é fantástica e você pode criar todos os tipos de consultas interessantes. Mesmo a velocidade de indexação é muito boa – nós reconstruímos completamente nossos índices uma vez por dia e não nos preocupamos em atualizá-los.

Por exemplo, essa funcionalidade de pesquisa é fornecida pelo Lucene.Net.

Talvez o link a seguir forneça a resposta final para esse uso de curingas: Realizando Pesquisas Curinga do FTS .

Observe a passagem que diz: “No entanto, se você especificar” Chain “ou” Ch ain “, você não obterá o resultado esperado. O asterisco será considerado como um sinal de pontuação normal e não um caractere curinga.”

Se você tiver access à lista de palavras do mecanismo de pesquisa de texto completo, poderá fazer uma pesquisa ‘like’ nessa lista e corresponder ao database com as palavras encontradas, por exemplo, uma tabela ‘palavras’ com as seguintes palavras:

  pie applepie spies cherrypie dog cat 

Para combinar com todas as palavras que contêm ‘pie’ neste database em uma tabela fts ‘full_text’ com o campo ‘text’:

  to-match <- SELECT word FROM words WHERE word LIKE '%pie%' matcher = "" a = "" foreach(m, to-match) { matcher += a matcher += m a = " OR " } SELECT text FROM full_text WHERE text MATCH matcher 

Usando o caractere ‘%’, procurei em nosso database usando algo como o seguinte:

 SELECT name FROM TblNames WHERE name LIKE '%overflow' 

Usar este formulário ou consulta pode ser lento às vezes, mas só o usamos para a pesquisa manual ocasional.

    Intereting Posts