Подключение к облачной коллекции solr с помощью pysolr

Я настроил многоядерное облако solr. Создал коллекцию с 2-мя шрадами и без репликации. Облако в пользовательском интерфейсе solr

Через пользовательский интерфейс solr 192.168.1.56:8983 я могу получить результаты по запросу.

Я хочу сделать то же самое с pysolr, поэтому попробовал выполнить следующее:

import pysolr
zookeeper = pysolr.ZooKeeper("192.168.1.56:2181,192.168.1.55:2182")
solr = pysolr.SolrCloud(zookeeper, "random_collection")

последняя строка не может найти коллекцию, даже если она есть. Ниже приведена трассировка ошибки:

---------------------------------------------------------------------------
SolrError                                 Traceback (most recent call last)
<ipython-input-43-9f03eca3b645> in <module>()
----> 1 solr = pysolr.SolrCloud(zookeeper, "patent_colllection")

/usr/local/lib/python2.7/dist-packages/pysolr.pyc in __init__(self, zookeeper, collection, decoder, timeout, retry_timeout, *args, **kwargs)
   1176 
   1177     def __init__(self, zookeeper, collection, decoder=None, timeout=60, retry_timeout=0.2, *args, **kwargs):
-> 1178         url = zookeeper.getRandomURL(collection)
   1179 
   1180         super(SolrCloud, self).__init__(url, decoder=decoder, timeout=timeout, *args, **kwargs)

/usr/local/lib/python2.7/dist-packages/pysolr.pyc in getRandomURL(self, collname, only_leader)
   1315 
   1316     def getRandomURL(self, collname, only_leader=False):
-> 1317         hosts = self.getHosts(collname, only_leader=only_leader)
   1318         if not hosts:
   1319             raise SolrError('ZooKeeper returned no active shards!')

/usr/local/lib/python2.7/dist-packages/pysolr.pyc in getHosts(self, collname, only_leader, seen_aliases)
   1281         hosts = []
   1282         if collname not in self.collections:
-> 1283             raise SolrError("Unknown collection: %s", collname)
   1284         collection = self.collections[collname]
   1285         shards = collection[ZooKeeper.SHARDS]

SolrError: (u'Unknown collection: %s', 'random_collection')

Версия Solr - 6.6.2, а версия zookeeper - 3.4.10.

Как создать соединение с облачной коллекцией solr?


person Pramod Patil    schedule 13.11.2017    source источник
comment
Кажется, pysolr смотрит на clusterstate.json - насколько я знаю, Solr теперь вместо этого использует отдельный state.json в каждом каталоге коллекции. Если вы просматриваете свои узлы zookeeper вручную, я предполагаю, что нет clusterstate.json и только state.json для каждой коллекции.   -  person MatsLindh    schedule 13.11.2017
comment
state.json существует для каждой коллекции и его правильный, но clusterstate.json пуст, что мне писать в нем? @MatsLindh   -  person Pramod Patil    schedule 13.11.2017
comment
Вы не должны ничего писать в нем - необходимо обновить pysolr для поддержки нового формата информации о кластере. Пока это не сделает pysolr, вы можете отказаться от интеграции Zookeeper и сделать обычный HTTP-запрос к одному из узлов напрямую, а Solr обработает распределение и информацию о состоянии кластера за вас.   -  person MatsLindh    schedule 13.11.2017
comment
Проблема в том, что даже в веб-интерфейсе clusterstate.json пуст, тогда как в state.json он показывает 2 активных узла и соответствующую информацию. Это похоже на то, что выполнение HTTP-запросов решит проблему после некоторых запросов, когда я попробую pysolr?   -  person Pramod Patil    schedule 13.11.2017
comment
Нет, clusterstate.json больше не используется. pysolr следует вместо этого добавить поддержку чтения state.json для каждой коллекции. Если вы проигнорируете поддержку zookeeper в pysolr и воспользуетесь обычным http-интерфейсом, Solr направит запрос за вас внутри себя.   -  person MatsLindh    schedule 13.11.2017
comment
да я получил его. спасибо @MatsLindh   -  person Pramod Patil    schedule 14.11.2017


Ответы (3)


Pysolr в настоящее время не поддерживает внешний кластер zookeeper. Pysolr проверяет коллекции в clusterstate.json, которые Solr импровизировал в state.json для каждого кластера, а clusterstate.json остается пустым.

Чтобы решить вашу проблему для одной коллекции, вы можете жестко закодировать переменную ZooKeeper.CLUSTER_STATE в pysolr.py следующим образом:

ZooKeeper.CLUSTER_STATE = '/collections/random_collection/state.json'

pysolr.py можно найти по адресу /usr/local/lib/python2.7/dist-packages и, возможно, попробуйте переустановить его с помощью

pip install -e /usr/local/lib/python2.7/dist-packages/pysolr.py
person Ashutosh    schedule 14.11.2017
comment
pysolr поддерживает внешний кластер zookeeper, не так ли? IP-адреса, которые вы ему даете, могут не совпадать с IP-адресами серверов Solr? Единственное изменение заключается в том, что Solr перешел в состояние кластера для каждой коллекции, что аккуратно решает ваш хак :-) - person MatsLindh; 14.11.2017

Обычный HTTP-клиент хорошо работает даже с SolrCloud.

Это было протестировано с Solr 7.5 и PySolr 3.9.0:

import pysolr

solr_url="https://my.solr.url"
collection = "my_collection"
solr_connection = pysolr.Solr("{}/solr/{}".format(solr_url, collection), timeout=10)
results = solr_connection.search(...)

print(results.docs)
person arghtype    schedule 18.10.2020

Лучше всего было бы кормить эти коллекции обычным способом:

import pysolr
import json

zookeeper = pysolr.ZooKeeper("ZK_STRING")
collections = {}
for c in zookeeper.zk.get_children("collections"):
    collections.update(json.loads(zookeeper.zk.get("collections/{}/state.json".format(c))[0].decode("ascii")))
zookeeper.collections = collections
person lsalamon    schedule 21.01.2020