Búsqueda y EWS en Exchange
Obtenga información sobre cómo buscar elementos en Exchange mediante la API administrada de EWS o EWS.
¿Hace a esto les resulta familiar? Por fin está iniciando ese proyecto que lleva semanas posponiendo y necesita información sobre el proyecto que el administrador le envió por correo electrónico hace semanas. Su Bandeja de entrada tiene cientos o quizás miles de mensajes en ella. ¿A qué te dedicas? ¿Se desplaza a través de su correo electrónico analizando cada asunto y remitente hasta que lo encuentre? ¿O usa la característica de búsqueda en su cliente de correo electrónico favorito para poner rápidamente cero en lo que necesita?
La búsqueda es posiblemente una característica imprescindible para cualquier cliente de correo electrónico. Pero la búsqueda se puede usar para mucho más que simplemente permitir que los usuarios busquen en su buzón. ¿Necesita la aplicación procesar citas que se encuentren dentro de períodos de tiempo específicos? Tal vez tenga que informar sobre todos los elementos de tarea con un estado específico o mover todos los contactos con un nombre de empresa específico a una carpeta diferente. La búsqueda puede ayudar con todos estos requisitos.
Conceptos básicos de búsqueda
La API administrada de EWS y EWS ofrecen dos métodos básicos para especificar una búsqueda. Puede usar un filtro de búsqueda o una cadena de consulta. El método que use depende de la intención detrás de la búsqueda.
Tabla 1. Escenarios para filtros de búsqueda y consultas de búsqueda
Si quiere... | Use un... | Notas |
---|---|---|
Limitar la búsqueda a una propiedad o un conjunto de propiedades específicos |
Filtro de búsqueda |
Los filtros de búsqueda proporcionan el mejor nivel de control sobre qué propiedades se buscan. Aunque las cadenas de consulta pueden tener como destino un conjunto limitado de propiedades mediante la sintaxis de consulta avanzada (AQS), los filtros de búsqueda pueden tener como destino cualquier propiedad. |
Creación de búsquedas con varios criterios |
Filtro de búsqueda |
Con los filtros de búsqueda, se pueden combinar varios criterios de búsqueda junto con LOS lógicos o OR, lo que permite búsquedas como "subject contains 'Meeting Notes' AND sender equals 'Sadie Daniels'". Aunque las cadenas de consulta también pueden combinar varios criterios de búsqueda, están limitadas al conjunto de propiedades compatibles con las cadenas de consulta. |
Buscar propiedades personalizadas |
Filtro de búsqueda |
Los filtros de búsqueda pueden tener como destino propiedades personalizadas. Las cadenas de consulta no buscan propiedades personalizadas. |
Realizar una búsqueda con distinción entre mayúsculas y minúsculas de las propiedades de cadena |
Filtro de búsqueda |
Las búsquedas de cadenas de consulta no distinguen mayúsculas de minúsculas. |
Controlar el modo de contención al buscar propiedades de cadena |
Filtro de búsqueda |
Las búsquedas de cadenas de consulta siempre son búsquedas de subcadenas. Si necesita buscar prefijos específicos o requerir coincidencias exactas, un filtro de búsqueda es la mejor opción. |
Búsqueda de carpetas |
Filtro de búsqueda |
EWS no admite la búsqueda de carpetas con una cadena de consulta. |
Creación de una carpeta de búsqueda |
Filtro de búsqueda |
EWS no admite la creación de carpetas de búsqueda con una cadena de consulta. |
Búsqueda en todas las propiedades usadas habitualmente |
Cadena de consulta |
Las cadenas de consulta que no contienen AQS buscarán en todas las propiedades usadas habitualmente. Por ejemplo, un valor de cadena de consulta de "Mack Chaves" devolverá todos los mensajes enviados por Mack Chaves, así como los mensajes que tengan "Mack Chaves" en el cuerpo o asunto. |
Construcción de una búsqueda basada en una entrada sencilla del usuario |
Cadena de consulta |
Una cadena de consulta es una excelente opción para permitir que un usuario final realice una búsqueda rápida escribiendo una cadena simple. Dado que una búsqueda de cadena de consulta incluye todas las propiedades usadas habitualmente, los resultados contendrán los elementos que contengan los términos de búsqueda del usuario. |
Uso de un filtro de búsqueda
Los filtros de búsqueda proporcionan una amplia gama de opciones de búsqueda y el mayor grado de control sobre cómo se realiza la búsqueda. Puede usar filtros de búsqueda para realizar búsquedas básicas de igualdad y comparación, pero también puede buscar en el contenido de las propiedades de cadena o realizar comparaciones de máscara de bits.
Por ejemplo, puede buscar el contenido del asunto de los elementos mediante la clase SearchFilter.ContainsSubstring en la API administrada de EWS. En este ejemplo, se crea un filtro de búsqueda para buscar en el asunto la subcadena "notas de reunión", omitiendo mayúsculas y minúsculas.
SearchFilter.ContainsSubstring subjectFilter = new SearchFilter.ContainsSubstring(ItemSchema.Subject,
"meeting notes", ContainmentMode.Substring, ComparisonMode.IgnoreCase);
También puede buscar en propiedades personalizadas. En este ejemplo, se busca en la propiedad personalizada ItemIndex valores mayores que 3.
Guid MyAppGuid = new Guid("{AA3DF801-4FC7-401F-BBC1-7C93D6498C2E}");
ExtendedPropertyDefinition customPropDefinition =
new ExtendedPropertyDefinition(MyAppGuid, "ItemIndex", MapiPropertyType.Integer);
SearchFilter.IsGreaterThan customPropFilter =
new SearchFilter.IsGreaterThan(customPropDefinition, 3);
También puede combinar varios filtros de búsqueda para crear búsquedas más complejas. Por ejemplo, puede combinar los dos filtros anteriores con un AND lógico mediante la clase SearchFilter.SearchFilterCollection .
SearchFilter.SearchFilterCollection compoundFilter =
new SearchFilter.SearchFilterCollection(LogicalOperator.And, subjectFilter, customPropFilter);
Uso de una cadena de consulta
Las cadenas de consulta proporcionan un enfoque diferente para buscar. Tiene menos control sobre los campos que se buscan y cómo se realiza la búsqueda cuando se usa una búsqueda de cadena de consulta. ¡No es que eso sea malo! En algunos casos, es posible que desee convertir una red más amplia, por así decirlo.
Por ejemplo, puede buscar "notas de reunión" mediante el método de API administrada de EWS ExchangeService.FindItems .
FindItemsResults<Item> results = service.FindItems(folder, "meeting notes", view);
Si compara los resultados de esta búsqueda con los resultados del ejemplo de búsqueda SearchFilter.ContainsSubstring anteriormente, esta búsqueda contendrá más resultados. La búsqueda de filtro de búsqueda devolverá solo los elementos que tengan "notas de reunión" en el asunto, mientras que esta búsqueda devolverá elementos que tengan "notas de reunión" en el asunto, el cuerpo y otros campos.
Echemos un vistazo a cómo puede refinar la cadena de consulta para acercarse a los resultados que ve en el filtro de búsqueda. Con AQS, puede limitar la búsqueda al asunto.
FindItemsResults<Item> results = service.FindItems(folder, "subject:meeting notes", view);
Esto está más cerca, pero los resultados todavía no son los mismos. Cuando se usa una cadena de consulta con varias palabras, se obtienen coincidencias incluso si las palabras no están en el orden especificado, o incluso si no están adyacentes entre sí. Con la cadena de consulta "subject:meeting notes", obtendrá coincidencias para "notas de reunión", "notas de la reunión", etc. Para refinar aún más, puede ajustar los términos de búsqueda entre comillas dobles para indicar que solo quiere esa frase.
FindItemsResults<Item> results = service.FindItems(folder, "subject:\"meeting notes\"", view);
Solicitud de propiedades específicas en los resultados de la búsqueda
De forma predeterminada, los resultados de la búsqueda contendrá todas las propiedades de los elementos que coincidan con la búsqueda. En algunos casos, esto podría ser lo que quiere, pero en la mayoría de los casos la aplicación solo requiere un conjunto discreto de propiedades. En este caso, debe limitar el conjunto de propiedades que se devuelven solo a las propiedades que necesita la aplicación. En el ejemplo siguiente, la clase ItemView se usa para limitar las propiedades devueltas al asunto, la fecha y hora recibidas y el identificador de los elementos.
ItemView view = new ItemView(10);
// Creating a new PropertySet with this constructor includes
// ItemSchema.Id.
view.PropertySet = new PropertySet(ItemSchema.Subject, ItemSchema.DateTimeReceived);
Control de la profundidad de búsqueda
Al establecer el recorrido en la vista, se controla la profundidad y el ámbito de la búsqueda.
Tabla 2. Búsqueda de valores transversales
Valor de recorrido | Se aplica a | Descripción |
---|---|---|
Superficial |
Elementos y carpetas |
Las búsquedas superficiales se limitan a los elementos secundarios directos de la carpeta en la que se busca. |
Profundo |
Elementos (solo con carpetas de búsqueda) y Carpetas |
Búsquedas profundas busca de forma recursiva la carpeta en la que se busca y las subcarpetas. |
Asociados |
Elementos |
Las búsquedas asociadas solo incluyen elementos asociados de la carpeta en la que se busca. Los elementos asociados son elementos ocultos dentro de la carpeta. |
SoftDeleted |
Elementos y carpetas |
Este tipo de recorrido está en desuso. Las búsquedas de SoftDeleted solo incluyen elementos que están en el contenedor de memoria. El volcado de memoria se ha reemplazado por la carpeta Elementos recuperables de Exchange Online, Exchange Online como parte de Office 365 y versiones de Exchange a partir de Exchange 2010. |
Administración de resultados de búsqueda
La API administrada de EWS y EWS también permiten cambiar la forma en que se devuelven los resultados de la búsqueda. Puede usar vistas para especificar qué propiedades se incluyen en los resultados, ordenar los resultados y paginar los resultados para obtener solo un número establecido de resultados por respuesta. También puede agrupar los resultados por valores de campo específicos y controlar la profundidad de una búsqueda especificando un tipo de recorrido. Por último, puede usar carpetas de búsqueda para crear búsquedas persistentes que se actualizan dinámicamente a medida que llegan nuevos elementos.
Ordenación
Puede obtener que el servidor devuelva resultados ordenados, lo que puede facilitar la visualización o el procesamiento de elementos en orden. En este ejemplo, los resultados se ordenarán por la fecha y hora recibidas, siendo primero los elementos más recientes.
view.OrderBy.Add(ItemSchema.DateTimeReceived, SortDirection.Descending);
Paginación
Al enviar una solicitud de búsqueda mediante la API administrada de EWS o EWS, se especifica un tamaño de vista, que controla el número máximo de elementos devueltos. Sin embargo, el número de elementos del servidor que coinciden con la búsqueda puede ser mayor que el tamaño de la vista. En este caso, el servidor indica que hay más elementos disponibles. Puede usar la paginación para repetir la búsqueda y obtener el siguiente conjunto de resultados.
Por ejemplo, puede enviar una solicitud de búsqueda con un tamaño de vista de 10. Puede haber 15 elementos en el servidor que coincidan con la búsqueda, pero solo obtendrá los primeros 10, junto con un indicador ( FindItemsResults<TItem>. Propiedad MoreAvailable si usa la API administrada de EWS) que hay más resultados en el servidor. A continuación, puede enviar la misma búsqueda con un desplazamiento de 10 para solicitar los siguientes 10 elementos que coincidan con la búsqueda. El servidor devolverá los cinco elementos restantes.
Figura 1. Ejemplo de búsqueda paginada
Agrupación
Exchange permite agrupar los resultados de búsqueda por un campo específico. Esto puede ayudar a dividir los resultados de la búsqueda en conjuntos más administrables. Por ejemplo, puede buscar "notas de reunión" y agrupar los resultados por remitente. Como se muestra en la ilustración siguiente, los elementos devueltos se separarán en grupos, con todos los elementos que coincidan con los criterios del mismo remitente en un grupo, todos los elementos coincidentes de otro remitente de otro grupo, etc.
Figura 2. Resultados de búsqueda agrupados por remitente
Carpetas de búsqueda
Con una búsqueda normal, se ejecuta la búsqueda, los resultados se devuelven a la aplicación para su procesamiento y la búsqueda deja de existir. Las carpetas de búsqueda proporcionan una manera de hacer que una búsqueda sea persistente. Esta es una excelente opción para las búsquedas que sabe que querrá ejecutar varias veces. En lugar de ejecutar la misma búsqueda repetidamente, lo que hace que el servidor evalúe la búsqueda desde cero cada vez, una carpeta de búsqueda activa siempre una búsqueda, lo que permite al servidor actualizar el conjunto de resultados existente a medida que se agregan o quitan elementos del ámbito de búsqueda. Las carpetas de búsqueda actúan como carpetas normales, ya que aparecen como carpetas que tienen elementos en ellas. La diferencia es que los únicos elementos contenidos en la carpeta son aquellos que coinciden con los criterios de búsqueda asociados a la carpeta. Una vez creada una carpeta de búsqueda, la aplicación puede obtener resultados actualizados de la búsqueda simplemente comprobando el contenido de la carpeta.
La creación de una carpeta de búsqueda es sencilla cuando se ha maestro la creación de filtros de búsqueda. En el ejemplo siguiente, se crea una carpeta de búsqueda para mostrar todo el correo electrónico con un asunto que contiene "notas de la reunión".
static void CreateSearchFolder(ExchangeService service)
{
SearchFilter.ContainsSubstring subjectFilter = new SearchFilter.ContainsSubstring(ItemSchema.Subject,
"meeting notes", ContainmentMode.Substring, ComparisonMode.IgnoreCase);
SearchFolder searchFolder = new SearchFolder(service);
searchFolder.DisplayName = "Meeting Notes";
searchFolder.SearchParameters.RootFolderIds.Add(WellKnownFolderName.Inbox);
searchFolder.SearchParameters.Traversal = SearchFolderTraversal.Deep;
searchFolder.SearchParameters.SearchFilter = subjectFilter;
searchFolder.Save(WellKnownFolderName.SearchFolders);
}