Lucene медленный поиск документов по идентификатору - PullRequest
0 голосов
/ 05 июля 2018

Я индексирую данные и заметил, что поиск занимает много времени. Я храню содержимое и путь к файлу для файлов.

document.add(new StringField(SearchField.FILE_ABSOLUTE_PATH.getName(), fileData.getFilePath().toString(), Field.Store.YES));
document.add(new TextField(SearchField.CONTENT.getName(), fileData.getContent(), Field.Store.YES));

После завершения поиска он перебирает идентификаторы документов и извлекает путь к файлу, сохраненный в поле. Этот цикл занимает очень много времени.

final TotalHitCountCollector collector = new TotalHitCountCollector();

searcher.search(query, collector);

final TopDocs docs = searcher.search(query, Math.max(1, collector.getTotalHits()));

final ScoreDoc[] hits = docs.scoreDocs;

final SearchResult[] result = new SearchResult[hits.length];

for(int i = 0; i < result.length; i++)
{
    final Document document = reader.document(hits[i].doc);
    result[i] = new SearchResult(Paths.get(document.get(SearchField.FILE_ABSOLUTE_PATH.getName())));
}

Мне интересно, сколько времени уходит на получение документов, потому что приходится загружать все содержимое файла с диска, даже если у меня нет доступа к полю CONTENT. Если это проблема, то мне, возможно, придется изменить способ хранения данных.

Что может быть причиной этого?

1 Ответ

0 голосов
/ 05 июля 2018

Да, если поле содержимого длинное, это, вероятно, замедляет работу.

Здесь доступны два решения:

  1. Если вам никогда не нужно получать контент из индекса, вам нужно только выполнить его поиск, вам нужно изменить это поле, чтобы оно не сохранялось:

    document.add(new TextField(SearchField.CONTENT.getName(), fileData.getContent(), Field.Store.NO));
    

    Это уменьшит размер результата, переданного обратно из индекса, а также уменьшит размер самого индекса.

  2. Если вам нужно нужно, чтобы поле содержимого было сохранено, но просто не нужно его содержимое для этого вызова, вы можете передать Set<String>, содержащее имена полей для необходимые вам поля возвращены с IndexReader.document

    Set<String> getFields = Set.of({SearchField.FILE_ABSOLUTE_PATH.getName()});
    for(int i = 0; i < result.length; i++)
    {
        final Document document = reader.document(hits[i].doc, getFields);
        ...
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...