query examples of using solr and ignite with python
загрузка образа docker
docker pull solr
запустим образ и загрузим тестовые данные в БД
mkdir solrdata
sudo chown 8983:8983 sorldata
docker run -d -v "$PWD/solrdata:/var/solr" -p 8983:8983 --name my_solr solr:8 solr-precreate gettingstarted
$ docker exec -it my_solr post -c gettingstarted example/exampledocs/manufacturers.xml
далее можно открыть админ-панель и поработать с запросами к стартовым данным
для работы с solr из python с помощью библиотеки pysolr подготовим данные на основе статей wikipedia
ноутбук "extract data from wikipedia.ipynb"
загрузим данные в solr, используя библиотеку pysolr
ноутбук "solr requests.ipynb"
пример использования
# импортируем библиотеки
import pysolr
# Создаем клиент solr, указывая адрес, порт и название core (можно посмотреть в Web-интерфейсе)
solr = pysolr.Solr('http://0.0.0.0:8983/solr/gettingstarted/', always_commit=True)
# Проверим доступность solr
solr.ping()
# загрузим подготовленные данные статей википедии
with open('./wikipages_50.json', "r") as f:
pages = json.load(f)
# выполним добавление всех данных из каждой страницы
for k,v in tqdm(pages.items()):
solr.add([
{
"id": "doc_" + k,
"title": v['meta']['title'],
"categories": v['meta']['categories'],
"text": v["content"]
}])
# выполним запрос, указав заголовок документа
print("page 31 title original: ", pages["31"]["meta"]["title"])
for res in solr.search('title:'+pages["31"]["meta"]["title"]):
print("res title: ", res['title'])
print("res text: \n", res['text'])
# удалим все записи по ключу документа
for k,v in tqdm(pages.items()):
solr.delete(id="doc_"+k)
запустим образ ignite с помощью docker
docker run -it -p 32773:10800 -e "CONFIG_URI=https://raw.githubusercontent.com/apache/ignite/master/examples/config/example-cache.xml" apacheignite/ignite
вся работа с ignite через python с помощью библиотеки pyignite описана в ноутбуке
ignite requests.ipynb
примеры команд
# импортируем библиотеки
from pyignite import Client
# установим подключение (порт задавали при запуске образа docker)
client = Client()
client.connect('0.0.0.0', 32773)
# откроем файл с sql-запросом
with open('./world.sql', 'r') as f:
sql = f.read().splitlines()
# создадаим кэш
cache_country = client.create_cache('Country')
# запишем в него данные, где ключом будет название страны, а значением ее код, предварительно распарсив данные
for line in tqdm(sql):
if "INSERT INTO Country(" in line:
v, k = [i.strip() for i in re.sub("[^a-zA-Z\ \-\,]", "", line.split('VALUES')[-1]).split(',')[:2]]
cache_country.put(k, v)
# выведем все значения нашей таблицы
result = cache_country.scan()
for k, v in result:
print(k, v)
# найдем несколько значений по ключу
cache_country.get_all(['Micronesia', 'Niger', 'Sri Lanka'])
для примера использования созданного кэша, напишем простое приложение, которое по коду страны будет показывать записанные нами данные
пример кода в файле "query_to_ignite_cache.py"
# Пропишем код для создания таблицы Country
CITY_CREATE_TABLE_QUERY = '''CREATE TABLE City (
ID INT(11),
Name CHAR(35),
CountryCode CHAR(3),
District CHAR(20),
Population INT(11),
PRIMARY KEY (ID, CountryCode)
) WITH "affinityKey=CountryCode"'''
# исполним sql-запрос на создание таблицы
for query in [CITY_CREATE_TABLE_QUERY,]:
client.sql(query)
# Создадим индекс для таблицы City
CITY_CREATE_INDEX = '''CREATE INDEX idx_country_code ON city (CountryCode)'''
# выполним запрос
for query in [CITY_CREATE_INDEX,]:
client.sql(query)
# Добавим данные в таблицу:
city = ["INSERT INTO City(ID, Name, CountryCode, District, Population) VALUES (1,'Kabul','AFG','Kabol',1780000);",
"INSERT INTO City(ID, Name, CountryCode, District, Population) VALUES (2,'Qandahar','AFG','Qandahar',237500);",
"INSERT INTO City(ID, Name, CountryCode, District, Population) VALUES (3,'Herat','AFG','Herat',186800);",
"INSERT INTO City(ID, Name, CountryCode, District, Population) VALUES (4,'Mazar-e-Sharif','AFG','Balkh',127800);",
"INSERT INTO City(ID, Name, CountryCode, District, Population) VALUES (5,'Amsterdam','NLD','Noord-Holland',731200);",
"INSERT INTO City(ID, Name, CountryCode, District, Population) VALUES (6,'Rotterdam','NLD','Zuid-Holland',593321);",
"INSERT INTO City(ID, Name, CountryCode, District, Population) VALUES (7,'Haag','NLD','Zuid-Holland',440900);",
"INSERT INTO City(ID, Name, CountryCode, District, Population) VALUES (8,'Utrecht','NLD','Utrecht',234323);",
"INSERT INTO City(ID, Name, CountryCode, District, Population) VALUES (9,'Eindhoven','NLD','Noord-Brabant',201843);",
"INSERT INTO City(ID, Name, CountryCode, District, Population) VALUES (10,'Tilburg','NLD','Noord-Brabant',193238);",
"INSERT INTO City(ID, Name, CountryCode, District, Population) VALUES (11,'Groningen','NLD','Groningen',172701);",
"INSERT INTO City(ID, Name, CountryCode, District, Population) VALUES (12,'Breda','NLD','Noord-Brabant',160398);",
"INSERT INTO City(ID, Name, CountryCode, District, Population) VALUES (13,'Apeldoorn','NLD','Gelderland',153491);"
]
# выполним запрос
for row in city:
client.sql(row)
# напишем sql-запрос к таблице City
query = ''' SELECT name, population FROM City where SUBSTRING(name, 2, 1) = 'a' '''
result = client.sql(query)
print('Top 10 cities with "a" on 2nd place of city name :')
for row in result:
print(row)
author: Vadim Danilchenko
email: vndanilchenko@gmail.com