Dieses Paket wird auf Umbraco v9-v13 und v14 unterstützt
Sucherweiterungen sind über NuGet verfügbar.
Führen Sie zur Installation mit der .NET-CLI den folgenden Befehl aus:
$ dotnet add package Our.Umbraco.Extensions.Search
Um die Installation in Visual Studio durchzuführen, verwenden Sie die NuGet Package Manager-Benutzeroberfläche oder führen Sie den folgenden Befehl aus:
PM> Install-Package Our.Umbraco.Extensions.Search
Es gibt mehrere Kurzerweiterungsmethoden zum Abfragen von Umbraco-Inhalten in einem Index – zum Überprüfen, ob ein Element veröffentlicht ist, sichtbar ist oder über eine Vorlage verfügt.
Das Abfragen nur veröffentlichter Inhaltselemente kann folgendermaßen erfolgen:
query.And().IsPublished()
Ebenso kann die Abfrage aller Inhalte, bei denen die umbracoNaviHide
-Eigenschaft nicht festgelegt ist, wie folgt erfolgen:
query.And().IsVisible()
Es ist möglich, Inhalte mit einem bestimmten Vorlagen-ID-Set abzufragen. Wenn 0
oder kein Wert an die Methode übergeben wird, gleicht die Abfrage den Inhalt mit jedem Vorlagen-ID-Satz ab.
query.And().HasTemplate(int templateId)
Schließlich ist es möglich, Inhalte abzufragen, die einen der angegebenen Inhaltstyp-Aliase aufweisen. Standardmäßig unterstützt Umbraco die Abfrage nach einem einzelnen Inhaltsalias.
query.And().NodeTypeAlias(string[] aliases)
Umbraco-Eigenschaften, die auf „je nach Kultur variieren“ festgelegt wurden, werden mit einem bestimmten Alias indiziert: {fieldName}_{culture}
. Wenn beispielsweise das Feld „pageTitle“ je nach Kultur unterschiedlich ist und zwei Sprachen hat, Englisch und Spanisch, würde der Index zwei Felder enthalten: pageTitle_en
und pageTitle_es
.
Eine Kultur kann wie folgt an Field
und NodeName
-Abfragen übergeben werden:
query.And().Field(string field, string culture)
query.And().NodeName(string nodeName, string culture)
Es funktioniert sogar mit gruppierten Abfragen wie GroupedAnd
, GroupedOr
und GroupedNot
, bei denen mehrere Felder angegeben werden können:
query.And().GroupedOr(string[] fields, string culture)
Die Page<T>
-Erweiterungsmethoden rufen effizient eine bestimmte Anzahl von Elementen ( perPage
) an einer bestimmten Position ( page
) aus ISearchResults
von Examine ab. Eine optionale Typbeschränkung kann hinzugefügt werden, um auch ausgelagerte Ergebnisse zurückzugeben, die in IPublishedContent
umgewandelt wurden.
var query = searcher.CreatePublishedQuery();
var searchResults = query.Execute();
var results = searchResults.Page<T>(query, int page, int perPage, out int totalPages, out int totalResults);
Die Gesamtzahl der Seiten und Ergebnisse wird als out
-Parameter angezeigt, kann aber wie folgt vernachlässigt werden, wenn sie nicht benötigt wird:
searchResults.Page<T>(query, int page, int perPage, out _, out _);
Eine gesamte Ergebnissammlung kann wie folgt in eine Liste eines bestimmten Typs umgewandelt werden:
var results = query.Execute().GetResults<T>();
Auf bestimmte Felder aus einem einzelnen Suchergebnis kann über die Erweiterungsmethode .Value<T>()
wie folgt zugegriffen werden:
foreach (var result in query.Execute())
{
var value = result.Value<T>(string field);
}
Search Extensions führt mehrere neue Feldtypen in Examine ein – json
, list
, UDI
und picker
– um sicherzustellen, dass Umbraco-Daten korrekt indiziert und abfragbar sind.
Examine ermöglicht die Steuerung der Felder, Feldtypen und mehr eines Index über das benannte Optionsmuster von .NET:
public class ConfigureIndexOptions : IConfigureNamedOptions<LuceneDirectoryIndexOptions>
{
public void Configure(string name, LuceneDirectoryIndexOptions options)
{
if (name == "ExternalIndex")
{
options.FieldDefinitions.AddOrUpdate(new FieldDefinition("fieldName", "fieldType"));
}
}
}
Die Optionsklasse muss im Dependency-Injection-Container registriert sein, um Folgendes anzuwenden:
builder.Services.ConfigureOptions<ConfigureIndexOptions>();
Das Feld „Pfad“ von Umbraco wird automatisch als Liste indiziert und daher kann ein Inhaltselement mit dem Pfad -1,1050,1100
wie folgt abgefragt werden:
query.Field("path", "1100");
Die Felder „createDate“ und „updateDate“ von Umbraco werden automatisch als date
indiziert, während sie normalerweise als Zeichenfolgenwerte indiziert würden.
Der picker
fügt dem Index suchfreundliche Aliase für die ausgewählten Elemente hinzu.
Ein Picker mit einem ausgewählten Inhaltselement namens „Beispielseite“ kann wie folgt abgefragt werden:
query.Field("somePicker", "example-page");
Der json
-Feldtyp teilt die Eigenschaften eines JSON-Objekts in einzelne Felder innerhalb des Index auf.
Stellen Sie sich vor, ein Feld namens „Standorte“ hat den folgenden JSON-Wert:
[
{
"city": "London",
"position": {
"latitude": 51.5074,
"longitude": 0.1278
}
},
{
"city": "New York",
"position": {
"latitude": 40.7128,
"longitude": 74.0060
}
}
]
Jede Eigenschaft wird als Feld im Index erstellt, einschließlich aller verschachtelten Eigenschaften. In diesem Beispiel würden diese „locations_city“, „locations_position_latitude“ und „locations_position_longitude“ heißen.
Es ist möglich, eine Teilmenge der Eigenschaften eines JSON-Objekts zu indizieren, indem Sie einen Pfad im JSON-Pfadformat angeben.
Registrieren Sie eine neue ValueTypeFactory
im Index, die den json
-Typ implementiert, und definieren Sie den Pfad als Parameter, bevor Sie ihn einem Feld zuweisen:
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"));
}
}
}
Es gibt fortgeschrittene Fälle, in denen die Indizierung eines Werts als mehrere Feldtypen erforderlich sein kann, z. B. die Indizierung verschiedener Teile desselben JSON-Objekts in separat benannten Feldern oder die Indizierung bestimmter Eigenschaften innerhalb eines JSON-Objekts als definierter Typ.
Die MultipleValueTypeFactory
weist einem Feld eine Kette von Feldtypen zu und wendet diese nacheinander an:
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"));
}
}
}
In diesem Beispiel umfasst das gleiche JSON-Objekt „Standorte“ alle Städte, während ein völlig neues Feld „Position“ erstellt wird, das alle Breiten- und Längengrade enthält.
Um einen neuen Fehler zu melden, erstellen Sie ein Problem im GitHub-Repository. Um einen Fehler zu beheben oder neue Funktionen hinzuzufügen, forken Sie das Repository und senden Sie eine Pull-Anfrage mit Ihren Änderungen. Fühlen Sie sich frei, Ideen zur Problemliste des Repositorys hinzuzufügen, wenn Sie etwas im Zusammenhang mit der Bibliothek besprechen möchten.
Dieses Projekt wird von Callum Whyte und Mitwirkenden betreut. Wenn Sie Fragen zum Projekt haben, kontaktieren Sie uns bitte auf Twitter oder indem Sie ein Problem auf GitHub melden.
Das Paketlogo verwendet das Lupensymbol aus dem Noun Project von Rohith MS, lizenziert unter CC BY 3.0 US.
Copyright © 2024 Callum Whyte und andere Mitwirkende
Lizenziert unter der MIT-Lizenz.