Buscar datos con Azure Search y Xamarin.Forms
Azure Search es un servicio en la nube que proporciona funcionalidades de indexación y consulta para los datos cargados. Esto elimina los requisitos de infraestructura y las complejidades del algoritmo de búsqueda tradicionalmente asociados a la implementación de la funcionalidad de búsqueda en una aplicación. En este artículo se muestra cómo usar la biblioteca Microsoft Azure Search para integrar Azure Search en una Xamarin.Forms aplicación.
Información general
Los datos se almacenan en Azure Search como índices y documentos. Un índice es un almacén de datos que azure servicio Search buscar y es conceptualmente similar a una tabla de base de datos. Un documento es una sola unidad de datos que se pueden buscar en un índice y es conceptualmente similar a una fila de base de datos. Al cargar documentos y enviar consultas de búsqueda a Azure Search, las solicitudes se realizan a un índice específico del servicio de búsqueda.
Cada solicitud realizada a Azure Search debe incluir el nombre del servicio y una clave de API. Hay dos tipos de clave de API:
- Las claves de administración conceden derechos completos a todas las operaciones. Esto incluye la administración del servicio, la creación y eliminación de índices y orígenes de datos.
- Las claves de consulta conceden acceso de solo lectura a índices y documentos, y las deben usar las aplicaciones que emiten solicitudes de búsqueda.
La solicitud más común a Azure Search es ejecutar una consulta. Hay dos tipos de consulta que se pueden enviar:
- Una consulta de búsqueda busca uno o varios elementos en todos los campos en los que se pueden realizar búsquedas en un índice. Las consultas de búsqueda se construyen con la sintaxis simplificada o la sintaxis de consulta de Lucene. Para más información, consulte Sintaxis de consulta simple en Azure Searchy Sintaxis de consulta de Lucene en Azure Search.
- Una consulta de filtro evalúa una expresión booleana en todos los campos filtrables de un índice. Las consultas de filtro se construyen mediante un subconjunto del lenguaje de filtro OData. Para más información, consulte Sintaxis de expresiones de OData para Azure Search.
Las consultas de búsqueda y las consultas de filtro se pueden usar por separado o juntos. Cuando se usa juntos, la consulta de filtro se aplica primero a todo el índice y, a continuación, la consulta de búsqueda se realiza en los resultados de la consulta de filtro.
Azure Search también admite la recuperación de sugerencias basadas en la entrada de búsqueda. Para obtener más información, vea Consultas de sugerencias.
Nota:
Si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.
Configurar
El proceso de integración de Azure Search en una Xamarin.Forms aplicación es el siguiente:
- Cree una instancia de Azure servicio Search. Para más información, consulte Creación de una instancia de Azure servicio Search mediante Azure Portal.
- Quite Silverlight como marco de destino de la solución Xamarin.Forms Biblioteca de clases portable (PCL). Esto se puede lograr cambiando el perfil pcl a cualquier perfil que admita el desarrollo multiplataforma, pero no admita Silverlight, como el perfil 151 o el perfil 92.
- Agregue el paquete Microsoft Azure search library NuGet al proyecto PCL de la solución.
Después de realizar estos pasos, la API Búsqueda de Microsoft Library se puede usar para administrar índices de búsqueda y orígenes de datos, cargar y administrar documentos y ejecutar consultas.
Creación de un índice de Azure Search
Se debe definir un esquema de índice que se asigna a la estructura de los datos que se buscarán. Esto puede realizarse en Azure Portal o mediante programación con la SearchServiceClient clase . Esta clase administra las conexiones a Azure Search y se puede usar para crear un índice. En el ejemplo de código siguiente se muestra cómo crear una instancia de esta clase:
var searchClient =
new SearchServiceClient(Constants.SearchServiceName, new SearchCredentials(Constants.AdminApiKey));
La sobrecarga del constructor toma un nombre de servicio de búsqueda y un objeto como argumentos, con el objeto encapsulando la clave de administración SearchServiceClientSearchCredentials para azure SearchCredentials servicio Search. SearchServiceClient La clave de administración es necesaria para crear un índice.
Nota:
Se debe SearchServiceClient usar una sola instancia en una aplicación para evitar abrir demasiadas conexiones a Azure Search.
El objeto define un Index índice, como se muestra en el ejemplo de código siguiente:
static void CreateSearchIndex()
{
var index = new Index()
{
Name = Constants.Index,
Fields = new[]
{
new Field("id", DataType.String) { IsKey = true, IsRetrievable = true },
new Field("name", DataType.String) { IsRetrievable = true, IsFilterable = true, IsSortable = true, IsSearchable = true },
new Field("location", DataType.String) { IsRetrievable = true, IsFilterable = true, IsSortable = true, IsSearchable = true },
new Field("details", DataType.String) { IsRetrievable = true, IsFilterable = true, IsSearchable = true },
new Field("imageUrl", DataType.String) { IsRetrievable = true }
},
Suggesters = new[]
{
new Suggester("nameSuggester", SuggesterSearchMode.AnalyzingInfixMatching, new[] { "name" })
}
};
searchClient.Indexes.Create(index);
}
La Index.Name propiedad debe establecerse en el nombre del índice y la Index.Fields propiedad debe establecerse en una matriz de Field objetos . Cada Field instancia especifica un nombre, un tipo y cualquier propiedad, que especifican cómo se usa el campo. Estas propiedades incluyen:
IsKey: indica si el campo es la clave del índice. Solo se debe designar un campo del índice, deDataType.Stringtipo , como campo de clave.IsFacetable: indica si es posible realizar la navegación por facetas en este campo. El valor predeterminado esfalse.IsFilterable: indica si el campo se puede usar en consultas de filtro. El valor predeterminado esfalse.IsRetrievable: indica si el campo se puede recuperar en los resultados de la búsqueda. El valor predeterminado estrue.IsSearchable: indica si el campo se incluye en las búsquedas de texto completo. El valor predeterminado esfalse.IsSortable: indica si el campo se puede usar enOrderByexpresiones. El valor predeterminado esfalse.
Nota:
Cambiar un índice después de implementarlo implica volver a generar y volver a cargar los datos.
Opcionalmente, un objeto puede especificar una propiedad , que define los campos del índice que se usarán para admitir consultas de sugerencias de búsqueda o Index autocompletar. Suggesters La Suggesters propiedad debe establecerse en una matriz de objetos que definen los campos que se usan para generar los resultados de la sugerencia de Suggester búsqueda.
Después de crear Index el objeto , el índice se crea mediante una llamada a en la instancia de Indexes.CreateSearchServiceClient .
Nota:
Al crear un índice a partir de una aplicación que se debe mantener con capacidad de respuesta, use el Indexes.CreateAsync método .
Para más información, consulte Creación de un índice de Azure Search mediante el SDK de .NET.
Eliminación del índice de Azure Search
Un índice se puede eliminar llamando a Indexes.Delete en la instancia de SearchServiceClient :
searchClient.Indexes.Delete(Constants.Index);
Carga de datos en el índice de Azure Search
Después de definir el índice, los datos se pueden cargar en él mediante uno de estos dos modelos:
- Modelo de extracción: los datos se ingieren periódicamente desde Azure Cosmos DB, Azure SQL Database, Azure Blob Storage o SQL Server hospedados en una máquina virtual de Azure.
- Modelo de inserción: los datos se envían mediante programación al índice. Este es el modelo adoptado en este artículo.
Se SearchIndexClient debe crear una instancia de para importar datos en el índice. Esto se puede lograr llamando al SearchServiceClient.Indexes.GetClient método , como se muestra en el ejemplo de código siguiente:
static void UploadDataToSearchIndex()
{
var indexClient = searchClient.Indexes.GetClient(Constants.Index);
var monkeyList = MonkeyData.Monkeys.Select(m => new
{
id = Guid.NewGuid().ToString(),
name = m.Name,
location = m.Location,
details = m.Details,
imageUrl = m.ImageUrl
});
var batch = IndexBatch.New(monkeyList.Select(IndexAction.Upload));
try
{
indexClient.Documents.Index(batch);
}
catch (IndexBatchException ex)
{
// Sometimes when the Search service is under load, indexing will fail for some
// documents in the batch. Compensating actions like delaying and retrying should be taken.
// Here, the failed document keys are logged.
Console.WriteLine("Failed to index some documents: {0}",
string.Join(", ", ex.IndexingResults.Where(r => !r.Succeeded).Select(r => r.Key)));
}
}
Los datos que se importarán en el índice se empaquetan como IndexBatch un objeto , que encapsula una colección de objetos IndexAction . Cada IndexAction instancia contiene un documento y una propiedad que indica a Azure Search qué acción realizar en el documento. En el ejemplo de código anterior, se especifica la acción , lo que da lugar a que el documento se inserte en el índice si es nuevo o se reemplazará si IndexAction.Upload ya existe. A IndexBatch continuación, el objeto se envía al índice mediante una llamada Documents.Index al método en el objeto SearchIndexClient . Para obtener información sobre otras acciones de indexación, vea Decide which indexing action to use.
Nota:
Solo se pueden incluir 1000 documentos en una única solicitud de indexación.
Tenga en cuenta que, en el ejemplo de código anterior, la monkeyList colección se crea como un objeto anónimo a partir de una colección de objetos Monkey . Esto crea datos para el campo y resuelve la asignación de nombres de propiedad de caso Pascal a nombres de campo id de índice de búsqueda de Monkey mayúsculas y minúsculas camel. Como alternativa, esta asignación también se puede realizar agregando el [SerializePropertyNamesAsCamelCase] atributo a la clase Monkey .
Para obtener más información, consulte Upload a Azure Search mediante el SDK de .NET.
Consulta del índice de Azure Search
Se SearchIndexClient debe crear una instancia de para consultar un índice. Cuando una aplicación ejecuta consultas, es aconsejable seguir el principio de privilegios mínimos y crear una directamente, pasando la clave de consulta SearchIndexClient como argumento. SearchIndexClient Esto garantiza que los usuarios tengan acceso de solo lectura a índices y documentos. Este enfoque se muestra en el ejemplo de código siguiente:
SearchIndexClient indexClient =
new SearchIndexClient(Constants.SearchServiceName, Constants.Index, new SearchCredentials(Constants.QueryApiKey));
La sobrecarga del constructor toma un nombre de servicio de búsqueda, un nombre de índice y un objeto como argumentos, con el objeto encapsulando la clave de consulta para azure SearchIndexClientSearchCredentialsSearchCredentials servicio Search. SearchIndexClient
Consultas de búsqueda
El índice se puede consultar llamando al método en la instancia de , como se Documents.SearchAsync muestra en el ejemplo de código SearchIndexClient siguiente:
async Task AzureSearch(string text)
{
Monkeys.Clear();
var searchResults = await indexClient.Documents.SearchAsync<Monkey>(text);
foreach (SearchResult<Monkey> result in searchResults.Results)
{
Monkeys.Add(new Monkey
{
Name = result.Document.Name,
Location = result.Document.Location,
Details = result.Document.Details,
ImageUrl = result.Document.ImageUrl
});
}
}
El SearchAsync método toma un argumento de texto de búsqueda y un objeto opcional que se puede usar para SearchParameters refinar aún más la consulta. Una consulta de búsqueda se especifica como argumento de texto de búsqueda, mientras que una consulta de filtro se puede especificar estableciendo la Filter propiedad del SearchParameters argumento . En el ejemplo de código siguiente se muestran ambos tipos de consulta:
var parameters = new SearchParameters
{
Filter = "location ne 'China' and location ne 'Vietnam'"
};
var searchResults = await indexClient.Documents.SearchAsync<Monkey>(text, parameters);
Esta consulta de filtro se aplica a todo el índice y quita documentos de los resultados en los que el campo no es igual a China y no location es igual a Nam. Después del filtrado, la consulta de búsqueda se realiza en los resultados de la consulta de filtro.
Nota:
Para filtrar sin buscar, pase * como argumento de texto de búsqueda.
El SearchAsync método devuelve un objeto que contiene los DocumentSearchResult resultados de la consulta. Este objeto se enumera, con cada objeto que se crea como un objeto y Document se agrega a para MonkeyMonkeysObservableCollection mostrar. En las capturas de pantalla siguientes se muestran los resultados de la consulta de búsqueda devueltos desde Azure Search:

