С выпуском Solr 4.2 у нас появилась возможность использовать протокол HTTP для получения информации о структуре индекса Solr. Конечно, если кто-то хотел сделать это до Solr 4.2, этого можно было бы получить, загрузив файл schema.xml , проанализировав его и получив необходимую информацию. Однако, когда был выпущен Solr 4.2, у нас появился специальный API, который может возвращать необходимую нам информацию без необходимости анализа всего файла schema.xml .
Возможности
Давайте посмотрим на новый API на примере.
Получение информации в формате XML
Многие пользователи Solr привыкли получать свои данные в формате XML, по крайней мере, при использовании Solr HTTP API. Однако API схемы использует JSON в качестве формата по умолчанию. Для того, чтобы получить данные в формате XML во всех приведенных ниже примерах, вам нужно добавить к вызову параметр wt = xml , например, так:
$curl 'http://localhost:8983/solr/collection1/schema/fieldtypes?wt=xml'
Определенные поля информации
Давайте начнем с рассмотрения того, как получить информацию о полях, определенных в Solr. Для этого у нас есть следующие возможности:
- Получить информацию обо всех полях, определенных в индексе
- Получить информацию для одного явно определенного поля
В первом случае мы должны использовать следующую команду:
$curl 'http://localhost:8983/solr/collection1/schema/fields'
Во втором случае мы должны добавить символ / и имя поля к вышеуказанной команде. Например, чтобы получить информацию об авторском поле, мы должны использовать следующую команду:
$curl 'http://localhost:8983/solr/collection1/schema/fields/author'
Ответ Solr для первой команды будет похож на следующий:
{ "responseHeader":{ "status":0, "QTime":1}, "fields":[{ "name":"_version_", "type":"long", "indexed":true, "stored":true}, { "name":"author", "type":"text_general", "indexed":true, "stored":true}, { "name":"cat", "type":"string", "multiValued":true, "indexed":true, "stored":true}, { "name":"category", "type":"text_general", "indexed":true, "stored":true}, { "name":"id", "type":"string", "multiValued":false, "indexed":true, "required":true, "stored":true, "uniqueKey":true}, { "name":"url", "type":"text_general", "indexed":true, "stored":true}, { "name":"weight", "type":"float", "indexed":true, "stored":true}]}
С другой стороны, ответ для второй команды будет следующим:
{ "responseHeader":{ "status":0, "QTime":0}, "field":{ "name":"author", "type":"text_general", "indexed":true, "stored":true}}
Получение информации об определенных динамических полях
Подобно тому, какую информацию мы можем получить о полях, определенных в schema.xml, мы можем получить информацию о динамических полях. Опять же у нас есть варианты:
- Получить информацию обо всех динамических полях
- Получить информацию о конкретной динамической структуре поля
Чтобы получить всю информацию о динамических полях, мы должны использовать следующую команду:
$curl 'http://localhost:8983/solr/collection1/schema/dynamicfields'
Чтобы получить информацию о конкретном шаблоне, мы добавляем символ /, за которым следует шаблон, например, так:
$curl 'http://localhost:8983/solr/collection1/schema/dynamicfields/random_*'
Solr вернет следующий ответ для первого запроса:
{ "responseHeader":{ "status":0, "QTime":2}, "dynamicfields":[{ "name":"*_coordinate", "type":"tdouble", "indexed":true, "stored":false}, { "name":"ignored_*", "type":"ignored", "multiValued":true}, { "name":"random_*", "type":"random"}, { "name":"*_p", "type":"location", "indexed":true, "stored":true}, { "name":"*_c", "type":"currency", "indexed":true, "stored":true}]}
И следующий ответ будет возвращен для второй команды:
{ "responseHeader":{ "status":0, "QTime":1}, "dynamicfield":{ "name":"random_*", "type":"random"}}
Получение типов полей
Как вы, вероятно, догадались, аналогично описанным выше примерам, мы также можем получить информацию о типах полей, определенных в наших файлах schema.xml . Мы можем получить следующую информацию:
- Все типы полей, определенные в файле schema.xml
- Один тип
Чтобы получить все определенные типы полей, мы должны выполнить следующую команду:
$curl 'http://localhost:8983/solr/collection1/schema/fieldtypes'
Чтобы получить информацию об одном типе, мы должны снова добавить символ / и добавить к нему имя типа поля, например, так:
$curl 'http://localhost:8983/solr/collection1/schema/fieldtypes/text_gl'
Solr вернет следующую информацию в ответ на первую команду:
{ "responseHeader":{ "status":0, "QTime":3}, "fieldTypes":[{ "name":"alphaOnlySort", "class":"solr.TextField", "sortMissingLast":true, "omitNorms":true, "analyzer":{ "class":"solr.TokenizerChain", "tokenizer":{ "class":"solr.KeywordTokenizerFactory"}, "filters":[{ "class":"solr.LowerCaseFilterFactory"}, { "class":"solr.TrimFilterFactory"}, { "class":"solr.PatternReplaceFilterFactory", "replace":"all", "replacement":"", "pattern":"([^a-z])"}]}, "fields":[], "dynamicFields":[]}, { "name":"boolean", "class":"solr.BoolField", "sortMissingLast":true, "fields":["inStock"], "dynamicFields":["*_bs", "*_b"]}, { "name":"text_gl", "class":"solr.TextField", "positionIncrementGap":"100", "analyzer":{ "class":"solr.TokenizerChain", "tokenizer":{ "class":"solr.StandardTokenizerFactory"}, "filters":[{ "class":"solr.LowerCaseFilterFactory"}, { "class":"solr.StopFilterFactory", "words":"lang/stopwords_gl.txt", "ignoreCase":"true", "enablePositionIncrements":"true"}, { "class":"solr.GalicianStemFilterFactory"}]}, "fields":[], "dynamicFields":[]}, { "name":"tlong", "class":"solr.TrieLongField", "precisionStep":"8", "positionIncrementGap":"0", "fields":[], "dynamicFields":["*_tl"]}]}
В ответ на вторую команду Solr вернет следующее:
{ "responseHeader":{ "status":0, "QTime":2}, "fieldType":{ "name":"text_gl", "class":"solr.TextField", "positionIncrementGap":"100", "analyzer":{ "class":"solr.TokenizerChain", "tokenizer":{ "class":"solr.StandardTokenizerFactory"}, "filters":[{ "class":"solr.LowerCaseFilterFactory"}, { "class":"solr.StopFilterFactory", "words":"lang/stopwords_gl.txt", "ignoreCase":"true", "enablePositionIncrements":"true"}, { "class":"solr.GalicianStemFilterFactory"}]}, "fields":[], "dynamicFields":[]}}
Как видите, информация о количестве хороша, поскольку мы получаем всю информацию о типах полей и в дополнение к той информации, которую используют поля, дают поля (как динамические, так и нединамические.
Получение информации о copyFields
В дополнение к тому, что мы уже обсуждали, мы можем получить информацию о разделе copyFields из schema.xml . Для этого нужно выполнить следующую команду:
$curl 'http://localhost:8983/solr/collection1/schema/copyfields'
И в ответ мы получим следующие данные:
{ "responseHeader":{ "status":0, "QTime":1}, "copyfields":[{ "source":"author", "dest":"text"}, { "source":"cat", "dest":"text"}, { "source":"content", "dest":"text"}, { "source":"content_type", "dest":"text"}, { "source":"description", "dest":"text"}, { "source":"features", "dest":"text"}, { "source":"author", "dest":"author_s", "destDynamicBase":"*_s"}]}
Будущее
В Solr 4.3 описанный API был улучшен и в настоящее время готовится к тому, чтобы обеспечить не только чтение структуры индекса, но и запись его изменений с использованием HTTP-запросов. Мы можем ожидать эту функцию в одной из следующих версий Apache Solr, поэтому, на мой взгляд, ее стоит подождать, по крайней мере, тем, кто в ней нуждается.