Ce package est pris en charge sur Umbraco v9-v13 et v14
Les extensions de recherche sont disponibles via NuGet.
Pour installer avec la CLI .NET, exécutez la commande suivante :
$ dotnet add package Our.Umbraco.Extensions.Search
Pour installer à partir de Visual Studio, utilisez l’interface utilisateur de NuGet Package Manager ou exécutez la commande suivante :
PM> Install-Package Our.Umbraco.Extensions.Search
Il existe plusieurs méthodes d'extension abrégées pour interroger le contenu Umbraco dans un index : vérifier si un élément est publié, est visible ou possède un modèle.
L'interrogation uniquement des éléments de contenu publiés peut être effectuée comme ceci :
query.And().IsPublished()
De même, l'interrogation de tout le contenu pour lequel la propriété umbracoNaviHide
n'est pas définie peut être effectuée comme ceci :
query.And().IsVisible()
Il est possible d'interroger du contenu avec un ensemble d'ID de modèle spécifique. Si 0
ou aucune valeur n'est transmise à la méthode, la requête fera correspondre le contenu avec n'importe quel ensemble d'ID de modèle.
query.And().HasTemplate(int templateId)
Enfin, il est possible de rechercher du contenu possédant l' un des alias de type de contenu spécifiés. Umbraco prend en charge l'interrogation d'un seul alias de contenu.
query.And().NodeTypeAlias(string[] aliases)
Les propriétés Umbraco qui ont été définies pour « varier selon la culture » sont indexées avec un alias spécifique : {fieldName}_{culture}
. Par exemple, si le champ « pageTitle » varie selon la culture et comporte 2 langues, l'anglais et l'espagnol, l'index contiendra 2 champs : pageTitle_en
et pageTitle_es
.
Une culture peut être transmise aux requêtes Field
et NodeName
comme ceci :
query.And().Field(string field, string culture)
query.And().NodeName(string nodeName, string culture)
Il fonctionne même avec des requêtes groupées telles que GroupedAnd
, GroupedOr
et GroupedNot
, où plusieurs champs peuvent être spécifiés :
query.And().GroupedOr(string[] fields, string culture)
Les méthodes d'extension Page<T>
obtiennent efficacement un nombre donné d'éléments ( perPage
) à une position spécifique ( page
) à partir ISearchResults
d'Examine. Une contrainte de type facultative peut être ajoutée pour renvoyer également les résultats paginés convertis en 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);
Le nombre total de pages et de résultats sont exposés en tant que paramètre out
, mais peuvent être ignorés s'ils ne sont pas nécessaires, comme suit :
searchResults.Page<T>(query, int page, int perPage, out _, out _);
Une collection entière de résultats peut être convertie en une liste d’un type donné comme ceci :
var results = query.Execute().GetResults<T>();
Des champs spécifiques d'un résultat de recherche individuel sont accessibles via la méthode d'extension .Value<T>()
comme ceci :
foreach (var result in query.Execute())
{
var value = result.Value<T>(string field);
}
Search Extensions introduit plusieurs nouveaux types de champs dans Examine – json
, list
, UDI
et picker
– pour garantir que les données Umbraco sont correctement indexées et interrogeables.
Examine permet de contrôler les champs, les types de champs et bien plus encore d'un index, via le modèle d'options nommées 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 classe d'options doit être enregistrée dans le conteneur d'injection de dépendances pour s'appliquer :
builder.Services.ConfigureOptions<ConfigureIndexOptions>();
Le champ "chemin" d'Umbraco est automatiquement indexé sous forme de liste et ainsi un élément de contenu avec le chemin -1,1050,1100
peut être interrogé comme ceci :
query.Field("path", "1100");
Les champs "createDate" et "updateDate" d'Umbraco sont automatiquement indexés en tant que valeurs date
, alors qu'ils seraient régulièrement indexés en tant que valeurs de chaîne.
Le type de champ picker
ajoute des alias faciles à rechercher pour les éléments sélectionnés dans l'index.
Un sélecteur avec un élément de contenu sélectionné appelé « Page d'exemple » peut être interrogé comme ceci :
query.Field("somePicker", "example-page");
Le type de champ json
divise les propriétés d'un objet JSON en champs individuels au sein de l'index.
Imaginez qu'un champ appelé « emplacements » ait la valeur JSON suivante :
[
{
"city": "London",
"position": {
"latitude": 51.5074,
"longitude": 0.1278
}
},
{
"city": "New York",
"position": {
"latitude": 40.7128,
"longitude": 74.0060
}
}
]
Chaque propriété sera créée sous forme de champ dans l'index, y compris toutes les propriétés imbriquées. Dans cet exemple, ceux-ci seraient appelés "locations_city", "locations_position_latitude" et "locations_position_longitude".
Il est possible d'indexer un sous-ensemble des propriétés d'un objet JSON en fournissant un chemin au format JSON Path.
Enregistrez une nouvelle ValueTypeFactory
dans l'index implémentant le type json
, et définissez le chemin en paramètre, avant de l'attribuer à un champ :
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"));
}
}
}
Il existe des cas avancés où l'indexation d'une valeur sous plusieurs types de champs peut être nécessaire, comme l'indexation de différentes parties du même objet JSON dans des champs nommés séparément ou l'indexation de propriétés spécifiques au sein d'un objet JSON en tant que type défini.
MultipleValueTypeFactory
attribue une chaîne de types de champs à un champ et les applique dans l'ordre :
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"));
}
}
}
Dans cet exemple, le même objet JSON « locations » inclura toutes les villes tandis qu'un tout nouveau champ « position » sera créé incluant toutes les latitudes et longitudes.
Pour soulever un nouveau bug, créez un ticket sur le référentiel GitHub. Pour corriger un bug ou ajouter de nouvelles fonctionnalités, forkez le référentiel et envoyez une pull request avec vos modifications. N'hésitez pas à ajouter des idées à la liste des problèmes du référentiel si vous souhaitez discuter de tout ce qui concerne la bibliothèque.
Ce projet est maintenu par Callum Whyte et ses contributeurs. Si vous avez des questions sur le projet, veuillez nous contacter sur Twitter ou en soulevant un problème sur GitHub.
Le logo du package utilise l'icône de la loupe du Noun Project de Rohith MS, sous licence CC BY 3.0 US.
Copyright © 2024 Callum Whyte et autres contributeurs
Sous licence MIT.