Переиндексация с использованием lucene / удаление термина из индекса - PullRequest
1 голос
/ 01 июня 2011

Я надеюсь, что вы можете мне помочь, вот моя проблема:

edit: Теперь, когда я передумал, если есть способ удалить термин из индекса, он все равно будет работать.Есть способ сделать это?если есть, нет необходимости читать остальную часть вопроса.спасибо!

Вот что я собираюсь сделать: 1 - Я должен проиндексировать некоторые файлы при удалении стандартных стоп-слов.2 - После этого я должен посчитать частоту документов каждого термина и удалить те термины, которые имеют df <2 </p>

Как я это делаю:

1 - я индексирую файлы с помощью indexwriter, удаляя стандартные стоп-слова.2 - Я считаю df каждого термина и добавляю в список стоп-слов.3 - И затем я снова индексирую тексты, используя indexwriter, но с новым списком стоп-слов

Что на самом деле происходит:

При первом индексировании все идет по плану.Проблема в том, когда я пытаюсь индексировать во второй раз.Результат становится довольно непредсказуемым:

1) если я запускаю программу один раз, даже если у стоп-слов есть новые слова, удаляются только стоп-слова std.

2) если я запускаю программуво второй раз удаляются члены с df <2. </p>

Я печатаю термины в индексе дважды, один после индексации в первый раз и один после индексации во второй раз.

Когда я запускаюсь во второй раз, термины с df <2 кажутся удаленными в первом отпечатке (обратите внимание, что я добавляю термины с df <2 при индексации во второй раз, это не должно) казаться удаленными в первомпечать. </p>

Возможно, способ, которым я объяснил, был немного запутанным, я прошу вас сказать мне, если что-то не может быть понято.

Я надеюсь, что вы, ребята, можете мне помочь.Большое спасибо!

1 Ответ

1 голос
/ 02 июня 2011

При индексации документов во второй раз обязательно удалите первый экземпляр документа, в противном случае вы будете раздувать dfs для всех терминов.Вы можете удалить документы с помощью внешнего поля идентификатора: создайте Term с field = idfield & value = externalId, а затем используйте deleteDocument(Term) IndexWriter для удаления старого экземпляра;затем добавьте новый.Я не думаю, что есть способ явно удалить термины;они получены из документов.

В качестве оптимизации вы можете рассмотреть следующее: 1. Индексируйте все документы 2. Найдите все термины с df = 1 3. Удалите все документы с каждым таким термином, отслеживая их внешние идентификаторы документов 4. Добавьтеусловия в вашем стоп-листе 5. Переиндексируйте только ранее удаленные документы.

Конечно, сначала вы должны тщательно продумать вариант использования для удаления этих терминов.1. Почему это важно, если они встречаются в индексе?2. Что произойдет, если вы позже обновите индекс и добавите новый документ, который приводит к тому, что некоторый термин, который ранее имел df = 1, теперь имеет df = 2.Вы не сможете проиндексировать этот термин, поскольку он уже был бы в стоп-листе.

...