我正在尝试尽可能压缩索引大小,需要帮助吗?https://lucenenet.apache.org/docs/4.8.0-beta00013/api/core/Lucene.Net.Codecs.Compressing.CompressionMode.html#Lucene_Net_Codecs_Compressing_CompressionMode_HIGH_COMPRESSION
public class LuceneIndexer
{
private Analyzer _analyzer = new ArabicAnalyzer(Lucene.Net.Util.LuceneVersion.LUCENE_48);
private string _indexPath;
private Directory _indexDirectory;
public IndexWriter _indexWriter;
public LuceneIndexer(string indexPath)
{
this._indexPath = indexPath;
_indexDirectory = new SimpleFSDirectory(new System.IO.DirectoryInfo(_indexPath));
}
public void BuildCompleteIndex(IEnumerable<Document> documents)
{
IndexWriterConfig indexWriterConfig = new IndexWriterConfig(Lucene.Net.Util.LuceneVersion.LUCENE_48, _analyzer) { OpenMode = OpenMode.CREATE_OR_APPEND };
indexWriterConfig.MaxBufferedDocs = 2;
indexWriterConfig.RAMBufferSizeMB = 128;
indexWriterConfig.MaxThreadStates = 2;
_indexWriter = new IndexWriter(_indexDirectory, indexWriterConfig);
_indexWriter.AddDocuments(documents);
_indexWriter.Flush(true, true);
_indexWriter.Commit();
_indexWriter.Dispose();
}
public IEnumerable<Document> Search(string searchTerm, string searchField, int limit)
{
IndexReader indexReader = DirectoryReader.Open(_indexDirectory);
var searcher = new IndexSearcher(indexReader);
var termQuery = new TermQuery(new Term(searchField, searchTerm)); // Lucene.Net.Util.LuceneVersion.LUCENE_48, searchField, _analyzer
var hits = searcher.Search(termQuery, limit).ScoreDocs;
var documents = new List<Document>();
foreach (var hit in hits)
{
documents.Add(searcher.Doc(hit.Doc));
}
_analyzer.Dispose();
return documents;
}
}
1条答案
按热度按时间1tuwyuhd1#
首先要知道的是,Lucene索引有很多方面。当不使用复合文件时,这体现在创建的各种文件中。只看其中的两个,我们可以讨论称为发布的倒排索引,我们可以讨论存储的文档。在这两个中,据我所知,没有任何关于倒排索引压缩的可调设置。
HIGH_COMPRESSION模式与存储字段有关。如果您不存储字段,而只是使用Lucene.Net创建倒排索引,那么为存储字段启用高压缩并不会减少“Lucene索引”的大小。
也就是说,如果您 * 正在 * 存储字段,并希望对存储字段数据使用高压缩,那么您需要创建自己的编解码器,为存储字段启用高压缩。您首先需要一个启用了高压缩的Stored fields类。下面是这两个类,后面是一个单元测试,它使用了我为您编写的新编解码器。我还没有'我没有在大量数据上尝试过这段代码来查看效果,我把这段代码留给您作为练习,但这应该为使用High Compression对存储字段进行压缩指明了方向。
以下是使用此“高压缩”格式的自定义编解码器:
感谢@NightOwl888,我现在明白,您还需要在启动时注册新的编解码器,如下所示:
以下是演示高压缩编解码器使用的单元测试:
虽然我最初的回答是通过Lucene.Net github issue,但我在这里提供了答案,它将对Lucene .NET社区有更好的可见性,希望它也能帮助其他人。对于那些感兴趣的人,在该问题的线程的末尾有更多关于使用自定义编解码器的背景信息。