Install-Package SoftCircuits.FullTextSearchQuery
FullTextSearchQuery es una biblioteca de clases .NET que convierte un término de búsqueda fácil de usar en una consulta válida de búsqueda de texto completo de Microsoft SQL Server. El código intenta detectar y manejar todos los casos en los que la consulta haría que SQL Server genere un error.
Microsoft SQL Server proporciona una potente función de búsqueda de texto completo. Sin embargo, la sintaxis es bastante críptica, especialmente para los no programadores. Además, hay muchas condiciones que pueden hacer que SQL Server arroje un error si las cosas no son exactamente correctas.
FullTextSearchQuery convierte un término de búsqueda de Google fácil de usar en la condición de consulta SQL de búsqueda de texto completo correspondiente. Su objetivo es nunca arrojar excepciones a la entrada mal formada. Simplemente construye la mejor consulta válida que puede desde la entrada.
La siguiente lista muestra cómo se transforman varias entradas.
| Aporte | Producción | Descripción |
|---|---|---|
| abecedario | FORMSOF(INFLECTIONAL, abc) | Encuentra formas de inflexión de ABC. |
| ~ ABC | FORMSOF(THESAURUS, abc) | Encuentra variaciones de tesauro de ABC. |
| "abecedario" | "abc" | Encuentre el término exacto ABC. |
| +ABC | "abc" | Encuentre el término exacto ABC. |
| "ABC" cerca de "def" | "abc" NEAR "def" | Encuentre el término exacto ABC cerca de la def. |
| abecedario* | "abc*" | Encuentra palabras que comienzan con ABC. |
| -ABC DEF | FORMSOF(INFLECTIONAL, def) AND NOT FORMSOF(INFLECTIONAL, abc) | Encuentre formas de inflexión de DEF pero no formas de inflexión de ABC. |
| ABC DEF | FORMSOF(INFLECTIONAL, abc) AND FORMSOF(INFLECTIONAL, def) | Encuentre formas de inflexión de ABC y def. |
| ABC o DEF | FORMSOF(INFLECTIONAL, abc) OR FORMSOF(INFLECTIONAL, def) | Encuentre formas de inflexión de ABC o def. |
| < +ABC +DEF> | "abc" NEAR "def" | Encuentre el término exacto ABC cerca de la def. |
| ABC y (def o ghi) | FORMSOF(INFLECTIONAL, abc) AND (FORMSOF(INFLECTIONAL, def) OR FORMSOF(INFLECTIONAL, ghi)) | Encuentre formas de inflexión de ABC y DEF o GHI. |
Incluso después de que se haya generado una consulta sintácticamente correcta, SQL Server aún puede generar un error para algunas consultas. Por ejemplo, en la tabla anterior, puede ver que la OUPT para -abc def cambia las dos subexpresiones. Esto se debe a que NOT FORMSOF(INFLECTIONAL, abc) AND FORMSOF(INFLECTIONAL, def) causará un error. SQL Server no le gusta el NOT al principio. En este ejemplo, FullTextSearchQuery intercambiará las dos subexpresiones (a cada lado de AND ).
Después de construir una consulta, FullTextSearchQuery verificará esta y varias otras condiciones de error y hará las correcciones según sea necesario. La siguiente tabla describe estas condiciones.
| Término | Medidas tomadas |
|---|---|
| No término1 y término2 | Subexpresiones intercambiadas. |
| No término1 | Expresión descartada. |
| No término1 y no término2 | Expresión descartada si el nodo se agrupa (parentizado) o es el nodo raíz; De lo contrario, el nodo principal puede contener otra subexpresión que hará que este sea válido. |
| término1 o no término2 | Expresión descartada. |
| término1 cerca de no término2 | Casi conjunción cambiado a y. |
FullTextSearchQuery convierte todas las conjunciones cercanas a y cuando cualquiera de la subexpresión no es unnode interno con el formulario Termforms.literal.
Use el método Transform() para convertir una expresión de búsqueda en una condición de búsqueda de texto completo de SQL Server válido. Este método toma una consulta de búsqueda fácil de usar y la convierte en una condición de búsqueda de texto completo correctamente formado que se puede pasar a las funciones CONTAINS o CONTAINSTABLE de SQL Server. Si la consulta contiene términos no válidos, el código hará lo que pueda para devolver una condición de búsqueda válida. Si no se encontraron términos válidos, este método devuelve una cadena vacía.
// Pass true to add the standard stop words
FtsQuery ftsQuery = new FtsQuery ( true ) ;
string searchTerm = ftsQuery . Transform ( text ) ; En el siguiente ejemplo de consulta SQL, @SearchTerm es una referencia a la cadena devuelta desde 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];Una cosa a tener en cuenta es el manejo de palabras de parada por parte de SQL Server. Detener palabras son palabras como a , y , y el . Estas palabras no están incluidas en el índice de texto completo. SQL Server no indexa estas palabras porque son muy comunes y no se suman a la calidad de la búsqueda. Dado que estas palabras no están indexadas, SQL Server nunca encontrará una coincidencia para estas palabras. El resultado es que una búsqueda de una palabra de parada no devolverá los resultados, ¡aunque esa palabra de parada puede aparecer en un artículo!
La mejor manera de manejar esto parece ser excluir estas palabras de la consulta SQL. Easy Full Text Search le permite hacer esto agregando palabras de detención a la propiedad de la recopilación de palabras StopWords . Las palabras de parada no se incluirán en la consulta resultante a menos que se citen, evitando así que las palabras de parada en la consulta bloqueen todos los resultados.
La forma más fácil de agregar una lista estándar de palabras de parada a la colección de StopWords es pasar true al constructor FtsQuery . (Para ver qué palabras se agregaron, simplemente puede inspeccionar la colección de StopWords ). Puede modificar la colección de StopWords en cualquier momento, según sea necesario.
Alternativamente, SQL Server proporciona una opción para prevenir el problema descrito anteriormente. La opción de palabras de ruido de transformación se puede usar para habilitar SQL Server para devolver las coincidencias incluso cuando la consulta contiene una palabra de parada (palabra de ruido). Establezca esta opción en 1 para habilitar la transformación de palabras de ruido. Consulte la opción de configuración del servidor de palabras de transformación de ruido para obtener más información.
La siguiente consulta se puede usar para obtener las palabras de detener el sistema de una base de datos de 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 obtener más información y una discusión del código, consulte mi artículo consultas fáciles de búsqueda de texto completo.