Install-Package SoftCircuits.FullTextSearchQuery
FullTextSearchQuery é uma biblioteca de classes .NET que converte um termo de pesquisa fácil de usar em uma consulta válida do Microsoft SQL Server de texto em texto completo. O código tenta detectar e lidar com todos os casos em que a consulta faria com que o SQL Server gerasse um erro.
O Microsoft SQL Server fornece um poderoso recurso de pesquisa de texto completo. No entanto, a sintaxe é bastante enigmática, especialmente para não programadores. Além disso, existem muitas condições que podem fazer com que o SQL Server vomite um erro se as coisas não estiverem exatamente corretas.
FullTextSearchQuery converte um termo de pesquisa do tipo utilizado pelo Google na condição de consulta SQL de texto completo correspondente. Seu objetivo é nunca lançar exceções sobre informações mal formadas. Simplesmente constrói a melhor consulta válida que pode a partir da entrada.
A lista a seguir mostra como as várias entradas são transformadas.
| Entrada | Saída | Descrição |
|---|---|---|
| abc | FORMSOF(INFLECTIONAL, abc) | Encontre formas flexíveis de ABC. |
| ~ abc | FORMSOF(THESAURUS, abc) | Encontre variações de sinônimo de ABC. |
| "abc" | "abc" | Encontre o termo exato ABC. |
| +abc | "abc" | Encontre o termo exato ABC. |
| "ABC" perto de "def" | "abc" NEAR "def" | Encontre o termo exato ABC próximo ao termo exato def. |
| abc* | "abc*" | Encontra palavras que começam com o ABC. |
| -ABC def | FORMSOF(INFLECTIONAL, def) AND NOT FORMSOF(INFLECTIONAL, abc) | Encontre formas flexionadas de def, mas não formas flexionadas de ABC. |
| ABC def | FORMSOF(INFLECTIONAL, abc) AND FORMSOF(INFLECTIONAL, def) | Encontre formas flexíveis de ABC e def. |
| ABC ou def | FORMSOF(INFLECTIONAL, abc) OR FORMSOF(INFLECTIONAL, def) | Encontre formas flexionadas de ABC ou def. |
| < +abc +def> | "abc" NEAR "def" | Encontre o termo exato ABC próximo ao termo exato def. |
| ABC e (def ou ghi) | FORMSOF(INFLECTIONAL, abc) AND (FORMSOF(INFLECTIONAL, def) OR FORMSOF(INFLECTIONAL, ghi)) | Encontre formas flexíveis de ABC e def ou ghi. |
Mesmo após uma consulta sintaticamente correta, o SQL Server ainda pode gerar um erro para algumas consultas. Por exemplo, na tabela acima, você pode ver que o OPUT para -abc def troca as duas subexpressões. Isso ocorre porque NOT FORMSOF(INFLECTIONAL, abc) AND FORMSOF(INFLECTIONAL, def) causarão um erro. O SQL Server não gosta do NOT no início. Neste exemplo, o FullTextSearchQuery trocará as duas subexpressões (em ambos os lados de AND ).
Após a construção de uma consulta, o FullTextSearchQuery verificará para esta e várias outras condições de erro e fará as correções necessárias. A tabela a seguir descreve essas condições.
| Prazo | Ação tomada |
|---|---|
| Não termo1 e termo2 | Subexpressões trocadas. |
| Não termo1 | Expressão descartada. |
| Não termo1 e não termo2 | Expressão descartada se o nó for agrupado (entre parênteses) ou for o nó raiz; Caso contrário, o nó pai pode conter outra subexpressão que tornará este válido. |
| termo1 ou não termo2 | Expressão descartada. |
| termo1 próximo ao não termo2 | Quase conjunção alterada para e. |
FullTextSearchQuery converte todas as conjunções próximas e quando a subexpressão não é um interno Node com o formulário de TermForms.literal.
Use o método Transform() para converter uma expressão de pesquisa em uma condição de pesquisa de texto completo do SQL Server válido. Este método pega uma consulta de pesquisa fácil de usar e a converte em uma condição de pesquisa de texto completo formado corretamente que pode ser transmitido para as funções do SQL Server CONTAINS ou CONTAINSTABLE . Se a consulta contiver termos inválidos, o código fará o possível para retornar uma condição de pesquisa válida. Se nenhum termos válidos foi encontrado, esse método retornará uma string vazia.
// Pass true to add the standard stop words
FtsQuery ftsQuery = new FtsQuery ( true ) ;
string searchTerm = ftsQuery . Transform ( text ) ; No exemplo de consulta SQL a seguir, @SearchTerm é uma referência à sequência retornada de Transform() .
SELECT select_list
FROM table AS FT_TBL INNER JOIN
CONTAINSTABLE(table, column, @SearchTerm) AS KEY_TBL
ON FT_TBL . unique_key_column = KEY_TBL.[KEY];Uma coisa a estar ciente é o manuseio de palavras de parada pelo SQL Server. Palavras de parada são palavras como a e e e o . Essas palavras não estão incluídas no índice de texto completo. O SQL Server não indexa essas palavras porque elas são muito comuns e não aumentam a qualidade da pesquisa. Como essas palavras não são indexadas, o SQL Server nunca encontrará uma correspondência para essas palavras. O resultado é que uma busca por uma palavra de parada não retornará resultados, mesmo que essa palavra parada possa aparecer em artigos!
A melhor maneira de lidar com isso parece ser excluir essas palavras da consulta SQL. A pesquisa fácil de texto completa permite que você faça isso adicionando palavras de parada à propriedade de coleta de palavras StopWords . As palavras de parada não serão incluídas na consulta resultante, a menos que sejam citadas, impedindo que as palavras de parada na consulta bloqueem todos os resultados.
A maneira mais fácil de adicionar uma lista padrão de palavras de parada à coleção StopWords é passar true ao construtor FtsQuery . (Para ver quais palavras foram adicionadas, você pode simplesmente inspecionar a coleção StopWords .) Você pode modificar a coleção StopWords a qualquer momento, conforme necessário.
Como alternativa, o SQL Server oferece uma opção para impedir o problema descrito acima. A opção de palavras de ruído de transformação pode ser usada para permitir que o SQL Server retorne correspondências, mesmo quando a consulta contém uma palavra de parada (Word de ruído). Defina esta opção como 1 para ativar a transformação de palavras de ruído. Consulte a opção Configuração do servidor de ruído de ruído para obter mais informações.
A consulta a seguir pode ser usada para obter as palavras de parada do sistema de um banco de dados do SQL Server.
SELECT ssw . stopword , slg . name
FROM sys . fulltext_system_stopwords ssw
JOIN sys . fulltext_languages slg
ON slg . lcid = ssw . language_id
WHERE slg . lcid = 1033Para obter mais informações e uma discussão sobre o código, consulte meu artigo fácil de busca de texto completo.