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:
- Pobieranie informacji na temat wszystkich pól
- 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:
- Pobranie informacji na temat wszystkich pól dynamicznych
- 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:
- Wszystkich typów pól zdefiniowanych w pliku schema.xml
- 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.