このパッケージは、Umbraco v9 ~ v13 および v14 でサポートされています。
検索拡張機能は NuGet 経由で利用できます。
.NET CLI を使用してインストールするには、次のコマンドを実行します。
$ dotnet add package Our.Umbraco.Extensions.Search
Visual Studio 内からインストールするには、NuGet パッケージ マネージャー UI を使用するか、次のコマンドを実行します。
PM> Install-Package Our.Umbraco.Extensions.Search
インデックス内の Umbraco コンテンツをクエリするための短縮拡張メソッドがいくつかあり、アイテムが公開されているか、表示されているか、またはテンプレートがあるかを確認します。
公開されたコンテンツ アイテムのみをクエリするには、次のように実行できます。
query.And().IsPublished()
同様に、 umbracoNaviHide
プロパティが設定されていないすべてのコンテンツをクエリするには、次のように実行できます。
query.And().IsVisible()
特定のテンプレート ID を設定してコンテンツをクエリすることができます。 0
がメソッドに渡されるか、値が渡されない場合、クエリは任意のテンプレート ID セットを持つコンテンツと一致します。
query.And().HasTemplate(int templateId)
最後に、指定されたコンテンツ タイプ エイリアスのいずれかを持つコンテンツをクエリすることができます。 Umbraco は、デフォルトで単一のコンテンツ エイリアスのクエリをサポートしています。
query.And().NodeTypeAlias(string[] aliases)
「文化によって異なる」ように設定された Umbraco プロパティは、特定のエイリアス{fieldName}_{culture}
でインデックス付けされます。たとえば、「pageTitle」フィールドが文化によって異なり、英語とスペイン語の 2 つの言語がある場合、インデックスにはpageTitle_en
とpageTitle_es
2 つのフィールドが含まれます。
カルチャは、次のようにField
クエリとNodeName
クエリに渡すことができます。
query.And().Field(string field, string culture)
query.And().NodeName(string nodeName, string culture)
複数のフィールドを指定できるGroupedAnd
、 GroupedOr
、 GroupedNot
などのグループ化されたクエリでも機能します。
query.And().GroupedOr(string[] fields, string culture)
Page<T>
拡張メソッドは、Examine のISearchResults
から特定の位置( page
)にある指定された数のアイテム( perPage
)を効率的に取得します。オプションの型制約を追加すると、 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);
ページと結果の合計数はout
パラメータとして公開されますが、必要がない場合は次のように無視できます。
searchResults.Page<T>(query, int page, int perPage, out _, out _);
次のように、結果コレクション全体を特定の型のリストにキャストできます。
var results = query.Execute().GetResults<T>();
個々の検索結果の特定のフィールドには、次のように.Value<T>()
拡張メソッドを介してアクセスできます。
foreach (var result in query.Execute())
{
var value = result.Value<T>(string field);
}
Search Extensions は、Umbraco データに正しくインデックスが付けられ、クエリ可能であることを保証するために、いくつかの新しいフィールド タイプ ( json
、 list
、 UDI
、およびpicker
) を Examine に導入します。
Examine では、.NET の名前付きオプション パターンを介して、インデックスのフィールド、フィールド タイプなどを制御できます。
public class ConfigureIndexOptions : IConfigureNamedOptions<LuceneDirectoryIndexOptions>
{
public void Configure(string name, LuceneDirectoryIndexOptions options)
{
if (name == "ExternalIndex")
{
options.FieldDefinitions.AddOrUpdate(new FieldDefinition("fieldName", "fieldType"));
}
}
}
オプション クラスを適用するには、Dependency Injection コンテナーに登録する必要があります。
builder.Services.ConfigureOptions<ConfigureIndexOptions>();
Umbraco の「パス」フィールドはリストとして自動的にインデックス付けされるため、パス-1,1050,1100
のコンテンツ項目は次のようにクエリできます。
query.Field("path", "1100");
Umbraco の「createDate」フィールドと「updateDate」フィールドは、通常は文字列値としてインデックスが作成されるのに対し、 date
値として自動的にインデックスが作成されます。
picker
フィールド タイプは、選択された項目の検索に適した別名をインデックスに追加します。
「サンプル ページ」と呼ばれるコンテンツ アイテムが選択されたピッカーは、次のようにクエリできます。
query.Field("somePicker", "example-page");
json
フィールド タイプは、JSON オブジェクトのプロパティをインデックス内の個々のフィールドに分割します。
「locations」というフィールドに次の JSON 値があると想像してください。
[
{
"city": "London",
"position": {
"latitude": 51.5074,
"longitude": 0.1278
}
},
{
"city": "New York",
"position": {
"latitude": 40.7128,
"longitude": 74.0060
}
}
]
各プロパティは、ネストされたプロパティを含め、インデックス内のフィールドとして作成されます。この例では、これらは「locations_city」、「locations_position_latitude」、および「locations_position_longitude」と呼ばれます。
JSON パス形式でパスを指定することで、JSON オブジェクトのプロパティのサブセットにインデックスを付けることができます。
json
型を実装するインデックスに新しいValueTypeFactory
を登録し、フィールドに割り当てる前にパスをパラメーターとして定義します。
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"));
}
}
}
同じ JSON オブジェクトの異なる部分を個別に名前を付けたフィールドにインデックス付けしたり、JSON オブジェクト内の特定のプロパティを定義されたタイプとしてインデックス付けしたりするなど、複数のフィールド タイプとして値のインデックス付けが必要になる高度なケースがあります。
MultipleValueTypeFactory
は、一連のフィールド タイプをフィールドに割り当て、それらを順番に適用します。
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"));
}
}
}
この例では、同じ「場所」JSON オブジェクトにすべての都市が含まれ、すべての緯度と経度を含むまったく新しい「位置」フィールドが作成されます。
新しいバグを報告するには、GitHub リポジトリで問題を作成します。バグを修正したり、新しい機能を追加するには、リポジトリをフォークし、変更を含むプル リクエストを送信します。ライブラリに関連することについて議論したい場合は、リポジトリの問題リストに自由にアイデアを追加してください。
このプロジェクトは Callum Whyte と貢献者によって維持されています。プロジェクトについてご質問がある場合は、Twitter でご連絡いただくか、GitHub で問題を提起してください。
パッケージのロゴには、CC BY 3.0 US でライセンス供与された Rohith MS の Noun Project の虫眼鏡アイコンが使用されています。
Copyright © 2024 Callum Whyte、およびその他の寄稿者
MITライセンスに基づいてライセンスされています。