Подтвердить что ты не робот

Может ли сырой индекс Lucene загружаться Solr?

У некоторых моих коллег есть большое веб-приложение Java, в котором используется поисковая система, созданная с помощью Lucene Java. Я бы хотел иметь хороший HTTP-интерфейс для доступа к этим существующим индексам поиска. Раньше я использовал Nutch и мне очень понравилось, как простая реализация OpenSearch заставила его получить результаты как RSS.

Я попытался установить Solr dataDir в файле solrconfig.xml, надеясь, что он с радостью подберет существующие файлы индексов, но, похоже, просто игнорирует их.

Мой главный вопрос:

Может ли Solr использоваться для доступа к индексам Lucene, созданным в другом месте? Или может быть лучшее решение?

4b9b3361

Ответ 1

Я никогда не пробовал этого, но вам нужно будет отрегулировать schema.xml, чтобы включить все поля документов, которые находятся в вашем индексе Lucene, потому что Solr не позволит вам искать поле, если оно не определенном в schema.xml.

Корректировка schema.xml также должна включать определение анализаторов времени запроса для правильного поиска в вашем поле, особенно если поле, где индексируется с использованием пользовательских анализаторов.

В файле solrconfig.xml вам может потребоваться изменить настройки в разделах indexDefaults и mainIndex.

Но я был бы рад прочитать ответы от людей, которые действительно это сделали.

Ответ 2

Успех! С предложением Pascal об изменениях в schema.xml я получил его в кратчайшие сроки. Спасибо!

Вот мои полные шаги для всех, кого это интересует:

  • Загружено Solr и скопировано dist/apache-solr-1.4.0.war в tomcat/webapps
  • Скопированный пример /solr/conf в/usr/local/solr/
  • Скопированные ранее существующие файлы индекса Lucene в /usr/local/solr/data/index
  • Установите solr.home в /usr/local/solr
  • В файле solrconfig.xml изменен dataDir на /usr/local/solr/data (Solr ищет индексный каталог внутри)
  • Загрузил индексы Lucene в Luke для просмотра (отличный инструмент)
  • В примере schema.xml удалены все поля и типы полей, кроме "string"
  • В примере schema.xml добавлено 14 определений полей, соответствующих 14 полям, показанным в Luke. Пример: <field name="docId" type="string" indexed="true" stored="true"/>
  • В примере schema.xml изменилось uniqueKey на поле в моем индексе, который, казалось, был идентификатором документа
  • В примере schema.xml изменился defaultSearchField на поле в моем индексе, который, казалось, содержал термины
  • Начинал tomcat, наконец, не видел исключений и успешно выполнял некоторые запросы в localhost: 8080/solr/admin

Это просто доказательство для меня, что он может работать. Очевидно, что еще предстоит сделать больше.

Ответ 3

Три этапа в конце:

У меня есть мои заметки по изучению здесь для тех, кто новичок в Solr, вроде меня:)
Чтобы генерировать некоторые индексы lucene самостоятельно, вы можете использовать мой код здесь.

public class LuceneIndex {
    private static Directory directory;

    public static void main(String[] args) throws IOException {
        long startTime = System.currentTimeMillis();

        // open
        Path path = Paths.get("/tmp/myindex/index");
        directory = new SimpleFSDirectory(path);
        IndexWriter writer = getWriter();

        // index
        int documentCount = 10000000;
        List<String> fieldNames = Arrays.asList("id", "manu");

        FieldType myFieldType = new FieldType();
        myFieldType.setIndexOptions(IndexOptions.DOCS_AND_FREQS);
        myFieldType.setOmitNorms(true);
        myFieldType.setStored(true);
        myFieldType.setTokenized(true);
        myFieldType.freeze();

        for (int i = 0; i < documentCount; i++) {
            Document doc = new Document();
            for (int j = 0; j < fieldNames.size(); j++) {
                doc.add(new Field(fieldNames.get(j), fieldNames.get(j) + Integer.toString(i), myFieldType));
            }
            writer.addDocument(doc);
        }
        // close
        writer.close();
        System.out.println("Finished Indexing");
        long estimatedTime = System.currentTimeMillis() - startTime;
        System.out.println(estimatedTime);
    }
    private static IndexWriter getWriter() throws IOException {
        return new IndexWriter(directory, new IndexWriterConfig(new WhitespaceAnalyzer()));
    }
}

Ответ 4

I am trying the same steps with HDF as the home directory and locktype as HDFS but no luck. I see the below error

labs_shard1_replica1: org.apache.solr.common.SolrException:org.apache.solr.common.SolrException: Index dir 'hdfs://127.0.0.1/user/solr/labs/core_node1/data/index/' of core 'labs_shard1_replica1' is already locked. The most likely cause is another Solr server (or another solr core in this server) also configured to use this directory; other possible causes may be specific to lockType: hdfs

конфигурация Solar dir

<directoryFactory name="DirectoryFactory"

class= "$ {solr.directoryFactory: solr.NRTCachingDirectoryFactory}" >    

, но не с HDFS, как показано ниже

<directoryFactory name="DirectoryFactory" class="solr.HdfsDirectoryFactory">
                <str name="solr.hdfs.home">hdfs://127.0.0.1/user/solr</str>
                <bool name="solr.hdfs.blockcache.enabled">true</bool>
                <int name="solr.hdfs.blockcache.slab.count">1</int>
                <bool name="solr.hdfs.blockcache.direct.memory.allocation">false</bool>
                <int name="solr.hdfs.blockcache.blocksperbank">16384</int>
                <bool name="solr.hdfs.blockcache.read.enabled">true</bool>
                <bool name="solr.hdfs.blockcache.write.enabled">false</bool>
                <bool name="solr.hdfs.nrtcachingdirectory.enable">true</bool>
                <int name="solr.hdfs.nrtcachingdirectory.maxmergesizemb">16</int>
                <int name="solr.hdfs.nrtcachingdirectory.maxcachedmb">192</int>
            </directoryFactory>

Тип блокировки  HDFS