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.