Ответ 1
Функция schemaless была в Solr с версии 4.3. Но он может быть более стабильным только сейчас, когда проблема a concurrency была исправлена в 4.10.
Он также называется управляемой схемой. Когда вы настраиваете Solr для использования управляемой схемы, Solr использует специальный UpdateRequestProcessor для перехвата запросов индексирования документов, и он угадывает типы полей.
Solr начинается с вашего файла schema.xml
и создает новый файл, по умолчанию, managed-schema
, чтобы сохранить всю информацию о предполагаемой схеме. Этот файл автоматически перезаписывается Solr, поскольку он обнаруживает изменения в схеме.
Затем вы должны использовать API схемы, если хотите внести изменения в схему. См. Также документа Схематический режим.
Как изменить управляемую схему Solr на классическую схему
Стоп Solr: $ bin/solr stop
Перейдите к server/solr/mycore/conf
, где "mycore" - это имя вашего ядра/коллекции.
Изменить solrconfig.xml
:
- найдите
<schemaFactory class="ManagedIndexSchemaFactory">
и прокомментируйте весь элемент - найдите
<schemaFactory class="ClassicIndexSchemaFactory"/>
и раскомментируйте его - найдите элемент
<initParams>
, который ссылается наadd-unknown-fields-to-the-schema
, и закомментируйте все<initParams>...</initParams>
Переименуйте managed-schema
в schema.xml
, и все готово.
Теперь вы можете снова запустить Solr: $ bin/solr start
, перейдите в http://localhost:8983/solr/#/mycore/documents и убедитесь, что Solr теперь отказывается индексировать документ с новым полем, еще не указанным в schema.xml
.
Это хорошая практика? Когда его использовать?
Это зависит от того, что вы хотите. Если вы хотите применить определенную структуру документа (например, чтобы убедиться, что все документы "правильно сформированы" в соответствии с вашим определением), вы хотите использовать классическое управление схемой.
Если, с другой стороны, вы не знаете заранее, что такое структура документа, вы можете использовать функцию без схемы.
Ограничения
Пока он называется schema-less, существуют ограничения на типы структур, которые вы можете индексировать. Это верно и для Solr, и для Elasticsearch, между прочим. Например, если вы сначала указали этот документ:
{"name":"John Doe"}
тогда вы получите сообщение об ошибке, если попытаетесь проиндексировать следующий документ следующим образом:
{"name": {
"first": "Daniel",
"second": "Dennett"
}
}
Это связано с тем, что в первом случае поле name
имеет строку типа, а во втором случае это объект.
Если вы хотите использовать индексацию, которая выходит за рамки этих ограничений, вы можете использовать SIREn - это с открытым исходным кодом, полуструктурированный механизм поиска информации, который реализован как плагин для Solr и Elasticsearch. (Отказ от ответственности: я работал в компании, которая разрабатывает SIREn)