Este pacote é compatível com Umbraco v9-v13 e v14
As extensões de pesquisa estão disponíveis via NuGet.
Para instalar com a CLI do .NET, execute o seguinte comando:
$ dotnet add package Our.Umbraco.Extensions.Search
Para instalar no Visual Studio, use a UI do NuGet Package Manager ou execute o seguinte comando:
PM> Install-Package Our.Umbraco.Extensions.Search
Existem vários métodos de extensão abreviados para consultar o conteúdo do Umbraco em um índice – verificando se um item está publicado, está visível ou possui um modelo.
A consulta apenas de itens de conteúdo publicados pode ser feita assim:
query.And().IsPublished()
Da mesma forma, a consulta de todo o conteúdo onde a propriedade umbracoNaviHide
não está definida pode ser feita assim:
query.And().IsVisible()
É possível consultar conteúdo com um conjunto de ID de modelo específico. Se 0
ou nenhum valor for passado para o método, a consulta corresponderá ao conteúdo com qualquer ID de modelo definido.
query.And().HasTemplate(int templateId)
Finalmente, é possível consultar conteúdo que possua qualquer um dos aliases de tipo de conteúdo especificados. Pronto para uso, o Umbraco oferece suporte à consulta de um único alias de conteúdo.
query.And().NodeTypeAlias(string[] aliases)
As propriedades Umbraco que foram definidas como "variam de acordo com a cultura" são indexadas com um alias específico: {fieldName}_{culture}
. Por exemplo, se o campo "pageTitle" variar de acordo com a cultura e tiver 2 idiomas, inglês e espanhol, o índice conterá 2 campos: pageTitle_en
e pageTitle_es
.
Uma cultura pode ser passada para consultas Field
e NodeName
como esta:
query.And().Field(string field, string culture)
query.And().NodeName(string nodeName, string culture)
Ele funciona até mesmo com consultas agrupadas, como GroupedAnd
, GroupedOr
e GroupedNot
, onde vários campos podem ser especificados:
query.And().GroupedOr(string[] fields, string culture)
Os métodos de extensão Page<T>
obtêm com eficiência um determinado número de itens ( perPage
) em uma posição específica ( page
) do ISearchResults
do Examine. Uma restrição de tipo opcional pode ser adicionada para retornar também resultados paginados convertidos para 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);
O número total de páginas e resultados são expostos como parâmetro out
, mas podem ser descartados se não forem necessários da seguinte forma:
searchResults.Page<T>(query, int page, int perPage, out _, out _);
Uma coleção inteira de resultados pode ser convertida em uma lista de um determinado tipo como esta:
var results = query.Execute().GetResults<T>();
Campos específicos de um resultado de pesquisa individual podem ser acessados por meio do método de extensão .Value<T>()
como este:
foreach (var result in query.Execute())
{
var value = result.Value<T>(string field);
}
Search Extensions introduz vários novos tipos de campo no Examine – json
, list
, UDI
e picker
– para garantir que os dados do Umbraco sejam corretamente indexados e consultáveis.
Examine permite controlar os campos de um índice, tipos de campos e muito mais, por meio do padrão Named Options do .NET:
public class ConfigureIndexOptions : IConfigureNamedOptions<LuceneDirectoryIndexOptions>
{
public void Configure(string name, LuceneDirectoryIndexOptions options)
{
if (name == "ExternalIndex")
{
options.FieldDefinitions.AddOrUpdate(new FieldDefinition("fieldName", "fieldType"));
}
}
}
A classe de opções deve ser registrada no contêiner de Injeção de Dependência para ser aplicada:
builder.Services.ConfigureOptions<ConfigureIndexOptions>();
O campo "caminho" do Umbraco é automaticamente indexado como uma lista e, portanto, um item de conteúdo com o caminho -1,1050,1100
pode ser consultado assim:
query.Field("path", "1100");
Os campos "createDate" e "updateDate" do Umbraco são automaticamente indexados como valores date
, enquanto seriam indexados regularmente como valores de string.
O tipo de campo picker
adiciona aliases fáceis de pesquisar para os itens selecionados no índice.
Um seletor com um item de conteúdo selecionado chamado "Página de exemplo" pode ser consultado assim:
query.Field("somePicker", "example-page");
O tipo de campo json
divide as propriedades de um objeto JSON em campos individuais dentro do índice.
Imagine que um campo chamado "locais" tenha o seguinte valor JSON:
[
{
"city": "London",
"position": {
"latitude": 51.5074,
"longitude": 0.1278
}
},
{
"city": "New York",
"position": {
"latitude": 40.7128,
"longitude": 74.0060
}
}
]
Cada propriedade será criada como um campo no índice, incluindo quaisquer propriedades aninhadas. Neste exemplo, eles seriam chamados de "locations_city", "locations_position_latitude" e "locations_position_longitude".
É possível indexar um subconjunto de propriedades de um objeto JSON fornecendo um caminho no formato JSON Path.
Registre um novo ValueTypeFactory
no índice que implementa o tipo json
e defina o caminho como parâmetro antes de atribuí-lo a um campo:
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"));
}
}
}
Há casos avançados em que pode ser necessário indexar um valor como vários tipos de campo, como indexar diferentes partes do mesmo objeto JSON em campos nomeados separadamente ou indexar propriedades específicas dentro de um objeto JSON como um tipo definido.
O MultipleValueTypeFactory
atribui uma cadeia de tipos de campo a um campo e os aplica em sequência:
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"));
}
}
}
Neste exemplo, o mesmo objeto JSON "locais" incluirá todas as cidades, enquanto um campo "posição" totalmente novo será criado incluindo todas as latitudes e longitudes.
Para levantar um novo bug, crie um problema no repositório GitHub. Para corrigir um bug ou adicionar novos recursos, bifurque o repositório e envie uma solicitação pull com suas alterações. Sinta-se à vontade para adicionar ideias à lista de problemas do repositório se quiser discutir algo relacionado à biblioteca.
Este projeto é mantido por Callum Whyte e colaboradores. Se você tiver alguma dúvida sobre o projeto, entre em contato pelo Twitter ou levantando um problema no GitHub.
O logotipo do pacote usa o ícone Lupa do Noun Project de Rohith MS, licenciado sob CC BY 3.0 US.
Copyright © 2024 Callum Whyte e outros colaboradores
Licenciado sob a licença MIT.