이 패키지는 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 데이터가 올바르게 인덱싱되고 쿼리 가능하도록 보장하기 위해 Examine( json
, list
, UDI
및 picker
)에 몇 가지 새로운 필드 유형을 도입합니다.
Examine을 사용하면 .NET의 명명된 옵션 패턴을 통해 인덱스의 필드, 필드 유형 등을 제어할 수 있습니다.
public class ConfigureIndexOptions : IConfigureNamedOptions<LuceneDirectoryIndexOptions>
{
public void Configure(string name, LuceneDirectoryIndexOptions options)
{
if (name == "ExternalIndex")
{
options.FieldDefinitions.AddOrUpdate(new FieldDefinition("fieldName", "fieldType"));
}
}
}
적용하려면 옵션 클래스를 종속성 주입 컨테이너에 등록해야 합니다.
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의 돋보기 아이콘을 사용합니다.
저작권 © 2024 Callum Whyte 및 기타 기여자
MIT 라이선스에 따라 라이선스가 부여됩니다.