2008-09-16 16 views
5

Estamos utilizando SQL Server 2005 en un proyecto. Los usuarios del sistema tienen la capacidad de buscar algunos objetos mediante el uso de "palabras clave". La forma en que implementamos esto es creando un catálogo de texto completo para las columnas significativas en cada tabla que puede contener estas 'palabras clave' y luego usando CONTAINS para buscar las palabras clave que el usuario ingresa en el cuadro de búsqueda en ese índice.Crear números pequeños del índice SQL Server

Entonces, por ejemplo, supongamos que tiene el objeto Película y desea que el usuario busque palabras clave en el título y en el cuerpo del artículo, luego indexaríamos tanto la columna Título como la Ploteo, y luego hacer algo como:

SELECT * FROM Movies WHERE CONTAINS(Title, keywords) OR CONTAINS(Plot, keywords) 

(en realidad es un poco más avanzado que eso, pero nada terriblemente complejo)

Algunos usuarios están agregando números para su búsqueda, por lo que, por ejemplo, quieren encontrar 'Terminator 2' . El problema aquí es que, por lo que yo sé, por SQL Server predeterminada no palabras cortas de índice, haciendo así una búsqueda de la siguiente manera:

SELECT * FROM Movies WHERE CONTAINS(Title, '"Terminator 2"') 

es en realidad equivalente a hacer esto:

SELECT * FROM Movies WHERE CONTAINS(Title, '"Terminator"') <-- notice the missing '2' 

y estamos obteniendo una plétora de resultados espurios.

¿Hay alguna manera de obligar a SQL Server a indexar palabras pequeñas? Preferiblemente, preferiría indexar solo números como 1, 2, 21, etc. No sé dónde definir los criterios de indexación, o incluso si es posible ser tan específico como eso.


Bueno, lo hice, elimina el "ruido" Palabras de la lista, y ahora el comportamiento es un poco diferente, pero todavía no es lo que se espera.

Una búsqueda no será para "Terminator 2" (estoy inventando esto, mi empleador podría no estar muy contento si divulgo lo que estamos haciendo ... de todos modos, los términos son un poco diferentes, pero el principio igual), no obtengo nada, pero sé que hay objetos que contienen las dos palabras.

¿Tal vez estoy haciendo algo mal? Eliminé todos los números 1 ... 9 de mi configuración de ruido para ENG, ENU y NEU (neutral), regeneré los índices e intenté la búsqueda.

Respuesta

2

Estas "palabras pequeñas" se consideran "palabras irrelevantes" por el índice de texto completo. Puede personalizar la lista de palabras irrelevantes. Este blog post proporciona más detalles. Necesita volver a llenar su índice de texto completo cuando cambie el archivo de palabras irrelevantes.

0

Conocí el archivo de palabras irrelevantes, pero no soy el motivo por el que su ejemplo de "Terminator 2" todavía le está dando problemas. Es posible que desee intentar preguntar esto en el MSDN Database Engine forum donde las personas que se especializan en este tipo de cosas pasan el rato.

0

Puede combinar contiene (o CONTAINSTABLE) con sencillo en el que las condiciones:

SELECT * FROM Películas WHERE contiene (título, 'Terminator 2 "') y en el título como '% Terminator 2%'

Mientras que CONTAINS encuentra todo Terminator, donde eliminará 'Terminator 1'.

Por supuesto, el motor es lo suficientemente inteligente como para comenzar con la condición NO CONTIENE el mismo.

Cuestiones relacionadas