Я пытаюсь индексировать дампы Википедии . Мой синтаксический анализатор SAX создает объекты Article для XML только с теми полями, которые мне нужны, а затем отправляет его на мой ArticleSink, который создает документы Lucene.
Я хочу отфильтровать специальные / мета-страницы, например, с префиксом Category:
или Wikipedia:
, поэтому я создал массив этих префиксов и проверил заголовок каждой страницы по этому массиву в моем ArticleSink, используя article.getTitle.startsWith(prefix)
. На английском все работает нормально, я получаю индекс Lucene со всеми страницами за исключением соответствующих префиксов.
На французском языке префиксы без акцента также работают (т. Е. Фильтруют соответствующие страницы), некоторые из акцентированных префиксов не работают вообще (например, Catégorie:
), а некоторые работают большую часть времени, но в некоторых не работают страниц (например, Wikipédia:
), но я не вижу никакой разницы между соответствующими строками (в less
).
Я не могу проверить все различия в файле из-за его размера (5 ГБ), но он выглядит как правильный XML UTF-8. Если я беру часть файла, используя grep
или head
, акценты правильные (даже на инкриминированных страницах <title>Catégorie:something</title>
правильно отображается grep
). С другой стороны, когда я воссоздаю исходный XML-файл вики-файла путем вырезания хвоста / головы, эта же страница (здесь Catégorie:Rock par ville
) фильтруется в небольшом файле, а не в оригинальном…
Есть идеи?
Альтернативы, которые я пробовал:
Получение файла (закомментированные строки были опробованы без успеха *):
FileInputStream fis = new FileInputStream(new File(xmlFileName));
//ReaderInputStream ris = ReaderInputStream.forceEncodingInputStream(fis, "UTF-8" );
//(custom function opening the stream,
//reading it as UFT-8 into a Reader and returning another byte stream)
//InputSource is = new InputSource( fis ); is.setEncoding("UTF-8");
parser.parse(fis, handler);
Отфильтрованные префиксы:
ignoredPrefix = new String[] {"Catégorie:", "Modèle:", "Wikipédia:",
"Cat\uFFFDgorie:", "Mod\uFFFDle:", "Wikip\uFFFDdia:", //invalid char
"Catégorie:", "Modèle:", "Wikipédia:", // UTF-8 as ISO-8859-1
"Image:", "Portail:", "Fichier:", "Aide:", "Projet:"}; // those last always work
* ERRATUM
На самом деле, плохо, что я попробовал работать, я проверил неправильный индекс:
InputSource is = new InputSource( fis );
is.setEncoding("UTF-8"); // force UTF-8 interpretation
parser.parse(fis, handler);