Búsqueda Avanzada en SharePoint 2007:
utilización de columnas personalizadas
Hace poco tuve que incluir la opción de búsqueda avanzada en un Site de SharePoint.
Para aquéllos que nunca se hayan enfrentado a este problema (como era mi caso), encontré una buena introducción en este post, que describe de forma muy sencilla los primeros pasos que debemos dar. Por tanto no repetiré esta información aquí.
Sin embargo, la cosa no resulta tan sencilla cuando queremos hacer que en esas búsquedas el usuario pueda filtrar por propiedades que hemos incluido en listas individuales, y que por tanto no pertenecen al conjunto de propiedades por defecto de SharePoint.
En este post pretendo describir no sólo los pasos que deberíamos seguir para alcanzar este objetivo, sino algunos problemas que he encontrado al respecto.
Filtro por columnas personalizadas
Supongamos que tenemos una lista llamada “Registro” con una columna llamada “Nombre de entrada” de tipo Texto, y queremos poder filtrar por esa columna en la búsqueda avanzada.
Vamos a ver los pasos que habría que seguir:
1. Crear una Propiedad Administrada que mapee esa columna, a la que llamaremos “NombreEntrada”. En este artículo se puede encontrar información detallada acerca de cómo crear propiedades administradas.
2. Crear un ámbito de búsqueda llamado “Registros Entrada Salida”, que contenga sólo los elementos que se creen dentro de nuestra lista “Registro”. Este ámbito se utilizará para filtrar únicamente los resultados de esta lista, como se verá más adelante. Recordar que estamos definiendo la búsqueda avanzada a nivel de todo el SiteCollection, por tanto si queremos refinar nuestra búsqueda para que sólo se busque en los elementos de esta lista, nos hará falta un ámbito de búsqueda.
3. Ir a la página de “Búsqueda Avanzada” que definimos al crear nuestro sitio de búsqueda (ejemplo: http://mysite.es/Busquedas/Avanzada.aspx)
4. Editar la página y el “Cuadro de búsqueda avanzada”

5. Desplegar el apartado de “Propiedades”, situar el cursor en el cuadro de texto de “Propiedades”, y pulsar el botón que nos aparecerá junto a dicho cuadro de texto.

6. Este botón despliega un cuadro de texto que contiene código xml. Este código xml es el que configura los filtros de la búsqueda avanzada, así como los tipos de elemento que podemos buscar. Por tanto conviene almacenar una copia de este xml debidamente formateado en un fichero aparte, por si queremos hacer modificaciones posteriores.
Las dos secciones principales de este xml son:
- PropertyDefs: definición de las propiedades que vamos a utilizar en cualquier filtro.
- ResultTypes: definición de los distintos tipos de resultado por los que vamos a buscar (ejemplo: documentos Word, documentos Excel, cualquier elemento…).
7. Añadir a la sección “PropertyDefs” un nodo con esta forma:
<PropertyDef Name="NombreEntrada" DataType="text" DisplayName="Nombre de entrada"/>
donde:
o Name = nombre de la propiedad administrada
o DataType = tipo de datos de la propiedad administrada
o DisplayName = nombre que se mostrará si queremos incluir esta propiedad en el filtro de búsqueda
8. Añadir un nodo “ResultType” para mostrar únicamente los elementos de esta lista. Este nodo tendrá un aspecto similar a este:
<ResultType DisplayName="Registros de Entrada y Salida" Name="Registros">
<Query>"scope"='Registros Entrada Salida' </Query>
<PropertyRef Name="Title" DisplayName="Procedencia" />
<PropertyRef Name="NumRegistro" />
<PropertyRef Name="NombreEntrada" />
<PropertyRef Name="FechaEntrada" />
<PropertyRef Name="Description" />
<PropertyRef Name="FileName" />
<PropertyRef Name="Size" />
<PropertyRef Name="Path" />
<PropertyRef Name="Created" />
<PropertyRef Name="Write" />
<PropertyRef Name="CreatedBy" />
<PropertyRef Name="ModifiedBy" />
</ResultType>
Como podemos ver, hay dos elementos fundamentales que tenemos que añadir:
- Definición del nodo “Query”. El texto que añadamos dentro de este nodo será incluido en la cláusula “WHERE” de la consulta que se lance contra el servicio de búsqueda de SharePoint. En este caso estamos filtrando por el ámbito que nos definimos para buscar únicamente los elementos de nuestra lista (ver paso 2).
- Inclusión del nodo “PropertyRef” que referencia a la propiedad Administrada que definimos en el nodo “PropertyRefs”
Al incluir este nodo, ya podremos utilizar el filtro como deseemos:

Podéis encontrar más información al respecto en este artículo:
http://msdn.microsoft.com/en-us/library/bb428648.aspx
Problemas con búsquedas en campos numéricos
Si habéis seguido estos pasos pero con una columna numérica en lugar de una de tipo texto, posiblemente habréis pensado: “este tío no tiene ni idea, ¡a mí no me funciona nada de eso!”. Bueno, tened un poco de paciencia, que todo llega…
Efectivamente las búsquedas con campos numéricos creados desde la interfaz de SharePoint crean muchos problemas. Vamos a ver algunos de ellos y sus correspondientes soluciones:
1. Mi columna es un campo numérico sin decimales, pero cuando voy a crear mi propiedad administrada de tipo “Entero”, no me aparece en las propiedades rastreadas
Muchos de vosotros podréis pensar que si creáis una columna de tipo “Número” desde la interfaz de SharePoint y decís que el campo tiene 0 decimales, la columna será de tipo “Entero”. ¡Qué lógica más retorcida seguís!
SharePoint (pensando en nuestra propia seguridad, claro) no nos permite crear columnas de tipo “Entero” desde su interfaz. No importa que digamos que la columna tiene 0 decimales, el sistema seguirá definiéndola de tipo decimal.
Por tanto, cuando vayamos a definir la propiedad administrada, debemos asegurarnos de que buscamos entre las propiedades rastreadas de tipo Decimal. En mi caso, la columna se llama “NumRegistro”.

2. La búsqueda simple no encuentra registros cuando intento filtrar por mi columna numérica
Otro error super divertido de SharePoint, que sospecho que está relacionado con el bug que os comento en el siguiente apartado.
Vale, ya he creado mi propiedad administrada que mapea a la columna “NumRegistro” de mi lista “Registro”. No importa los crawls (rastreos) que haga: incrementales, completos, etc. Cuando voy a buscar por un número de registro, SharePoint no encuentra nada.
La única solución que yo he encontrado me da hasta un poco de vergüenza contarla, pero visto lo visto… Yo lo que hice fue crear una columna calculada que “redondee” el campo NumRegistro para que el sistema lo busque como un Entero.
Veamos un ejemplo. Estos son los elementos de mi lista actualmente:

Si intento buscar en la búsqueda simple y pongo “19”, sucede lo siguiente:


Sin embargo, vamos a crear una columna calculada que contenga el mismo valor que “NumRegistro”, y a la que llamaremos “NumRegistroCalc”:

Observar que lo único que contiene la fórmula de la nueva columna es “=INT([NumRegistro])”, con lo que en realidad estamos duplicando información porque NumRegistro no tiene decimales…
Sin embargo, ¿qué ocurre después de añadir uno o dos elementos (para que el sistema “detecte” la nueva columna”) y de hacer un crawl completo? Lanzamos la misma búsqueda y… ¡tataaaan! Ahora sí que encuentra nuestro registro.

Sí, ya sé que no es una forma muy ortodoxa de hacer que funcionen las búsquedas sobre números, pero al menos funciona no? J.
3. Cuando filtro por mi campo numérico en la búsqueda avanzada, las búsquedas producen un error.
Bueno. Ya tenemos todo configurado correctamente, nuestras búsquedas sobre columnas personalizadas parece que funcionan, estamos haciendo pruebas y nos encontramos con esta desagradable sorpresa:


Efectivamente, cuando hacemos una búsqueda sobre nuestro campo numérico (“Número de Registro”) con la condición “es igual a”, el servicio produce un error.
Pues bien, esta vez no os puedo dar una solución, sencillamente porque a fecha de hoy no existe. Es un bug identificado por Microsoft , y lo único que os puedo recomendar son algunos hotfix que Microsoft ha publicado. Yo aún no los he probado, ya que decidimos esperar a la supuestamente inminente salida del 2007 Microsoft Office Service Pack 2, que debería incluir ya estos hotfixes y por tanto debería solucionar este error.
Ahí van algunos links relacionados:
http://support.microsoft.com/kb/956057/
http://support.microsoft.com/kb/956056/
http://support.microsoft.com/kb/957022/en-us
Probablemente, si este bug se soluciona, no sea necesario realizar las operaciones que hemos descrito en el punto 2, porque la búsqueda numérica funcione correctamente, pero esto a día de hoy no puedo asegurarlo…
¡Espero que esto os haya ahorrado algún que otro quebradero de cabeza!