Este paquete es compatible con Umbraco v9-v13 y v14
Extensiones de búsqueda está disponible a través de NuGet.
Para instalar con la CLI de .NET, ejecute el siguiente comando:
$ dotnet add package Our.Umbraco.Extensions.Search
Para instalar desde Visual Studio, use la interfaz de usuario del Administrador de paquetes NuGet o ejecute el siguiente comando:
PM> Install-Package Our.Umbraco.Extensions.Search
Existen varios métodos de extensión abreviados para consultar el contenido de Umbraco en un índice: comprobar si un elemento está publicado, es visible o tiene una plantilla.
La consulta solo de elementos de contenido publicado se puede realizar de esta manera:
query.And().IsPublished()
De manera similar, consultar todo el contenido donde la propiedad umbracoNaviHide
no está configurada se puede hacer de esta manera:
query.And().IsVisible()
Es posible consultar contenido con un conjunto de ID de plantilla específico. Si se pasa 0
o ningún valor al método, la consulta hará coincidir el contenido con cualquier conjunto de ID de plantilla.
query.And().HasTemplate(int templateId)
Finalmente, es posible consultar contenido que tenga cualquiera de los alias de tipo de contenido especificados. Umbraco, listo para usar, admite la consulta de un único alias de contenido.
query.And().NodeTypeAlias(string[] aliases)
Las propiedades de Umbraco que se han configurado para "variar según la cultura" se indexan con un alias específico: {fieldName}_{culture}
. Por ejemplo, si el campo "pageTitle" varía según la cultura y tiene 2 idiomas, inglés y español, el índice contendría 2 campos: pageTitle_en
y pageTitle_es
.
Se puede pasar una cultura a consultas Field
y NodeName
como esta:
query.And().Field(string field, string culture)
query.And().NodeName(string nodeName, string culture)
Incluso funciona con consultas agrupadas como GroupedAnd
, GroupedOr
y GroupedNot
, donde se pueden especificar varios campos:
query.And().GroupedOr(string[] fields, string culture)
Los métodos de extensión Page<T>
obtienen de manera eficiente una cantidad determinada de elementos ( perPage
) en una posición específica ( page
) de ISearchResults
de Examine. Se puede agregar una restricción de tipo opcional para devolver también los resultados paginados emitidos a IPublishedContent
.
var query = searcher.CreatePublishedQuery();
var searchResults = query.Execute();
var results = searchResults.Page<T>(query, int page, int perPage, out int totalPages, out int totalResults);
El número total de páginas y resultados se exponen como un parámetro out
, pero se pueden descartar si no son necesarios de la siguiente manera:
searchResults.Page<T>(query, int page, int perPage, out _, out _);
Una colección completa de resultados se puede convertir en una lista de un tipo determinado como esta:
var results = query.Execute().GetResults<T>();
Se puede acceder a campos específicos de un resultado de búsqueda individual a través del método de extensión .Value<T>()
como este:
foreach (var result in query.Execute())
{
var value = result.Value<T>(string field);
}
Extensiones de búsqueda introduce varios tipos de campos nuevos en Examine ( json
, list
, UDI
y picker
) para garantizar que los datos de Umbraco estén indexados y consultables correctamente.
Examinar permite controlar los campos de un índice, los tipos de campos y más, a través del patrón Opciones con nombre de .NET:
public class ConfigureIndexOptions : IConfigureNamedOptions<LuceneDirectoryIndexOptions>
{
public void Configure(string name, LuceneDirectoryIndexOptions options)
{
if (name == "ExternalIndex")
{
options.FieldDefinitions.AddOrUpdate(new FieldDefinition("fieldName", "fieldType"));
}
}
}
La clase de opciones debe estar registrada en el contenedor de Inyección de Dependencia para aplicar:
builder.Services.ConfigureOptions<ConfigureIndexOptions>();
El campo "ruta" de Umbraco se indexa automáticamente como una lista y, por lo tanto, un elemento de contenido con la ruta -1,1050,1100
se puede consultar de esta manera:
query.Field("path", "1100");
Los campos "createDate" y "updateDate" de Umbraco se indexan automáticamente como valores date
, mientras que normalmente se indexarían como valores de cadena.
El tipo de campo picker
agrega alias fáciles de buscar para los elementos seleccionados en el índice.
Un selector con un elemento de contenido seleccionado llamado "Página de ejemplo" se puede consultar de esta manera:
query.Field("somePicker", "example-page");
El tipo de campo json
divide las propiedades de un objeto JSON en campos individuales dentro del índice.
Imagine que un campo llamado "ubicaciones" tiene el siguiente valor JSON:
[
{
"city": "London",
"position": {
"latitude": 51.5074,
"longitude": 0.1278
}
},
{
"city": "New York",
"position": {
"latitude": 40.7128,
"longitude": 74.0060
}
}
]
Cada propiedad se creará como un campo en el índice, incluidas las propiedades anidadas. En este ejemplo, se denominarían "ubicaciones_ciudad", "ubicaciones_posición_latitud" y "ubicaciones_posición_longitud".
Es posible indexar un subconjunto de las propiedades de un objeto JSON proporcionando una ruta en formato JSON Path.
Registre un nuevo ValueTypeFactory
en el índice que implementa el tipo json
y defina la ruta como parámetro, antes de asignarlo a un campo:
public class ConfigureIndexOptions : IConfigureNamedOptions<LuceneDirectoryIndexOptions>
{
public void Configure(string name, LuceneDirectoryIndexOptions options)
{
if (name == "ExternalIndex")
{
options.IndexValueTypesFactory = new Dictionary<string, IFieldValueTypeFactory>(options.IndexValueTypesFactory)
{
["position"] = new DelegateFieldValueTypeFactory(fieldName =>
{
return new JsonValueType(fieldName, "$[*].position");
};
};
options.FieldDefinitions.AddOrUpdate(new FieldDefinition("locations", "position"));
}
}
}
Hay casos avanzados en los que puede ser necesario indexar un valor como varios tipos de campos, como indexar diferentes partes del mismo objeto JSON en campos con nombres separados o indexar propiedades específicas dentro de un objeto JSON como un tipo definido.
MultipleValueTypeFactory
asigna una cadena de tipos de campo a un campo y los aplica en secuencia:
public class ConfigureIndexOptions : IConfigureNamedOptions<LuceneDirectoryIndexOptions>
{
public void Configure(string name, LuceneDirectoryIndexOptions options)
{
if (name == "ExternalIndex")
{
options.IndexValueTypesFactory = new Dictionary<string, IFieldValueTypeFactory>(options.IndexValueTypesFactory)
{
["locationData"] = new DelegateFieldValueTypeFactory(fieldName =>
{
return new MultipleValueTypeFactory(
fieldName,
new IIndexFieldValueType[]
{
new JsonValueType(x, "$[*].city"),
new JsonValueType("position", "$[*].position")
}
);
};
};
options.FieldDefinitions.AddOrUpdate(new FieldDefinition("locations", "locationData"));
}
}
}
En este ejemplo, el mismo objeto JSON de "ubicaciones" incluirá todas las ciudades, mientras que se creará un campo de "posición" completamente nuevo que incluirá todas las latitudes y longitudes.
Para generar un nuevo error, cree una incidencia en el repositorio de GitHub. Para corregir un error o agregar nuevas funciones, bifurque el repositorio y envíe una solicitud de extracción con sus cambios. Siéntase libre de agregar ideas a la lista de problemas del repositorio si desea discutir algo relacionado con la biblioteca.
Este proyecto es mantenido por Callum Whyte y sus colaboradores. Si tiene alguna pregunta sobre el proyecto, comuníquese con nosotros en Twitter o planteando un problema en GitHub.
El logotipo del paquete utiliza el ícono de lupa del Noun Project de Rohith MS, con licencia CC BY 3.0 US.
Copyright © 2024 Callum Whyte y otros colaboradores.
Licenciado bajo la Licencia MIT.