Я использую SOLR из Python (CPython) и из Scala (JVM). В обоих случаях я использую один и тот же API, а именно HTTP-клиент. Другими словами URL, такие как http://www.example.com:8080/solr/datacore/select?q=DocID:*&fl=DocID,Descr
URL создаются посредством композиции. Для запроса есть dict, содержащий имена полей в качестве ключей и совпадающие в качестве значений. Например, приведенный выше запрос будет выглядеть как {"DocID": "*"}. Этот dict соединяется с AND между каждым ключом. На самом деле значения - это списки, которые объединяются с использованием ИЛИ, поэтому более сложный запрос, такой как
{"DocType": ["Book","Paper",Letter"], "Length": ["[0 TO 200000]"]}
Превратится в запрос SOLR, как
DocType:Book OR Paper OR Letter AND Length:[0 TO 200000]
Композиция выполняется с простым объектом, где каждый метод возвращает себя, например:
def onlybooks(self):
self.querydict["DocType"] = "Book"
return self
Затем он используется в цепочке методов, например:
solrquery = onlybooks().specifiedauthor(params).biggestdoc(200000)
Все, кроме этого, является излишним и скрывает слишком много того, что происходит в неясной библиотеке, которую вы не сможете понять, не изучив ее код. Достаточно сложно понять всю мощь языка запросов SOLR и как эффективно его использовать. Не размещайте библиотеку между вами и SOLR, если для написания некоторых вспомогательных методов для создания URL-адреса запроса требуется всего лишь страница кода.
Кстати, если вы используете библиотеку и для ее работы требуется увидеть схему SOLR, не включайте схему SOLR в файл с вашим приложением. Просто получите его прямо с сервера в вашем приложении и кешируйте локально.