Como você se levando curinga de texto completo procura para trabalhar no SQL Server?

votos
33

Nota: eu estou usando recursos de pesquisa de texto completo do SQL, possui cláusulas e todos - o * é o curinga em texto completo,% é apenas para cláusulas LIKE.

Eu li em vários lugares agora que as buscas levando curinga (por exemplo, usando * overflow para corresponder stackoverflow) não é suportada no MS SQL. Estou pensando em usar uma função CLR para adicionar correspondência regex , mas estou curioso para ver o que outras soluções de pessoas podem ter.

Mais informações : Você pode adicionar o asterisco apenas no final da palavra ou frase. - juntamente com a minha experiência empírica: Ao fazer a correspondência myvalue, meu * funciona, mas valor (asterisco) retorna nenhuma correspondência, ao fazer uma consulta tão simples como:

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

Assim, a minha necessidade de uma solução alternativa. Eu só estou usando a pesquisa no meu site em uma página de pesquisa real - por isso precisa trabalhar basicamente da mesma maneira que o Google funciona (aos olhos em um Sixpack-tipo de usuário Joe). Não é tão complicado, mas este tipo de jogo realmente não deve falhar.

Publicado 06/08/2008 em 14:52
fonte usuário
Em outras línguas...                            


14 respostas

votos
19

Solução alternativa apenas para levando curinga:

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

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

Claro que existem muitas desvantagens, apenas para solução rápida ...

Sem mencionar CONTAINSTABLE ...

Respondeu 24/09/2008 em 00:11
fonte usuário

votos
15

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

Respondeu 06/08/2008 em 15:07
fonte usuário

votos
4

Para adicionar talvez clareza para esta discussão, do meu teste em 2008 R2, Franjo é correta acima. Quando se tratar de pesquisa de texto completo, pelo menos quando se utiliza a frase contiver, você não pode usar um líder , apenas arrastando funcionalmente. * É o curinga, não% em texto completo.

Alguns sugeriram que * é ignorada. Isso não parece ser o caso, os meus resultados parecem mostrar que a funcionalidade de arrasto * funciona. Eu acho que conduz * são ignorados pelo motor.

Meu problema adicional, porém, é que a mesma consulta, com uma fuga *, que usa texto completo com wildcards trabalhou relativamente rápido em 2005 (20 segundos), e diminuiu para 12 minutos após a migração do banco de dados para 2008 R2. Parece pelo menos um outro usuário teve resultados semelhantes e ele começou um post no fórum que eu adicionei a ... FREETEXT trabalha rápido ainda, mas algo "parece" ter mudado com a maneira 2008 processos trailing * em CONTÉM. Eles dão todos os tipos de avisos na Upgrade Advisor que "melhorou" Texto completo para que o seu código pode quebrar, mas, infelizmente, eles não dão a você todos os avisos específicos sobre determinado código obsoleto etc ... apenas um aviso de que eles mudaram, Use por sua conta e risco.

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

Talvez, este é o hit MS mais próximo relativa a estes problemas ... http://msdn.microsoft.com/en-us/library/ms143709.aspx

Respondeu 06/10/2011 em 19:17
fonte usuário

votos
4

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

Por exemplo, esta consulta vai encontrar todos "datab", "banco de dados", "bases" ...

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

Mas, unforutnately, não é possível pesquisar com os principais curinga.

Por exemplo, esta consulta não vai encontrar "banco de dados"

SELECT * FROM SomeTable WHERE CONTAINS(ColumnName, '"*abase"')
Respondeu 26/11/2008 em 10:22
fonte usuário

votos
4

Uma coisa vale a pena manter em mente é que os principais consultas curinga chegou a um prémio de desempenho significativa, em comparação com outros usos curinga.

Respondeu 06/08/2008 em 15:03
fonte usuário

votos
2

O caractere curinga no SQL Server é o %sinal e ele funciona muito bem, levando, arrastando ou de outra forma.

Dito isto, se você está indo fazer qualquer tipo de graves texto completo busca então eu consideraria utilizar as capacidades de índice de texto completo. Usando %e _wild cards fará com que seu banco de dados para levar um sério impacto na performance.

Respondeu 06/08/2008 em 14:57
fonte usuário

votos
1

