С выпуском 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, поэтому, на мой взгляд, ее стоит подождать, по крайней мере, тем, кто в ней нуждается.