Dados de índice no Lucene distribuído
O Lucene distribuído permite uma pesquisa eficiente indexando os documentos, onde os índices precisam ser criados e armazenados em um diretório. O primeiro passo é inicializar o diretório que armazena os índices. Ao contrário do Lucene.NET, NCacheDirectory
é usado para abrir um diretório especificando o nome do cache e o nome do índice.
Note
Este recurso também está disponível em NCache Professional.
Note
O caminho padrão para o diretório de índice é C: \ ProgramData \ncache\lucene-index\{CACHE_NAME}\dados para Windows e /usuário/compartilhar/ncache/lucene-index/{CACHE_NAME}/dados para o Linux.
Uma vez que o diretório é inicializado, IndexWriter
é aberto fornecendo a instância de NCacheDirectory
e os votos de IndexWriterConfig. IndexWriter
adiciona e indexa os documentos no índice com o mesmo mecanismo do Lucene.NET usando o AddDocument
método.
Note
Para a distribuição de documentos entre os servidores de cache, NCache adiciona automaticamente um TextField
com uma DocKey
campo e um valor GUID gerado automaticamente para um documento se não for especificado pelo usuário.
Todas as operações de gravação realizadas nos índices são síncronas. Assim, só são devolvidos ao utilizador após a conclusão das referidas operações. Isso adiciona consistência e integridade de dados ao Distributed Lucene.
importante
Para qualquer operação de gravação no gravador, precisamos chamar o Commit
para salvá-lo no diretório do documento. O commit precisa ser chamado, caso contrário não salvará as operações de gravação e também poderá impactar as operações de pesquisa nos documentos adicionados.
Ao contrário do Lucene.NET, você pode abrir vários gravadores no mesmo diretório para indexação paralela. Quando o documento é escrito, IndexWriter.Commit
é chamado para persistir o documento e torná-lo pesquisável. Uma vez o IndexWriter
é usado para indexar os dados, IndexWriter.Dispose
precisa ser chamado para liberar os recursos em uso.
Dica
Você pode obter informações sobre a conclusão das operações de gravação em uma instância usando o NCache fornecido Boolean
propriedade IndexWriter.OperationsCompleted
.
Pré-requisitos
- Para aprender sobre os pré-requisitos padrão necessários para trabalhar com todos os NCache recursos do lado do cliente, consulte a página fornecida em Pré-requisitos da API do lado do cliente.
- Certifique-se de ter criado e iniciado um cache do Lucene por meio do NCache Centro de Gerenciamento or Interface da Linha de comando.
- Certifique-se de que Notificações do cliente estão habilitados.
- Certifique-se de que seu aplicativo não esteja usando nenhuma DLL/referência nativa do Lucene.
- Para detalhes da API, consulte: NCacheDiretório, Analista, Analisador de Espaço Branco, IndexWriter, IndexWriterConfig, COMPROMETA-SE, Adicionar documento, ISO.
Dados de indexação
O exemplo a seguir primeiro abre o NCacheDirectory
especificando o nome do cache como LuceneCache e o nome do índice como Índice do Produto. Em seguida, ele abre um IndexWriter
no diretório especificado, especificando o Analisador de espaço em branco para analisar os dados.
Aviso
As operações de gravação de índice não são permitidas no caso de um cluster parcial.
// Specify the Distributed-Lucene cache name
string cache = "LuceneCache";
// Specify the index name to create the indexes
string indexName = "ProductIndex";
NCacheDirectory ncacheDirectory = null;
IndexWriter indexWriter = null;
//Initializing
// Create a directory and open it on the cache and the index path
ncacheDirectory = NCacheDirectory.Open(cache, indexName);
// Specify the analyzer used to analyze data
Analyzer analyzer = new WhitespaceAnalyzer(LuceneVersion.LUCENE_48);
// Create an indexWriterConfig which holds all the configurations to create an instance of the writer
IndexWriterConfig config = new IndexWriterConfig(LuceneVersion.
LUCENE_48, analyzer);
// Create an instance of the writer
indexWriter = new IndexWriter(ncacheDirectory, new IndexWriterConfig
(LuceneVersion.LUCENE_48, _analyzer));
// Indexing
// Add the products information that is to be indexed
Product[] products = FetchProductsFromDB();
foreach (var prod in products)
{
// Create a document and add fields to it
Document doc = new Document();
doc.Add(new TextField("ProductID", prod.ProductID.ToString(),
Field.Store.YES));
doc.Add(new TextField("ProductName", prod.ProductName, Field.Store.NO));
doc.Add(new TextField("Category", prod.Category, Field.Store.YES));
doc.Add(new TextField("Description", prod.Description, Field.Store.YES));
// Writer is created previously
indexWriter.AddDocument(doc);
}
// Calling commit on the writer saves all the write operations
indexWriter.Commit();
if(indexWriter.OperationsCompleted)
{
// All writing operations are complete
// Can proceed with other operations such as querying
}
// Dispose the indexWriter after indexing
if (indexWriter != null) indexWriter.Dispose();
// Dispose the ncacheDirectory
if (ncacheDirectory != null) ncacheDirectory.Dispose();
Note
Você deveria ligar Dispose
no final de cada writer
por exemplo, caso contrário, ele permanece na memória e causa vazamentos de memória.
Recursos adicionais
NCache fornece um aplicativo de amostra para Lucene distribuído em GitHub.
Veja também
.INTERNET: Lucene.Net.Index espaço para nome.