Статьи

Solr 4.2: API чтения структуры индекса

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

  1. Получить информацию обо всех полях, определенных в индексе
  2. Получить информацию для одного явно определенного поля

В первом случае мы должны использовать следующую команду:

$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, мы можем получить информацию о динамических полях. Опять же у нас есть варианты:

  1. Получить информацию обо всех динамических полях
  2. Получить информацию о конкретной динамической структуре поля

Чтобы получить всю информацию о динамических полях, мы должны использовать следующую команду:

$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 . Мы можем получить следующую информацию:

  1. Все типы полей, определенные в файле schema.xml
  2. Один тип

Чтобы получить все определенные типы полей, мы должны выполнить следующую команду:

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