Pregunta

Estoy tratando de reemplazar un índice basado Lucene.NET Analizador de palabras clave con un uno basado SQL Server 2008 R2.

Tengo una tabla que contiene campos indexados encargo que tengo que consulta sobre. El valor de la columna de índice (véase más adelante) es una combinación de pares de nombre / valor de los campos de índice de encargo de una serie de tipos de .NET - los valores reales se extraen de atributos en tiempo de ejecución, porque la estructura es desconocida

Tengo que ser capaz de buscar juego de pares nombre-valor, utilizando e Ys y devolver las filas en las que los partidos de la consulta.

Id          Index
====================================================================
1           [Descriptor.Type]=[5][Descriptor.Url]=[/]
2           [Descriptor.Type]=[23][Descriptor.Url]=[/test]
3           [Descriptor.Type]=[25][Descriptor.Alternative]=[hello]
4           [Descriptor.Type]=[26][Descriptor.Alternative]=[hello][Descriptor.FriendlyName]=[this is a test]

Una mirada simple consulta como esta:

select * from Indices where contains ([Index], '[Descriptor.Url]=[/]');

Esa consulta se produce el siguiente error:

Msg 7630, Level 15, State 2, Line 1
Syntax error near '[' in the full-text search condition '[Descriptor.Url]=[/]'.

Así que con eso en mente, altera los datos en la columna de la Index al uso | en lugar de [ y ]:

select * from Indices where contains ([Index], '|Descriptor.Url|=|/|');

Ahora, mientras que la consulta es válida ahora, cuando lo ejecuto todas las filas que contienen Descriptor.Url y comiencen con / son devueltos, en lugar de los registros (uno exactamente en este caso) que coincide exactamente.

Mi pregunta es, ¿cómo puedo escapar de la consulta a la cuenta para el [ y ] y asegurarse de que sólo el exacta se devuelve una fila coincidente?

Una consulta más compleja se ve un poco como esto:

select * from Indices where contains ([Index], '[Descriptor.Type]=[12] AND ([Descriptor.Url]=[/] OR [Descriptor.Url]=[/test])');

Gracias,
Kieron

¿Fue útil?

Solución

Su principal problema es en el uso de un separador de palabras SQL, y el CONTIENE sintaxis. Por defecto, separadores de palabras SQL elimina las puntuacion, y los números se normaliza, fechas, direcciones URL, direcciones de correo electrónico, y similares. También minúsculas todo, y se deriva palabras.

Por lo tanto, para su cadena de entrada:

[Descriptor.Type] = [5] [Descriptor.Url] = [/]

tendría los siguientes símbolos añadidos al índice (junto con sus posiciones)

tipo de descriptor nn5 5 descriptor url

(Nota: el nn5 es una manera de simplificar los números y las fechas dadas en diferentes formatos quering, el número original también está indexada en la misma posición)

Por lo tanto, como se puede ver, el punctutation ni siquiera se almacena en el índice de texto completo, y por lo tanto, no hay forma de consulta que se utiliza la instrucción contiene.

Así que su estado de cuenta:

select * from Indices where contains ([Index], '|Descriptor.Url|=|/|'); 

en realidad se normalizará a "url descriptor" por el generador de consultas antes de presentarlo al índice de texto completo, por lo tanto los accesos a todas las entradas que tienen "descriptor" junto a "URL", con exclusión de puntuacion.

Lo que necesita es la COMO comunicado .

Otros consejos

El uso de "|" como su delimitador hace que la consulta contiene pensar en O. Por lo que usted está consiguiendo resultados inesperados. Usted debe ser capaz de escapar de la abrazadera de este modo:

SELECT * FROM Indices WHERE 
    contains ([Index], '[[]Descriptor.Type]=[[]12]') 
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top