Para más información sobre la búsqueda y el filtrado, consulte Consulta del índice de Azure Search mediante el SDK de .NET.
Consultas de sugerencias
Azure Search permite solicitar sugerencias basadas en una consulta de búsqueda mediante una llamada al Documents.SuggestAsync método en la instancia de SearchIndexClient . Esto se muestra en el ejemplo de código siguiente:
async Task AzureSuggestions(string text)
{
Suggestions.Clear();
var parameters = new SuggestParameters()
{
UseFuzzyMatching = true,
HighlightPreTag = "[",
HighlightPostTag = "]",
MinimumCoverage = 100,
Top = 10
};
var suggestionResults =
await indexClient.Documents.SuggestAsync<Monkey>(text, "nameSuggester", parameters);
foreach (var result in suggestionResults.Results)
{
Suggestions.Add(new Monkey
{
Name = result.Text,
Location = result.Document.Location,
Details = result.Document.Details,
ImageUrl = result.Document.ImageUrl
});
}
}
El método toma un argumento de texto de búsqueda, el nombre del recomendador que se va a usar (que se define en el índice) y un objeto opcional que se puede usar para refinar aún más la SuggestAsyncSuggestParameters consulta. La SuggestParameters instancia de establece las siguientes propiedades:
UseFuzzyMatching: cuando se establece en , Azure Search encontrará sugerencias incluso si hay un carácter sustituido o quetruefalta en el texto de búsqueda.HighlightPreTag: la etiqueta que se antepone a los aciertos de sugerencia.HighlightPostTag: la etiqueta que se anexa a los aciertos de sugerencia.MinimumCoverage: representa el porcentaje del índice que debe cubrir una consulta de sugerencias para que la consulta se notifica correctamente. El valor predeterminado es 80.Top: el número de sugerencias que se recuperarán. Debe ser un entero entre 1 y 100, con un valor predeterminado de 5.
El efecto general es que los 10 primeros resultados del índice se devolverán con el resaltado de la posición, y los resultados incluirán documentos que incluyen términos de búsqueda escritos de forma similar.
El SuggestAsync método devuelve un objeto que contiene los DocumentSuggestResult resultados de la consulta. Este objeto se enumera, con cada objeto que se crea como un objeto y Document se agrega a para MonkeyMonkeysObservableCollection mostrar. En las capturas de pantalla siguientes se muestran los resultados de sugerencias devueltos desde Azure Search:

Tenga en cuenta que en la aplicación de ejemplo, el método solo se invoca cuando el SuggestAsync usuario termina de introducir un término de búsqueda. Sin embargo, también se puede usar para admitir consultas de búsqueda autocompletar mediante la ejecución de en cada tecla.
Resumen
En este artículo se ha mostrado cómo usar la biblioteca Microsoft Azure Search para integrar Azure Search en una Xamarin.Forms aplicación. Azure Search es un servicio en la nube que proporciona funcionalidades de indexación y consulta para los datos cargados. Esto elimina los requisitos de infraestructura y las complejidades del algoritmo de búsqueda tradicionalmente asociados a la implementación de la funcionalidad de búsqueda en una aplicación.
Descarga del ejemplo