Hace poco estaba trabajando en un proyecto cuando recibo la llamada de un cliente en la que me comenta que la búsqueda en los sitios de SharePoint no está arrojando ningún resultado, sin importar lo que se busque siempre indica que no hay resultados que mostrar. Detengo mi trabajo en el proyecto y me pongo a investigar un poco ya que imaginaba que había algún problema con el servicio de búsqueda. Para mi sorpresa, el servicio estaba funcionando perfectamente, sólo que no hay sino poco más de 200 documentos indizados de más de 125 mil documentos (que era el número de documentos de la última vez que había visto los datos del servicio).
Bien, la pregunta del millón ¿Dónde están los otros documentos? La respuesta pudiera parecer fácil de encontrar pero el por qué, no tanto. Al revisar los registros de rastreo (crawling) me doy cuenta de que una cantidad importante de documentos habían sido removidos del índice por el recolector (gatherer) dado que su objeto padre había sido eliminado o «Deleted by the gatherer (This item was deleted because its parent was deleted.)» en inglés.
Ya tenemos el qué pasó, ahora debía encontrar la causa; como podemos ver aquí (en inglés) existen muchas posibles causas para el problema, sin embargo, la causa real en esta ocasión no se encuentra en la lista pero si se encuentra siguiendo las sugerencias. Al revisar el registro de eventos del servidor de búsqueda encuentro varias entradas indicando un error con la validación de un certificado SSL «An operation failed because the following certificate has validation errors: … Errors: SSL policy errors have been encountered. Error code ‘0x2’..» al revisar las configuraciones de IIS observo que en uno de los servidores de la granja está incorrectamente configurado un certificado para el sitio de Servicios Web de SharePoint (había configurado un certificado cuando lo normal es que no se vea ninguno seleccionado).
Identificado el problema veamos cómo resolverlo. Para empezar debemos verificar que en efecto el certificado es incorrecto y para ello vamos a ejecutar lo siguiente en la consola de administración PowerShell de SharePoint:
Import-Module WebAdministration (Get-Item 'IIS:\SslBindings\0.0.0.0!32844') | fl IPAddress, Port, Store, Thumbprint
El resultado debe ser algo similar a esto:
IPAddress : 0.0.0.0 Port : 32844 Store : SharePoint Thumbprint : XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Nótese que el valor de Store indica «SharePoint», de no ser así entonces procedemos a ejecutar el siguiente código:
$cert = Get-ChildItem cert:\LocalMachine\SharePoint | Where-Object { $_.Subject -eq "CN=SharePoint Services, OU=SharePoint, O=Microsoft, C=US" } (Get-WebBinding -Name "SharePoint Web Services" -Protocol https).RemoveSslCertificate() (Get-WebBinding -Name "SharePoint Web Services" -Protocol https).AddSslCertificate($cert.Thumbprint, "SharePoint")
Y por supuesto luego de verificar que todos los servidores tengan el certificado adecuado procedemos a iniciar un rastreo completo (full crawl).
Espero que te sirva de ayuda.
Aaaaaaaah, y si quieres saber qué fue lo que pasó la historia es bastante simple: durante una renovación de certificados un script defectuoso cambió el certificado del sitio de servicios en un servidor de la granja SharePoint, al pasar 3 días desde el último rastreo correcto, el recolector empezó a eliminar las entradas antiguas que no se habían actualizado ya que las mismas eran inalcanzables dado que el proceso no tenía acceso a los servicios de la granja y por ende, se cerraba inesperadamente (también aparece el error en los registros).