Visão geral do Lucene distribuído
NCache fornece uma lucene módulo, que permite usar o Lucene para pesquisa de texto com NCache. Cada servidor de NCache tem um módulo Lucene dedicado. Isso torna o Lucene distribuído, escalável e altamente disponível com NCache.
Note
Esse recurso está disponível em NCache Empreendimento e Aprovação para o Topologias Particionadas só.
Note
NCache usa a versão 4.8 do Lucene.Net.
Por que usar o Lucene com NCache?
Lucene, como sabemos, é um mecanismo de busca poderoso e eficiente que oferece uma vasta gama de técnicas de busca de texto para atender às necessidades de seu negócio. Lucene é muito mais do que qualquer outro mecanismo de busca de texto, pois as opções dadas ao usuário são múltiplas. Possui algoritmos de pesquisa poderosos e oferece suporte a uma ampla variedade de consultas de pesquisa.
Embora tão poderoso quanto o Lucene, ele tem suas limitações. O Lucene é executado em processo no aplicativo cliente. Isso significa que o Lucene não é escalável e tem um único ponto de falha.
NCache fornece uma implementação distribuída do Lucene com pequenas alterações em sua API. Chamadas de API do Lucene NCache no backend. NCache ser distribuído na natureza com o Lucene fornece escalabilidade de gravação linear, pois os documentos indexados pelos aplicativos são distribuídos automaticamente entre os nós de cache onde são indexados separadamente.
Note
O Lucene distribuído usa uma loja Lucene separada e dedicada em vez do NCache armazenamento de cache.
Da mesma forma, o Distributed Lucene também fornece escalabilidade de leitura linear, uma vez que as consultas são propagadas em cada partição e os resultados são mesclados. Um número maior de partições fornece uma maior escalabilidade de leitura e gravação. Os índices Lucene são mantidos em sua unidade física. Quanto mais nós, maior será a escalabilidade, o desempenho e a capacidade de armazenamento para acomodar um grande número de documentos Lucene e dados indexados.
Trabalho de Lucene Distribuído
importante
É altamente recomendável que você use um SSD para indexar e pesquisar documentos Lucene em vez de um HDD.
O comportamento e o funcionamento do Lucene e do Distributed Lucene são quase os mesmos, com algumas alterações. O fluxo de trabalho, a distribuição de dados e os componentes do Distributed Lucene são explicados nas seções a seguir:
Fluxo de trabalho distribuído do Lucene
O diagrama abaixo mostra como funciona o modelo Distributed Lucene.
O aplicativo cliente pode querer indexar e analisar (analisados por analisadores Lucene suportados) documentos ou consultar documentos indexados existentes usando a API Lucene. Essas operações com a API atuam como chamadas de procedimento remoto (RPCs) e são encaminhadas diretamente para o NCache conjunto. O cluster determina a natureza dessas chamadas e as encaminha para os módulos Distributed Lucene anexados a cada nó do servidor. Esses módulos executam essas chamadas e, dependendo da natureza das chamadas, ocorre uma das seguintes ações:
Chamada de Documento de Consulta: Caso seja uma chamada de consulta, os módulos Distributed Lucene retornam os resultados para o lado do cliente, onde todos esses resultados são mesclados e processados.
Chamada de Documento de Índice: Caso seja uma chamada para indexar um documento, os Módulos Lucene Distribuídos persistem esse documento em uma unidade de disco.
Distribuição de dados
Um mapa de distribuição é gerado em um cluster de cache. Para o Lucene Distribuído, este mapa é gerado:
- Na criação do cache.
- Na adição ou remoção de um nó de servidor.
Aviso
Caso o mapa de distribuição não exista, o cache falha ao iniciar e as exceções são registradas no visualizador de eventos e nos logs de serviço.
Este mapa contém informações sobre os buckets nos nós de cache. O número total de buckets para um cache Distributed Lucene é 100. Esses 100 buckets são distribuídos no cluster usando uma estratégia específica.
Ter 100 buckets significa que um índice é dividido em 100 subíndices no cluster de cache. Com base no número de buckets atribuídos a cada nó, todos os respectivos arquivos de índice também são movidos para esse nó específico. Portanto, sempre que a transferência de estado causa a movimentação de buckets no cluster de cache, os arquivos de índice correspondentes também são movidos como parte do processo.
Um nó de servidor pode conter vários índices e cada índice nesse nó de servidor contém buckets que são atribuídos a ele de acordo com a estratégia de distribuição do cluster. Os documentos dos índices são distribuídos igualmente por meio desses intervalos. Esses índices também persistem em sua unidade física.
NCache tem tempo de execução ou distribuição dinâmica. O início ou a parada do nó acionará uma alteração no mapa de distribuição do cluster de cache e acionará a transferência de estado. No entanto, em NCache Distribuído Lucene, os índices são persistidos em sua unidade física para evitar distribuição desnecessária de índices no início ou parada do nó. Ou seja, que em NCache Distribuído Lucene, apenas a adição ou remoção de um nó do cluster de cache alterará o mapa de distribuição e acionará a transferência de estado para os nós do servidor em execução. Para os nós de servidor parados, a transferência de estado ocorrerá assim que eles voltarem a ficar online.
A seguir, alguns pontos importantes a serem considerados para NCache Lucene distribuído:
- Mapa de Distribuição do Cache: O mapa de distribuição de um novo cache só é gerado quando a criação do cache é bem-sucedida. Se a geração do mapa de distribuição falhar por algum motivo, a criação do cache será revertida (revertida).
- Transferência de Estado: Qualquer alteração na configuração da associação do cluster de cache causará alterações no mapa de distribuição porque isso acionará a transferência de estado no cluster de cache.
- Adição de nó a um cluster existente: Nesse caso, todos os nós do servidor (mesmo aquele que está sendo adicionado) devem estar fisicamente disponíveis e seus serviços devem estar em execução. Quando um nó é adicionado ao cluster de cache Distributed Lucene, o mapa de distribuição existente é obtido dos nós de servidor existentes. Um novo mapa de distribuição é então gerado e compartilhado com todos os nós do servidor. Uma chamada de confirmação é enviada para persistir esse mapa de distribuição.
- Remoção de nós de um cluster existente: Nesse caso, semelhante à adição de nós a um cluster existente, todos os nós do servidor (exceto aquele que está sendo removido) devem estar fisicamente disponíveis e seu serviço deve estar em execução. Caso contrário, esta operação falhará.
- Desligamento do nó durante a transferência de estado: Se um nó de servidor for encerrado durante a transferência de estado, a transferência de estado desse nó será interrompida e retomada no mesmo bucket (onde o nó é encerrado) quando o nó for reiniciado.
importante
No caso de instalação do desenvolvedor, as lojas podem configurar o Distributed Lucene.
Inicializar o Lucene distribuído
Antes de começar a usar o Distributed Lucene para indexar seus documentos e pesquisá-los posteriormente, você precisa inicializar primeiro. Depois de inicializá-lo, você precisa fornecer o nome do cache e o nome do índice.
Dados do Índice
O processo de indexação no Distributed Lucene é igual ao próprio Lucene. No caso do Lucene Distribuído, NCache mantém um armazenamento de valores-chave para a distribuição de documentos e uma chave gerada automaticamente é adicionada a cada documento. O documento é indexado no nó em relação a essa chave específica.
Pesquisa de índice
Depois que o Distributed Lucene for inicializado e seus documentos indexados, você poderá realizar pesquisas baseadas em texto nesses documentos.
Facetas
Uma categoria é um aspecto essencial de um documento indexado usado para classificá-lo. Por exemplo, ao pesquisar roupas em uma loja de comércio eletrônico, as categorias das roupas podem ser preço, material, marca, etc.
Na pesquisa facetada, além dos resultados normais da pesquisa, você também obtém resultados facetados, que consistem em subcategorias para determinadas categorias. Continuando o exemplo acima, as subcategorias para facetas materiais podem ser algodão, lã, couro, etc.
A pesquisa facetada facilita muito a pesquisa de documentos específicos de que você precisa. NCache agora suporta Facets com Distributed Lucene, que irá ajudá-lo nos documentos desejados de forma eficiente e eficaz. O funcionamento das facetas no Lucene e no Distributed Lucene é basicamente o mesmo, mas com muitas melhorias de desempenho destacadas em Facetas Distribuídas de Lucene.
API geoespacial
Os dados que contêm valores de coordenadas de longitude e latitude são chamados de Dados geoespaciais. Esses dados são úteis se você deseja pesquisar dados com base em sua localização. Por exemplo, você deseja indexar um documento que contém as informações de um restaurante. Este documento contém vários campos e um desses campos contém os valores de longitude e latitude. Para pesquisar este documento no futuro com base em sua localização (digamos, o restaurante mais próximo de você), você também desejará indexar os campos de longitude e latitude.
O Lucene tem um recurso de indexação e pesquisa de dados geoespaciais muito poderoso, e agora NCache também permite indexar e pesquisar documentos em relação à sua localização com a API Lucene. O link a seguir ajudará você a entender como indexar dados e pesquisá-los API geoespacial distribuída do Lucene seção.
Comportamento do Lucene distribuído em um cluster parcial
Um cluster de cache é declarado parcial quando um ou mais nós dentro dele ficam indisponíveis. Conseqüentemente, a conectividade é limitada, tornando o cluster de cache um cluster parcial. O comportamento do Distributed Lucene em um cluster parcial é explicado abaixo:
Operações de leitura em um cluster parcial
NCache O Lucene distribuído permite que você recupere (leia) dados de um cluster parcial definindo o valor da AllowPartialResults
propriedade para TRUE
na IndexReader
instância de classe. Por padrão, o valor do AllowPartialResults
bandeira está definida para FALSE
.
Estas operações de leitura retornarão dados parciais ou incompletos. Contudo, no caso de Topologia de réplica de partição, o cluster de cache tolerará uma falha de nó único por meio de sua réplica e você poderá recuperar dados completos. Mas, no caso de falhas de vários nós, você só poderá recuperar dados parciais.
Aviso
Se você tentar ler dados de um cluster parcial e tiver definido o valor do AllowPartialResults
bandeira para FALSE
, uma exceção será lançada.
Operações de gravação em um cluster parcial
O Lucene distribuído não permite que você execute operações de gravação como Adicionar, Atualizar e Excluir em um cluster parcial. Se você tentar executar essas operações em um cluster parcial, uma exceção será lançada.
API Lucene não suportada
Abaixo está uma lista de APIs Lucene não suportadas no Distributed Lucene.
DirectoryReader
public static DirectoryReader Open(IndexCommit commit)
public static DirectoryReader Open(IndexCommit commit, int termInfosIndexDivisor)
public static DirectoryReader OpenIfChanged(DirectoryReader oldReader)
public static DirectoryReader OpenIfChanged(DirectoryReader oldReader, IndexCommit commit)
public static DirectoryReader OpenIfChanged(DirectoryReader oldReader, IndexWriter writer, bool applyAllDeletes)
IndexSearcher
public IndexSearcher(IndexReaderContext context, TaskScheduler executor)
public Document Document(int docID, ISet<string> fieldsToLoad)
public virtual Weight CreateNormalizedWeight(Query query)
public virtual TopDocs SearchAfter(ScoreDoc after, Query query, int n)
public virtual TopDocs SearchAfter(ScoreDoc after, Query query, Filter filter, int n)
public virtual TopDocs SearchAfter(ScoreDoc after, Query query, Filter filter, int n, Sort sort)
public virtual TopDocs SearchAfter(ScoreDoc after, Query query, int n, Sort sort)
public virtual TopDocs SearchAfter(ScoreDoc after, Query query, Filter filter, int n, Sort sort, bool doDocScores, bool doMaxScore)
IndexReader
public static DirectoryReader Open(Directory directory)
public static DirectoryReader Open(Directory directory, int termInfosIndexDivisor)
public static DirectoryReader Open(IndexWriter writer, bool applyAllDeletes)
public static DirectoryReader Open(IndexCommit commit)
public static DirectoryReader Open(IndexCommit commit, int termInfosIndexDivisor)
public IList<AtomicReaderContext> Leaves
NCacheDirectory
public override string[] ListAll()
public override long FileLength(string name)
public override void DeleteFile(string name)
public override string GetLockID()
public override IndexInput OpenInput(string name, IOContext context)
CompositeReader
public override sealed IndexReaderContext Context
Recursos adicionais
NCache fornece um aplicativo de amostra para Lucene distribuído em GitHub.
Veja também
Componentes e visão geral do Lucene
Configurar índices de consulta do Lucene
Pesquisa SQL no Cache
Pesquisar cache com LINQ