Como um 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)
Respondeu 04/01/2016 em 23:59
fonte usuário

votos
1

Apenas FYI, o Google não faz qualquer pesquisas subseqüência ou truncamento, direita ou esquerda. Eles têm um caráter * curinga para encontrar palavras desconhecidas em uma frase, mas nem uma palavra.

Google, juntamente com a maioria dos motores de busca de texto completo, define-se um índice invertido com base na ordem alfabética de palavras, com links para seus documentos de origem. busca binária é mau rápido, mesmo para grandes índices. Mas é realmente muito difícil de fazer uma esquerda-truncamento neste caso, porque perde a vantagem do índice.

Respondeu 16/09/2008 em 01:22
fonte usuário

votos
1

A partir do SQL Server Books Online:

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

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

Aqui está uma amostra do que uma consulta parece quando chamando a função CONTAINSTABLE.

RANK SELECT, * FROM TableName, CONTAINSTABLE (TableName, * ' "* WildCard"') searchTable ONDE [KEY] = TableName.pk ORDER BY searchTable.RANK DESC

Para que a função CONTAINSTABLE de saber que eu estou usando uma pesquisa curinga, tenho de envolvê-la entre aspas duplas. Eu posso usar o caractere curinga * no início ou no fim. Há um monte de outras coisas que você pode fazer quando você está construindo a cadeia de pesquisa para a função CONTAINSTABLE. Você pode procurar por uma palavra perto de outra palavra, procurar palavras flexionadas (unidade = unidades, conduziu, condução, e conduzido), e procurar sinônimo de outra palavra (metal pode ter sinônimos, tais como alumínio e aço).

Acabei de criar uma tabela, coloque um índice de texto completo na mesa e fez um par de pesquisas de teste e não tinha um problema, por isso a pesquisa curinga funciona como pretendido.

[Atualizar]

Eu vejo que você atualizou sua pergunta e saiba que você precisa usar uma das funções.

Você ainda pode pesquisar com o curinga no início, mas se a palavra não é uma palavra cheia após o curinga, você tem que adicionar outro 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.]

[Update # 2]

Dave Ward - Usando um curinga com uma das funções não deve ser um enorme sucesso perf. Se eu criei uma seqüência de pesquisa com apenas "*", não vai retornar todas as linhas, no meu caso de teste, ele retornou 0 registros.

Respondeu 06/08/2008 em 16:08
fonte usuário

votos
0

Se você tiver acesso à lista de palavras do motor de pesquisa de texto completo, você poderia fazer um 'como' procurar nesta lista e combinar com o banco de dados com as palavras encontradas, por exemplo, uma tabela 'palavras' com as seguintes palavras:

    pie
    applepie
    spies
    cherrypie
    dog
    cat

Para corresponder a todas as palavras que contenham 'torta' neste banco de dados em uma tabela 'full_text' fts com o campo 'texto':

    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
Respondeu 02/07/2018 em 14:20
fonte usuário

votos
0

Talvez link a seguir irá fornecer a resposta final a esta utilização de wildcards: Realizando FTS curinga Pesquisas .

Observe a passagem que diz: "No entanto, se você especificar‘ Cadeia’ou‘Ch ain’, você não vai obter o resultado esperado O asterisco será considerado como um sinal de pontuação normal não um carácter universal.".

Respondeu 18/10/2016 em 17:34
fonte usuário

votos
0

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

Há um pouco de trabalho envolvido em que você tem que criar / manter os índices, mas a velocidade de pesquisa é fantástico e você pode criar todos os tipos de consultas interessantes. Mesmo velocidade de indexação é muito bom - que acabamos de reconstruir completamente os nossos índices de uma vez por dia e não se preocupe com atualizá-los.

Como exemplo, esta funcionalidade de pesquisa é alimentado por Lucene.Net.

Respondeu 08/08/2008 em 16:34
fonte usuário

votos
0

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

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

Respondeu 06/08/2008 em 15:00
fonte usuário

votos
-1

Usando o caractere '%' Eu procurei nosso banco de dados usando algo parecido com o seguinte:

SELECT name FROM TblNames WHERE name LIKE '%overflow'

Usando este formulário ou consulta pode ser lento às vezes, mas nós só usá-lo para a busca manual ocasional.

Respondeu 06/08/2008 em 15:24
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more