Может ли сырой индекс Lucene загружаться Solr?
У некоторых моих коллег есть большое веб-приложение Java, в котором используется поисковая система, созданная с помощью Lucene Java. Я бы хотел иметь хороший HTTP-интерфейс для доступа к этим существующим индексам поиска. Раньше я использовал Nutch и мне очень понравилось, как простая реализация OpenSearch заставила его получить результаты как RSS.
Я попытался установить Solr dataDir в файле solrconfig.xml, надеясь, что он с радостью подберет существующие файлы индексов, но, похоже, просто игнорирует их.
Мой главный вопрос:
Может ли Solr использоваться для доступа к индексам Lucene, созданным в другом месте? Или может быть лучшее решение?
Ответы
Ответ 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