Скорость индексации lucene.net снизилась - PullRequest
0 голосов
/ 11 октября 2011

Я использую Lucene.net для поиска в 50K сущностях . эти объекты сохраняются в базе данных. Я создал приложение, которое пытается индексировать 100 объектов каждый раз .

код очень прост:

var entityList = GetEntityList(100);

foreach (var item in entityList) 
    Indexer.IndexEntity(item);

А это класс индексатора:

public class Indexer {
    public void IndexEntity(Entity item)
    {
        IndexWriter writer;
        string path = ConfigurationManager.AppSettings["SearchIndexPath"];
        FSDirectory directory = FSDirectory.Open(new DirectoryInfo(path));
        Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_29);
        if (Directory.GetFiles(path).Length > 0)
            writer = new IndexWriter(directory, analyzer, false, IndexWriter.MaxFieldLength.UNLIMITED);
        else
            writer = new IndexWriter(directory, analyzer, true, IndexWriter.MaxFieldLength.UNLIMITED);
        Document document = new Document();
        document.Add(new Field("id", item.Id.ToString(), Field.Store.YES, Field.Index.NO, Field.TermVector.NO));
        document.Add(new Field("category", item.Category.Id.ToString(), Field.Store.YES, Field.Index.NO, Field.TermVector.NO));
        document.Add(new Field("location", item.Location.Id.ToString(), Field.Store.YES, Field.Index.NO, Field.TermVector.NO));
        document.Add(new Field("point", item.Point.ToString(), Field.Store.YES, Field.Index.NO, Field.TermVector.NO));
        document.Add(new Field("picture", item.PictureUrl, Field.Store.YES, Field.Index.NO, Field.TermVector.NO));
        document.Add(new Field("creationdate", item.CreationDate.ToString(), Field.Store.YES, Field.Index.NO, Field.TermVector.NO));
        document.Add(new Field("title", item.Title, Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.YES));
        document.Add(new Field("body", item.Body, Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.YES));
        string str2 = string.Empty;
        foreach (Tag tag in item.Tags)
        {
            if (!string.IsNullOrEmpty(str2))
            {
                str2 = str2 + "-";
            }
            str2 = str2 + tag.DisplayName;
        }
        document.Add(new Field("tags", str2, Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.YES));
        writer.AddDocument(document);
        writer.Optimize();
        writer.Close();
    }
}

Все было хорошо, и моя скорость поиска теперь достаточно хороша . но проблема в том, что скорость индексации уменьшается . мое приложение до сих пор индексирует около 15 тысяч объектов, а размер файлов индекса составляет около 600 МБ . Теперь, когда он хочет проиндексировать 100 новых сущностей, это занимает много времени 24 минут!

в чем проблема? заранее спасибо.

1 Ответ

5 голосов
/ 11 октября 2011

В вашем коде четко выделяются две вещи:

  1. Вы оптимизируете индекс после добавления каждого документа.В последних версиях Lucene есть очень веские причины, по которым вам вообще не следует оптимизировать свой индекс (для каждого сегмента кэширования), и, несмотря на эти причины, оптимизация индекса после добавления каждого документа является чрезмерным излишним
  2. Вы постояннооткрытие / закрытие / фиксация вашего индекса.Учитывая вашу циклическую конструкцию, почему бы не открыть средство записи индекса вне цикла, добавить сущности, а затем закрыть / зафиксировать.Если вам нужна более быстрая видимость индекса, вы можете добавить в цикл команду периодической фиксации (основываясь на каких-то модульных арифметических звуках, хорошо для меня.

С этими двумя изменениями, я думаю, вы увидитерезкое ускорение работы по индексированию.

...