/*
Kooboo is a content management system based on ASP.NET MVC framework. Copyright 2009 Yardi Technology Limited.
This program is free software: you can redistribute it and/or modify it under the terms of the
GNU General Public License version 3 as published by the Free Software Foundation.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program.
If not, see http://www.kooboo.com/gpl3/.
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Lucene.Net.Documents;
using Lucene.Net.Index;
using Lucene.Net.Store;
using Lucene.Net.Analysis;
using Lucene.Net.Analysis.Standard;
using Everest.Search.Convertor;
using Everest.Search.Configuration;
using Everest.Library;
namespace Everest.Search{
/// <summary>
/// Index use lucene
/// </summary>
public class LuceneIndexer : IIndexer
{
IndexWriter indexWriter;
IDocumentConvertor convertor;
string primaryField;
#region IIndexer Members
/// <summary>
/// use the configuration in the search.config
/// </summary>
/// <param name="type">The type.</param>
public void Open(Type type)
{
Open(type, string.Empty);
}
/// <summary>
/// Opens the specified type.
/// </summary>
/// <param name="type">The type.</param>
/// <param name="primaryField">The primary field.</param>
public void Open(Type type, string primaryField)
{
Open(type, string.Empty, primaryField, null, false);
}
/// <summary>
/// Adds the document.
/// priority to use configuration
/// </summary>
/// <param name="o">The o.</param>
public void AddDocument(object o)
{
Document document = convertor.ToDocument(o);
indexWriter.AddDocument(document);
}
/// <summary>
/// Closes this instance.
/// </summary>
public void Close()
{
indexWriter.Optimize();
indexWriter.Close();
indexWriter = null;
}
#endregion
#region IDisposable Members
/// <summary>
/// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
/// </summary>
public void Dispose()
{
if (indexWriter != null)
{
Close();
}
}
#endregion
#region IIndexer Members
/// <summary>
/// priority-of-use the configuration .
/// </summary>
/// <param name="type">The type.</param>
/// <param name="directory">The directory.</param>
public void Open(Type type, string directory, string primaryKey, IDocumentConvertor documentConvertor, bool create)
{
ConfigurationSerivce configService = new ConfigurationSerivce(type, directory, documentConvertor);
this.Directory = configService.Directory;
convertor = configService.GetConvertor();
convertor.SetAnalyzer(configService.Analyzer);
bool recreate = !System.IO.Directory.Exists(Directory) || System.IO.Directory.GetFiles(Directory).Length == 0 || create;
indexWriter = new IndexWriter(Directory, configService.Analyzer, recreate);
this.primaryField = primaryKey;
if (!string.IsNullOrEmpty(configService.PrimaryKey))
{
this.primaryField = configService.PrimaryKey;
}
}
/// <summary>
/// Updates the document.
/// delete old document if the document exists
/// or add it.
/// </summary>
/// <param name="o">The o.</param>
public void UpdateDocument(object o)
{
DesignByContract.Require(!string.IsNullOrEmpty(primaryField), Resources.PrimaryFieldRequirdForUpdateDocument);
Document document = convertor.ToDocument(o);
DesignByContract.Require(document.GetField(primaryField) != null, string.Format(Resources.FieldNotFound, primaryField));
Term keyTerm = new Term(primaryField, document.Get(primaryField));
indexWriter.DeleteDocuments(keyTerm);
indexWriter.AddDocument(document);
}
/// <summary>
/// Deletes the document.
/// </summary>
/// <param name="primaryValue"></param>
public void DeleteDocument(string primaryValue)
{
Term keyTerm = new Term(primaryField, primaryValue);
indexWriter.DeleteDocuments(keyTerm);
}
public string Directory
{
get;
private set;
}
#endregion
}
}
|