Этот пакет поддерживается в Umbraco v9-v13 и v14.
Расширения поиска доступны через NuGet.
Для установки с помощью .NET CLI выполните следующую команду:
$ dotnet add package Our.Umbraco.Extensions.Search
Для установки из Visual Studio используйте пользовательский интерфейс диспетчера пакетов NuGet или выполните следующую команду:
PM> Install-Package Our.Umbraco.Extensions.Search
Существует несколько сокращенных методов расширения для запроса содержимого Umbraco в индексе — проверки того, опубликован ли элемент, виден ли он или имеет ли он шаблон.
Запрос только опубликованных элементов контента можно выполнить следующим образом:
query.And().IsPublished()
Аналогично, запрос ко всему контенту, для которого не установлено свойство umbracoNaviHide
, можно выполнить следующим образом:
query.And().IsVisible()
Можно запросить контент с помощью определенного набора идентификаторов шаблона. Если методу передано 0
или никакое значение, запрос будет сопоставлять содержимое с любым установленным идентификатором шаблона.
query.And().HasTemplate(int templateId)
Наконец, можно запросить контент, который имеет любой из указанных псевдонимов типа контента. По умолчанию Umbraco поддерживает запрос одного псевдонима контента.
query.And().NodeTypeAlias(string[] aliases)
Свойства Umbraco, для которых установлено значение «зависит от культуры», индексируются с определенным псевдонимом: {fieldName}_{culture}
. Например, если поле «pageTitle» зависит от языка и языка и содержит два языка: английский и испанский, индекс будет содержать два поля: pageTitle_en
и pageTitle_es
.
Культуру можно передать в запросы 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>
эффективно получают заданное количество элементов ( perPage
) в определенной позиции ( page
) из ISearchResults
Examine. Можно добавить необязательное ограничение типа, чтобы также возвращать постраничные результаты, приведенные к 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);
}
Расширения поиска вводят в Examine несколько новых типов полей — json
, list
, UDI
и picker
— для обеспечения правильной индексации и возможности запроса данных Umbraco.
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 на отдельные поля в индексе.
Представьте, что поле под названием «Местоположения» имеет следующее значение 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 Path.
Зарегистрируйте новую ValueTypeFactory
в индексе, реализующую тип json
, и определите путь в качестве параметра, прежде чем назначать его полю:
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. Чтобы исправить ошибку или добавить новые функции, создайте форк репозитория и отправьте запрос на включение с вашими изменениями. Не стесняйтесь добавлять идеи в список проблем репозитория, если вы хотите обсудить что-либо, связанное с библиотекой.
Этот проект поддерживается Каллумом Уайтом и его участниками. Если у вас есть какие-либо вопросы о проекте, свяжитесь с нами через Twitter или поднимите вопрос на GitHub.
В логотипе пакета используется значок увеличительного стекла из проекта Noun Project от Rohith MS, лицензированного по лицензии CC BY 3.0 US.
Авторские права © 2024 Каллум Уайт и другие участники
Лицензировано по лицензии MIT.