Может ли Solr загружать необработанный индекс Lucene? - PullRequest
27 голосов
/ 26 апреля 2010

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

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

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

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

Ответы [ 4 ]

26 голосов
/ 27 апреля 2010

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

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

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

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

11 голосов
/ 26 апреля 2010

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

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

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

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

1 голос
/ 11 марта 2016

Три шага в конце:

  1. Изменить схему.xml или ( управляемая схема )
  2. Изменить <<a href="https://cwiki.apache.org/confluence/display/solr/DataDir+and+DirectoryFactory+in+SolrConfig" rel="nofollow"> dataDir > в solrconfig.xml
  3. Перезапустить Solr

У меня есть учебные заметки здесь для тех, кто плохо знаком с 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()));
    }
}
0 голосов
/ 24 марта 2016
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

солнечная директория конфигурации

<directoryFactory name="DirectoryFactory"

класс = "$ {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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...