Как использовать Solr DataImportHandler с файлами XML? - PullRequest
1 голос
/ 28 сентября 2011

Я исследую использование DataImportHandler для импорта моих файлов данных, используя FileDataSource с FileListEntityProcessor и есть пара вопросов прежде чем я начну, я надеюсь, что вы, ребята, можете помочь с этим.

1) Я хотел бы поместить файл в локальную файловую систему в настроенном местоположение и пусть Solr увидит и обработает файл без дополнительных усилий моя часть. Это выполнимо каким-либо образом? Из того, что я видел, это не поддерживается и я должен вручную вызвать URL (например, http://foo/solr/dataimport?command=full-import). Ручной, основанный на URL метод вызова кажется совершенно логичным в ориентированный на базу данных мир, где можно запланировать обновление для регулярного запуска но в моем случае у меня есть пара идентичных индексов, я загружаю баланс между и не хочу выполнять один и тот же здоровенный запрос несколько раз параллельно. В качестве таких, Я делаю один запрос, записываю результаты в файл XML, отправляю этот файл к каждой коробке, а затем желая, чтобы этот файл был обработан. Я хотел бы, чтобы процесс быть максимально автоматизированным.

2) Я хотел бы, чтобы любые файлы, обработанные Solr, были удалены после того, как они были импортирован. Я не видел никакого способа сделать это в настоящее время. Я думал, что мог бы быть возможность подкласса что-то, но FileListEntityProcessor, например, кажется, не дает никаких ручек в нужное время в рабочем процессе, чтобы удалить файл. Где-нибудь еще я могу посмотреть?

3) Читая документацию DIH, я наткнулся на следующее утверждение: «Когда Команда delta-import выполняется, она считывает время начала, сохраненное в conf / dataimport.properties . Он использует эту временную метку для запуска дельта-запросов и после завершения обновляет отметку времени в conf / dataimport.properties . "Если он действительно обновляет дату до даты завершения, что происходит с любым файлы добавлены между начальной и конечной датами? Они потерялись?

4) Для дельта-импорта я не вижу упоминания о порядке обработки обработанных файлов. кроме этого он пытается не повторно импортировать файлы старше, чем указано в файл conf / dataimport.properties. В тех случаях, когда порядок имеет значение, делает ли это упорядочить файлы по имени или дате создания или ...?

Ответы [ 2 ]

1 голос
/ 28 сентября 2011

идея solr / lucene не в том, чтобы работать как база данных.Это индекс.Это означает, что это индекс для данных, которые располагаются где-то еще - независимо от возможности (индексировать и) сохранять данные в solr / lucene дополнительно для специальных функций (выделения и т. Д.).Поэтому нет встроенной возможности добавить отдельные документы и удалить эти документы после импорта.Кстати, рекомендуется хранить исходные документы в базе данных, файловой системе и т. Д. Возможно, вы сохраняете исходные документы, но не на сервере solr / lucene?!

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

Вы можете определить запланированное задание операционной системы (cronjob) для запуска дельта-импорта.

Я бы хотел, чтобы любые файлы, обработанные Solr, были удалены после того, как они 'я был импортирован

Я никогда не слышал о том, что Solr может сделать это.Как я писал выше, идея в том, что solr - это индекс данных, которые хранятся где-то еще.Таким образом, DIH ожидал данные / все документы в «где-то».Если вы удаляете исходные документы из «somewehere» и обновляете индекс, предполагаемая цель состоит в том, чтобы синхронизировать содержимое индекса с (теперь) доступными документами ...

Они потеряны?

Нет.

it reads the start time stored in conf/dataimport.properties. It uses that timestamp to run delta queries and after completion, updates the timestamp in conf/dataimport.properties."

Solr reads the start time, запустите delta queries and (... если он закончен, solr ...) updates (... время запуска...) as timestamp in conf/dataimport.properties."

упорядочивает файлы по имени или дате создания или ...?

Не уверен, но я думаю, что он читает файлыв заданном порядке из файловой системы

0 голосов
/ 20 октября 2011

Получил отличный ответ от Эрика Эриксона в списке рассылки Solr:

http://mail -archives.apache.org / mod_mbox / lucene-solr-user / 201109.mbox / browser

Ниже приведены конкретные ответы, но я бы серьезно подумал о том, чтобы написать собственную ловушку с поддержкой файловой системы, которая отправляла документы на известные серверы Solr, а не с помощью DIH для их извлечения.Вы можете использовать код из FileSystemEntityProcessor в качестве основы и перейти оттуда.FileSystemEntityProcessor на самом деле не предназначен для выполнения очень сложных задач .....

1> Не думайте, что это возможно OOB.Нет ничего встроенного в DIH, который вставляет хуки файловой системы и автоматически пытается его проиндексировать ....

2> Нет.DIH довольно прост в этом смысле в соответствии с FileListEntityProcessor.

3> Я почти уверен, что это не имеет отношения к FileSystemEntityProcessor, он действительно используется для импорта базы данных.

4> "в любом порядке Javaвозвращает их в ".Посмотрите на код FileListEntityProcessor, но соответствующий бит ниже.Так что порядок - это то, что делает Java, и я не знаю, какие гарантии даются.

  private void getFolderFiles(File dir, final List<Map<String,Object>> fileDetails) {
  // Fetch an array of file objects that pass the filter, however the
  // returned array is never populated; accept() always returns false.
  // Rather we make use of the fileDetails array which is populated as
  // a side affect of the accept method.
  dir.list(new FilenameFilter() {
    public boolean accept(File dir, String name) {
      File fileObj = new File(dir, name);
      if (fileObj.isDirectory()) {
        if (recursive) getFolderFiles(fileObj, fileDetails);
      } else if (fileNamePattern == null) {
        addDetails(fileDetails, dir, name);
      } else if (fileNamePattern.matcher(name).find()) {
        if (excludesPattern != null && excludesPattern.matcher(name).find())
          return false;
        addDetails(fileDetails, dir, name);
      }
      return false;
    }
  });
}
...