Как эффективно сделать большой XML-файл доступным для поиска в веб-приложении?

1

У меня есть документ XML, и мне нужно сделать его доступным для поиска через webapp. Документ в настоящее время только 6mb.. но может быть экстремально большим, таким образом, из моего исследования SAX, кажется, путь.

Поэтому мой вопрос заключается в следующем:

  1. Я загружаю документ в память один раз (в список фасоли, а затем сохраняю его в памяти)? А затем искать его когда нужно? или

  2. Разберите документ, который ищет желаемый поисковый запрос, и добавьте совпадения в список бобов? И повторите этот процесс при каждом поиске?

Я не так разбираюсь в webapps, но я пытаюсь найти оптимальный способ приблизиться к этому, у кого-нибудь с Tomcat, SAX и Java Web-приложениями есть какие-то предложения относительно оптимального?

С уважением, Нейт

  • 0
    что вы хотите искать в файле XML? просто интересно, может ли помочь регулярное выражение?
  • 1
    «Чрезвычайно большой» означает предварительную обработку. В терминах SQL это позволит избежать полного сканирования таблицы.
Показать ещё 3 комментария
Теги:
sax

3 ответа

1
Лучший ответ

Когда вы говорите, что ваш XML файл может быть очень большим, я предполагаю, что вы не хотите хранить его в памяти. Если вы хотите, чтобы он был доступен для поиска, я понимаю, что вы хотите индексировать доступ без полного чтения в каждый момент. IMHO, единственный способ добиться этого - проанализировать файл и загрузить данные в облегченную базу данных файлов (Derby, HSQL или H2) и добавить соответствующие индексы в базу данных. Базы данных позволяют индексировать поиск в неактивных данных, а файлы XML - нет.

1

Предполагая, что ваше поле поиска - это поле, которое вам известно, например, пусть структура xml:

<a>....</a>
<x>
<y>search text1</y>
<z>search text2</z>
</x>
<b>...</b>

и скажем, что поиск должен выполняться на "х" и его дочерних элементах, вы можете добиться этого с помощью анализатора STAX и JAXB.

Чтобы понять разницу между STAX и SAX, обратитесь к:

Когда следует выбирать SAX над StAX?

Используя эти API, вы избежите хранения всего документа в памяти. Используя анализатор STAX, вы разбираете документ, когда вы сталкиваетесь с тегом "x", загружаете его в память (java beans) с помощью JAXB.

Примечание. Только x и его дети будут загружены в память, а не весь документ, обработанный до сих пор. Не используйте какие-либо подходы, которые используют парсеры DOM.

Пример кода для загрузки только той части документа, где находится поле поиска.

XMLInputFactory xif = XMLInputFactory.newFactory();
StreamSource xml = new StreamSource("file");
XMLStreamReader xsr = xif.createXMLStreamReader(xml);
xsr.nextTag();
while(!xsr.getLocalName().equals("x")) {
    xsr.nextTag();
}

JAXBContext jc = JAXBContext.newInstance(X.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
JAXBElement<Customer> jb = unmarshaller.unmarshal(xsr, X.class);
xsr.close();

X x = jb.getValue();
System.out.println(x.y.content);

Теперь у вас есть полевое содержимое для возврата соответствующего поля. Когда пользователь снова ищет одно и то же поле под символом "x", дайте результаты из памяти и не повторите синтаксический анализ XML.

0

Поиск файла с использованием XPath или XQuery, вероятно, будет очень быстрым (достаточно быстро, если вы не говорите о тысячах транзакций в секунду). Требуется время - разбор файла - создание дерева в памяти, чтобы XPath или XQuery могли его искать. Поэтому (как говорили другие) многое зависит от того, как часто изменяется содержимое файла. Если изменения нечасты, вы должны иметь возможность хранить копию файла в общей памяти, поэтому стоимость синтаксического анализа амортизируется во многих поисках. Но если изменения часты, все усложняется. Вы можете попытаться сохранить копию необработанного XML на диске и копию проанализированного XML в памяти и синхронизировать два. Или вы можете укусить пулю и перейти к использованию базы данных XML - первоначальное усилие окупится в конце.

Ваш комментарий, что "SAX - это путь", будет прав, если вы хотите анализировать файл каждый раз, когда вы его просматриваете. Если вы это делаете, вам нужен самый быстрый способ анализа файла. Но гораздо лучший путь вперед - это не анализировать его повторно при каждом поиске.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню