Solr 4.2: Schema API

Wraz z premierą Solr 4.2 dostaliśmy możliwość wykorzystania protokołu HTTP do pobierania informacji o strukturze indeksu Solr. Oczywiście, jeżeli ktoś potrzebował takiej funkcjonalności przez Solr 4.2 mógł pobrać plik schema.xml za pomocą odpowiedniego zapytania, przetworzyć go i wydobyć szukane informacje. Wraz z premierą Solr 4.2 dostaliśmy jednak bardzo wygodne narzędzie za pomocą którego jesteśmy w stanie wydobyć interesujące nas informacje bez konieczności przetwarzania całego pliku schema.xml.

Możliwości

Przyjrzymy się zatem nowemu API.

Zwracanie informacji w formacie XML

Bardzo dużo użytkowników Solr przyzwyczajonych jest do tego, iż dane z Solr zwracane są domyślnie w formacie XML, co nie jest prawdą w przypadku opisywanego API, którego domyślny format zwracanych danych to JSON. Jeżeli chcemy, aby powyżej opisane informacje zwracane były w formacie XML należy do każdego z wymienionych zapytań dodać parametr wt=xml, na przykład:

$curl 'http://localhost:8983/solr/collection1/schema/fieldtypes?wt=xml'

Pobieranie zdefiniowanych pól

Zacznijmy od pobierania informacji na temat pól zdefiniowanych w indeksie. W tym celu udostępnione zostały dwie możliwości:

  1. Pobieranie informacji na temat wszystkich pól
  2. Pobieranie informacji na temat konkretnego pola

W pierwszym wypadku należy zadać następujące zapytanie:

$curl 'http://localhost:8983/solr/collection1/schema/fields'

W drugim przypadku wystarczy do powyższego zapytania dodać znak / oraz nazwę pola. Na przykład, aby pobrać dane na temat pola author należałoby wysłać następujące zapytanie:

$curl 'http://localhost:8983/solr/collection1/schema/fields/author'

Odpowiedź Solr na pierwsze zapytanie wygląda następująco:

{
  "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}]}

Natomiast odpowiedź na zapytanie dotyczące pojedynczego pola wygląda następująco:

{
  "responseHeader":{
    "status":0,
    "QTime":0},
  "field":{
    "name":"author",
    "type":"text_general",
    "indexed":true,
    "stored":true}}

Pobieranie zdefiniowanych pól dynamicznych

Dokładnie tak samo, jak w powyższym przypadku wygląda sytuacja kiedy chcemy pobrać informacje na temat pól dynamicznych. Także i w tym przypadku mamy dwie możliwości:

  1. Pobranie informacji na temat wszystkich pól dynamicznych
  2. Pobranie informacji na temat konkretnego wzorca pola dynamicznego

W pierwszym wypadku należy zadać następujące zapytanie:

$curl 'http://localhost:8983/solr/collection1/schema/dynamicfields'

W drugim przypadku, podobnie jak wcześniej, dodajemy znak /, a następnie wzorzec:

$curl 'http://localhost:8983/solr/collection1/schema/dynamicfields/random_*'

Odpowiedź Solr na pierwsze zapytanie wygląda następująco:

{
  "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}]}

Natomiast odpowiedź na zapytanie dotyczące pojedynczego pola wygląda następująco:

{
  "responseHeader":{
    "status":0,
    "QTime":1},
  "dynamicfield":{
    "name":"random_*",
    "type":"random"}}

Pobieranie typów pól

Jak można się domyślać, podobnie jak w wyżej wymienionych przypadkach, tak samo w przypadku pobierania informacji na temat typów pól możemy dostać od Solr informacje na temat:

  1. Wszystkich typów pól zdefiniowanych w pliku schema.xml
  2. Pojedynczego zdefiniowanego typu

W pierwszym wypadku należy zadać następujące zapytanie:

$curl 'http://localhost:8983/solr/collection1/schema/fieldtypes'

W drugim przypadku, na dokładnie takiej samej zasadzie dodajemy znak /, a następnie nazwę typu:

$curl 'http://localhost:8983/solr/collection1/schema/fieldtypes/text_gl'

Odpowiedź Solr na pierwsze zapytanie wygląda następująco:

{
  "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"]}]}

Natomiast odpowiedź na zapytanie dotyczące pojedynczego pola wygląda następująco:

{
  "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":[]}}

Jak widać ilość zwracanych informacji jest dość duża 🙂

Pobieranie informacji na temat sekcji copyField

Dodatkowo za pomocą opisywanego API jesteśmy w stanie pobrać informacje na temat sekcji copyField poprzez wysłanie następującego zapytania:

$curl 'http://localhost:8983/solr/collection1/schema/copyfields'

Odpowiedź na powyższe zapytanie jest następująca:

{
  "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"}]}

Przyszłość

W Solr 4.3 opisywane API zostało usprawnione oraz jest przygotowywane do umożliwienia zmian w strukturze indeksu za pomocą protokołu HTTP. Możemy zatem spodziewać się, iż w jednej z kolejnych wersji serwera wyszukiwania Solr otrzymamy możliwość łatwej zmiany struktury indeksu, przynajmniej takich, które nie będą powodować konfliktów z już zaindeksowanymi danymi.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

We use cookies to personalise content and ads, to provide social media features and to analyse our traffic. We also share information about your use of our site with our social media, advertising and analytics partners. View more
Cookies settings
Accept
Privacy & Cookie policy
Privacy & Cookies policy
Cookie name Active
Save settings
Cookies settings