Name | solrstice JSON |
Version |
0.12.0
JSON |
| download |
home_page | None |
Summary | A Solr client library written in Rust |
upload_time | 2025-07-10 09:51:41 |
maintainer | None |
docs_url | None |
author | None |
requires_python | >=3.9 |
license | MIT OR Apache-2.0 |
keywords |
solr
rust
search
|
VCS |
 |
bugtrack_url |
|
requirements |
No requirements were recorded.
|
Travis-CI |
No Travis.
|
coveralls test coverage |
No coveralls.
|
# Solrstice: A Solr 8+ Client for Rust and Python
Solrstice is a solr client library written in rust. With this wrapper you can use it in python.
Both asyncio and blocking clients are provided. All apis have type hints.
## Features
* Config API
* Collection API
* Alias API
* Select Documents
* Grouping Component Query
* Stats Component
* DefTypes (lucene, dismax, edismax)
* Facet Counts (Query, Field, Pivot)
* Json Facet (Query, Stat, Terms, Nested)
* Indexing Documents
* Deleting Documents
## Installation
```bash
pip install solrstice
```
## Basic Usage
### Async
```python
import asyncio
from solrstice import SolrBasicAuth, SolrServerContext, SolrSingleServerHost, AsyncSolrCloudClient, UpdateQuery, \
SelectQuery, DeleteQuery
# A SolrServerContext specifies how the library should interact with Solr
context = SolrServerContext(SolrSingleServerHost('localhost:8983'), SolrBasicAuth('solr', 'SolrRocks'))
client = AsyncSolrCloudClient(context)
async def main() -> None:
# Create config and collection
await client.upload_config('example_config', 'path/to/config')
await client.create_collection('example_collection', 'example_config', shards=1, replication_factor=1)
# Index a document
await client.index(UpdateQuery(), 'example_collection', [{'id': 'example_document', 'title': 'Example document'}])
# Search for the document
response = await client.select(SelectQuery(fq=['title:Example document']), 'example_collection')
docs_response = response.get_docs_response()
assert docs_response is not None
assert docs_response.get_num_found() == 1
docs = docs_response.get_docs()
# Delete the document
await client.delete(DeleteQuery(ids=['example_document']), 'example_collection')
asyncio.run(main())
```
### Blocking
```python
from solrstice import SolrBasicAuth, BlockingSolrCloudClient, SolrServerContext, SolrSingleServerHost, DeleteQuery, \
SelectQuery, UpdateQuery
# A SolrServerContext specifies how the library should interact with Solr
context = SolrServerContext(SolrSingleServerHost('localhost:8983'), SolrBasicAuth('solr', 'SolrRocks'))
client = BlockingSolrCloudClient(context)
# Create config and collection
client.upload_config('example_config', 'path/to/config')
client.create_collection('example_collection', 'example_config', shards=1, replication_factor=1)
# Index a document
client.index(UpdateQuery(), 'example_collection', [{'id': 'example_document', 'title': 'Example document'}])
# Search for the document
response = client.select(SelectQuery(fq=['title:Example document']), 'example_collection')
docs_response = response.get_docs_response()
assert docs_response is not None
assert docs_response.get_num_found() == 1
docs = docs_response.get_docs()
# Delete the document
client.delete(DeleteQuery(ids=['example_document']), 'example_collection')
```
## Grouping component
### Field grouping
```python
from solrstice import GroupingComponent, SelectQuery, SolrServerContext, AsyncSolrCloudClient
client = AsyncSolrCloudClient(SolrServerContext('localhost:8983'))
async def main() -> None:
group_builder = GroupingComponent(fields=["age"], limit=10)
select_builder = SelectQuery(fq=["age:[* TO *]"], grouping=group_builder)
groups = (await client.select(select_builder, "example_collection")).get_groups()
age_group = groups["age"]
docs = age_group.get_field_result()
```
### Query grouping
```python
from solrstice import GroupingComponent, SelectQuery, SolrServerContext, AsyncSolrCloudClient
client = AsyncSolrCloudClient(SolrServerContext('localhost:8983'))
async def main() -> None:
group_builder = GroupingComponent(queries=["age:[0 TO 59]", "age:[60 TO *]"], limit=10)
select_builder = SelectQuery(fq=["age:[* TO *]"], grouping=group_builder)
groups = (await client.select(select_builder, "example_collection")).get_groups()
age_group = groups["age:[0 TO 59]"]
group = age_group.get_query_result()
assert group is not None
docs = group.get_docs()
```
## Query parsers
### Lucene
```python
from solrstice import LuceneQuery, SelectQuery, SolrServerContext, AsyncSolrCloudClient
client = AsyncSolrCloudClient(SolrServerContext('localhost:8983'))
async def main() -> None:
query_parser = LuceneQuery(df="population")
select_builder = SelectQuery(q="outdoors", def_type=query_parser)
response = (await client.select(select_builder, "example_collection")).get_docs_response()
assert response is not None
docs = response.get_docs()
```
### Dismax
```python
from solrstice import DismaxQuery, SelectQuery, SolrServerContext, AsyncSolrCloudClient
client = AsyncSolrCloudClient(SolrServerContext('localhost:8983'))
async def main() -> None:
query_parser = DismaxQuery(qf="interests^20", bq=["interests:cars^20"])
select_builder = SelectQuery(q="outdoors", def_type=query_parser)
response = (await client.select(select_builder, "example_collection")).get_docs_response()
assert response is not None
docs = response.get_docs()
```
### Edismax
```python
from solrstice import EdismaxQuery, SelectQuery, SolrServerContext, AsyncSolrCloudClient
client = AsyncSolrCloudClient(SolrServerContext('localhost:8983'))
async def main() -> None:
query_parser = EdismaxQuery(qf="interests^20", bq=["interests:cars^20"])
select_builder = SelectQuery(q="outdoors", def_type=query_parser)
response = (await client.select(select_builder, "example_collection")).get_docs_response()
assert response is not None
docs = response.get_docs()
```
## FacetSet Component
### Pivot facet
```python
from solrstice import FacetSetComponent, PivotFacetComponent, SelectQuery, SolrServerContext, AsyncSolrCloudClient
client = AsyncSolrCloudClient(SolrServerContext('localhost:8983'))
async def main() -> None:
select_builder = SelectQuery(facet_set=FacetSetComponent(pivots=PivotFacetComponent(["interests,age"])))
response = await client.select(select_builder, "example_collection")
facets = response.get_facet_set()
pivots = facets.get_pivots()
interests_age = pivots.get("interests,age")
```
### Field facet
```python
from solrstice import FacetSetComponent, FieldFacetComponent, FieldFacetEntry, SelectQuery, SolrServerContext, AsyncSolrCloudClient
client = AsyncSolrCloudClient(SolrServerContext('localhost:8983'))
async def main() -> None:
facet_set = FacetSetComponent(fields=FieldFacetComponent(fields=[FieldFacetEntry("age")]))
select_builder = SelectQuery(facet_set=facet_set)
response = await client.select(select_builder, "example_collection")
facets = response.get_facet_set()
fields = facets.get_fields()
age = fields.get("age")
```
### Query facet
```python
from solrstice import AsyncSolrCloudClient, SolrServerContext, SelectQuery, FacetSetComponent, FacetSetComponent
client = AsyncSolrCloudClient(SolrServerContext('localhost:8983'))
async def main() -> None:
select_builder = SelectQuery(facet_set=FacetSetComponent(queries=["age:[0 TO 59]"]))
response = await client.select(select_builder, "example_collection")
facets = response.get_facet_set()
queries = facets.get_queries()
query = queries.get("age:[0 TO 59]")
```
## Stats Component
```python
from solrstice import StatsComponent, SelectQuery, SolrServerContext, AsyncSolrCloudClient
client = AsyncSolrCloudClient(SolrServerContext('localhost:8983'))
async def main() -> None:
select_builder = SelectQuery(stats=StatsComponent(fields=["age"]))
response = await client.select(select_builder, "example_collection")
stats = response.get_stats()
assert stats is not None
age_stats = stats.get_fields()["age"]
age_count = age_stats.get_count()
```
## Json Facet Component
### Query
```python
from solrstice import JsonFacetComponent, JsonQueryFacet, SelectQuery, SolrServerContext, AsyncSolrCloudClient
async def main() -> None:
client = AsyncSolrCloudClient(SolrServerContext('localhost:8983'))
select_builder = SelectQuery(
json_facet=JsonFacetComponent(
facets={"below_60": JsonQueryFacet(q="age:[0 TO 59]")}
)
)
response = await client.select(select_builder, "example_collection")
facets = response.get_json_facets()
assert facets is not None
below_60 = facets.get_nested_facets().get("below_60")
assert below_60 is not None
assert below_60.get_count() == 4
```
### Stat
```python
from solrstice import JsonFacetComponent, JsonStatFacet, SelectQuery, SolrServerContext, AsyncSolrCloudClient
client = AsyncSolrCloudClient(SolrServerContext('localhost:8983'))
async def main() -> None:
select_builder = SelectQuery(
json_facet=JsonFacetComponent(
facets={"total_people": JsonStatFacet("sum(count)")}
)
)
response = await client.select(select_builder, "example_collection")
facets = response.get_json_facets()
assert facets is not None
total_people = facets.get_flat_facets()["total_people"]
assert total_people == 1000
```
### Terms
```python
from solrstice import AsyncSolrCloudClient, SolrServerContext, SelectQuery, JsonFacetComponent, JsonTermsFacet
client = AsyncSolrCloudClient(SolrServerContext('localhost:8983'))
async def main() -> None:
select_builder = SelectQuery(
json_facet=JsonFacetComponent(facets={"age": JsonTermsFacet("age")})
)
response = await client.select(select_builder, "example_collection")
facets = response.get_json_facets()
assert facets is not None
age_buckets = facets.get_nested_facets()["age"].get_buckets()
assert len(age_buckets) == 3
```
### Nested
```python
from solrstice import AsyncSolrCloudClient, SolrServerContext, SelectQuery, JsonFacetComponent, JsonQueryFacet, JsonStatFacet
client = AsyncSolrCloudClient(SolrServerContext('localhost:8983'))
async def main() -> None:
select_builder = SelectQuery(
json_facet=JsonFacetComponent(
facets={
"below_60": JsonQueryFacet(
q="age:[0 TO 59]",
facets={"total_people": JsonStatFacet("sum(count)")},
)
}
)
)
response = await client.select(select_builder, "example_collection")
facets = response.get_json_facets()
assert facets is not None
total_people = (
facets.get_nested_facets()
["below_60"]
.get_flat_facets()
.get("total_people")
)
assert total_people == 750.0
```
## Hosts
### Single Server
```python
from solrstice import SolrServerContext, SolrSingleServerHost, SolrBasicAuth, AsyncSolrCloudClient
context = SolrServerContext(SolrSingleServerHost('localhost:8983'), SolrBasicAuth('solr', 'SolrRocks'))
client = AsyncSolrCloudClient(context)
```
### Multiple servers
```python
from solrstice import SolrServerContext, SolrMultipleServerHost, SolrBasicAuth, AsyncSolrCloudClient
# The client will randomly select a server to send requests to. It will wait 5 seconds for a response, before trying another server.
context = SolrServerContext(
SolrMultipleServerHost(["localhost:8983", "localhost:8984"], 5),
SolrBasicAuth('solr', 'SolrRocks'),
)
client = AsyncSolrCloudClient(context)
```
### Zookeeper
```python
from solrstice import SolrServerContext, ZookeeperEnsembleHostConnector, SolrBasicAuth, AsyncSolrCloudClient
async def main() -> None:
context = SolrServerContext(
await ZookeeperEnsembleHostConnector(["localhost:2181"], 30).connect(),
SolrBasicAuth('solr', 'SolrRocks'),
)
client = AsyncSolrCloudClient(context)
```
## Notes
* Multiprocessing does not work, and will block forever. Normal multithreading works fine.
* Pyo3, the Rust library for creating bindings does not allow overriding the `__init__` method on objects from
Rust. `__new__` has to be overridden instead.
For example, if you want to create a simpler way to create a client
```python
from typing import Optional
from solrstice import SolrServerContext, SolrSingleServerHost, SolrBasicAuth, AsyncSolrCloudClient, SolrAuth
class SolrClient(AsyncSolrCloudClient):
def __new__(cls, host: str, auth: Optional[SolrAuth] = None):
context = SolrServerContext(SolrSingleServerHost(host), auth)
return super().__new__(cls, context=context)
client = SolrClient("localhost:8983", SolrBasicAuth("username", "password"))
```
Raw data
{
"_id": null,
"home_page": null,
"name": "solrstice",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.9",
"maintainer_email": null,
"keywords": "solr, rust, search",
"author": null,
"author_email": null,
"download_url": "https://files.pythonhosted.org/packages/89/dd/d2790789afaf2f789dbdfe173bd1fe19402076374bd3983d03291b324581/solrstice-0.12.0.tar.gz",
"platform": null,
"description": "# Solrstice: A Solr 8+ Client for Rust and Python\n\nSolrstice is a solr client library written in rust. With this wrapper you can use it in python.\n\nBoth asyncio and blocking clients are provided. All apis have type hints.\n\n## Features\n\n* Config API\n* Collection API\n* Alias API\n* Select Documents\n * Grouping Component Query\n * Stats Component\n * DefTypes (lucene, dismax, edismax)\n * Facet Counts (Query, Field, Pivot)\n * Json Facet (Query, Stat, Terms, Nested)\n* Indexing Documents\n* Deleting Documents\n\n## Installation\n\n```bash\npip install solrstice\n```\n\n## Basic Usage\n\n### Async\n\n```python\nimport asyncio\n\nfrom solrstice import SolrBasicAuth, SolrServerContext, SolrSingleServerHost, AsyncSolrCloudClient, UpdateQuery, \\\n SelectQuery, DeleteQuery\n\n# A SolrServerContext specifies how the library should interact with Solr\ncontext = SolrServerContext(SolrSingleServerHost('localhost:8983'), SolrBasicAuth('solr', 'SolrRocks'))\nclient = AsyncSolrCloudClient(context)\n\n\nasync def main() -> None:\n # Create config and collection\n await client.upload_config('example_config', 'path/to/config')\n await client.create_collection('example_collection', 'example_config', shards=1, replication_factor=1)\n\n # Index a document\n await client.index(UpdateQuery(), 'example_collection', [{'id': 'example_document', 'title': 'Example document'}])\n\n # Search for the document\n response = await client.select(SelectQuery(fq=['title:Example document']), 'example_collection')\n docs_response = response.get_docs_response()\n assert docs_response is not None\n assert docs_response.get_num_found() == 1\n docs = docs_response.get_docs()\n\n # Delete the document\n await client.delete(DeleteQuery(ids=['example_document']), 'example_collection')\n\n\nasyncio.run(main())\n```\n\n### Blocking\n\n```python\nfrom solrstice import SolrBasicAuth, BlockingSolrCloudClient, SolrServerContext, SolrSingleServerHost, DeleteQuery, \\\n SelectQuery, UpdateQuery\n\n# A SolrServerContext specifies how the library should interact with Solr\ncontext = SolrServerContext(SolrSingleServerHost('localhost:8983'), SolrBasicAuth('solr', 'SolrRocks'))\nclient = BlockingSolrCloudClient(context)\n\n# Create config and collection\nclient.upload_config('example_config', 'path/to/config')\nclient.create_collection('example_collection', 'example_config', shards=1, replication_factor=1)\n\n# Index a document\nclient.index(UpdateQuery(), 'example_collection', [{'id': 'example_document', 'title': 'Example document'}])\n\n# Search for the document\nresponse = client.select(SelectQuery(fq=['title:Example document']), 'example_collection')\ndocs_response = response.get_docs_response()\nassert docs_response is not None\nassert docs_response.get_num_found() == 1\ndocs = docs_response.get_docs()\n\n# Delete the document\nclient.delete(DeleteQuery(ids=['example_document']), 'example_collection')\n```\n\n## Grouping component\n\n### Field grouping\n\n```python\nfrom solrstice import GroupingComponent, SelectQuery, SolrServerContext, AsyncSolrCloudClient\nclient = AsyncSolrCloudClient(SolrServerContext('localhost:8983'))\n\nasync def main() -> None:\n group_builder = GroupingComponent(fields=[\"age\"], limit=10)\n select_builder = SelectQuery(fq=[\"age:[* TO *]\"], grouping=group_builder)\n groups = (await client.select(select_builder, \"example_collection\")).get_groups()\n age_group = groups[\"age\"]\n docs = age_group.get_field_result()\n```\n\n### Query grouping\n\n```python\nfrom solrstice import GroupingComponent, SelectQuery, SolrServerContext, AsyncSolrCloudClient\nclient = AsyncSolrCloudClient(SolrServerContext('localhost:8983'))\n\nasync def main() -> None:\n group_builder = GroupingComponent(queries=[\"age:[0 TO 59]\", \"age:[60 TO *]\"], limit=10)\n select_builder = SelectQuery(fq=[\"age:[* TO *]\"], grouping=group_builder)\n groups = (await client.select(select_builder, \"example_collection\")).get_groups()\n age_group = groups[\"age:[0 TO 59]\"]\n group = age_group.get_query_result()\n assert group is not None\n docs = group.get_docs()\n```\n\n## Query parsers\n\n### Lucene\n\n```python\nfrom solrstice import LuceneQuery, SelectQuery, SolrServerContext, AsyncSolrCloudClient\nclient = AsyncSolrCloudClient(SolrServerContext('localhost:8983'))\n\nasync def main() -> None:\n query_parser = LuceneQuery(df=\"population\")\n select_builder = SelectQuery(q=\"outdoors\", def_type=query_parser)\n response = (await client.select(select_builder, \"example_collection\")).get_docs_response()\n assert response is not None\n docs = response.get_docs()\n```\n\n### Dismax\n\n```python\nfrom solrstice import DismaxQuery, SelectQuery, SolrServerContext, AsyncSolrCloudClient\nclient = AsyncSolrCloudClient(SolrServerContext('localhost:8983'))\n\nasync def main() -> None:\n query_parser = DismaxQuery(qf=\"interests^20\", bq=[\"interests:cars^20\"])\n select_builder = SelectQuery(q=\"outdoors\", def_type=query_parser)\n response = (await client.select(select_builder, \"example_collection\")).get_docs_response()\n assert response is not None\n docs = response.get_docs()\n```\n\n### Edismax\n\n```python\nfrom solrstice import EdismaxQuery, SelectQuery, SolrServerContext, AsyncSolrCloudClient\nclient = AsyncSolrCloudClient(SolrServerContext('localhost:8983'))\n\nasync def main() -> None:\n query_parser = EdismaxQuery(qf=\"interests^20\", bq=[\"interests:cars^20\"])\n select_builder = SelectQuery(q=\"outdoors\", def_type=query_parser)\n response = (await client.select(select_builder, \"example_collection\")).get_docs_response()\n assert response is not None\n docs = response.get_docs()\n```\n\n## FacetSet Component\n\n### Pivot facet\n\n```python\nfrom solrstice import FacetSetComponent, PivotFacetComponent, SelectQuery, SolrServerContext, AsyncSolrCloudClient\nclient = AsyncSolrCloudClient(SolrServerContext('localhost:8983'))\n\nasync def main() -> None:\n select_builder = SelectQuery(facet_set=FacetSetComponent(pivots=PivotFacetComponent([\"interests,age\"])))\n response = await client.select(select_builder, \"example_collection\")\n facets = response.get_facet_set()\n pivots = facets.get_pivots()\n interests_age = pivots.get(\"interests,age\")\n```\n\n### Field facet\n\n```python\nfrom solrstice import FacetSetComponent, FieldFacetComponent, FieldFacetEntry, SelectQuery, SolrServerContext, AsyncSolrCloudClient\nclient = AsyncSolrCloudClient(SolrServerContext('localhost:8983'))\n\nasync def main() -> None:\n facet_set = FacetSetComponent(fields=FieldFacetComponent(fields=[FieldFacetEntry(\"age\")]))\n select_builder = SelectQuery(facet_set=facet_set)\n response = await client.select(select_builder, \"example_collection\")\n facets = response.get_facet_set()\n fields = facets.get_fields()\n age = fields.get(\"age\")\n```\n\n### Query facet\n\n```python\nfrom solrstice import AsyncSolrCloudClient, SolrServerContext, SelectQuery, FacetSetComponent, FacetSetComponent\nclient = AsyncSolrCloudClient(SolrServerContext('localhost:8983'))\n\nasync def main() -> None:\n select_builder = SelectQuery(facet_set=FacetSetComponent(queries=[\"age:[0 TO 59]\"]))\n response = await client.select(select_builder, \"example_collection\")\n facets = response.get_facet_set()\n queries = facets.get_queries()\n query = queries.get(\"age:[0 TO 59]\")\n```\n\n## Stats Component\n```python\nfrom solrstice import StatsComponent, SelectQuery, SolrServerContext, AsyncSolrCloudClient\nclient = AsyncSolrCloudClient(SolrServerContext('localhost:8983'))\n\nasync def main() -> None:\n select_builder = SelectQuery(stats=StatsComponent(fields=[\"age\"]))\n response = await client.select(select_builder, \"example_collection\")\n stats = response.get_stats()\n assert stats is not None\n age_stats = stats.get_fields()[\"age\"]\n age_count = age_stats.get_count()\n```\n\n## Json Facet Component\n\n### Query\n\n```python\nfrom solrstice import JsonFacetComponent, JsonQueryFacet, SelectQuery, SolrServerContext, AsyncSolrCloudClient\nasync def main() -> None:\n client = AsyncSolrCloudClient(SolrServerContext('localhost:8983'))\n select_builder = SelectQuery(\n json_facet=JsonFacetComponent(\n facets={\"below_60\": JsonQueryFacet(q=\"age:[0 TO 59]\")}\n )\n )\n response = await client.select(select_builder, \"example_collection\")\n facets = response.get_json_facets()\n assert facets is not None\n below_60 = facets.get_nested_facets().get(\"below_60\")\n assert below_60 is not None\n assert below_60.get_count() == 4\n```\n\n### Stat\n\n```python\nfrom solrstice import JsonFacetComponent, JsonStatFacet, SelectQuery, SolrServerContext, AsyncSolrCloudClient\nclient = AsyncSolrCloudClient(SolrServerContext('localhost:8983'))\n\nasync def main() -> None:\n select_builder = SelectQuery(\n json_facet=JsonFacetComponent(\n facets={\"total_people\": JsonStatFacet(\"sum(count)\")}\n )\n )\n response = await client.select(select_builder, \"example_collection\")\n facets = response.get_json_facets()\n assert facets is not None\n total_people = facets.get_flat_facets()[\"total_people\"]\n assert total_people == 1000\n```\n\n### Terms\n\n```python\nfrom solrstice import AsyncSolrCloudClient, SolrServerContext, SelectQuery, JsonFacetComponent, JsonTermsFacet\nclient = AsyncSolrCloudClient(SolrServerContext('localhost:8983'))\n\nasync def main() -> None:\n select_builder = SelectQuery(\n json_facet=JsonFacetComponent(facets={\"age\": JsonTermsFacet(\"age\")})\n )\n response = await client.select(select_builder, \"example_collection\")\n facets = response.get_json_facets()\n assert facets is not None\n age_buckets = facets.get_nested_facets()[\"age\"].get_buckets()\n assert len(age_buckets) == 3\n```\n\n### Nested\n\n```python\nfrom solrstice import AsyncSolrCloudClient, SolrServerContext, SelectQuery, JsonFacetComponent, JsonQueryFacet, JsonStatFacet\nclient = AsyncSolrCloudClient(SolrServerContext('localhost:8983'))\n\nasync def main() -> None:\n select_builder = SelectQuery(\n json_facet=JsonFacetComponent(\n facets={\n \"below_60\": JsonQueryFacet(\n q=\"age:[0 TO 59]\",\n facets={\"total_people\": JsonStatFacet(\"sum(count)\")},\n )\n }\n )\n )\n response = await client.select(select_builder, \"example_collection\")\n facets = response.get_json_facets()\n assert facets is not None\n total_people = (\n facets.get_nested_facets()\n [\"below_60\"]\n .get_flat_facets()\n .get(\"total_people\")\n )\n assert total_people == 750.0\n```\n\n## Hosts\n\n### Single Server\n\n```python\nfrom solrstice import SolrServerContext, SolrSingleServerHost, SolrBasicAuth, AsyncSolrCloudClient\n\ncontext = SolrServerContext(SolrSingleServerHost('localhost:8983'), SolrBasicAuth('solr', 'SolrRocks'))\nclient = AsyncSolrCloudClient(context)\n```\n\n### Multiple servers\n\n```python\nfrom solrstice import SolrServerContext, SolrMultipleServerHost, SolrBasicAuth, AsyncSolrCloudClient\n\n# The client will randomly select a server to send requests to. It will wait 5 seconds for a response, before trying another server.\ncontext = SolrServerContext(\n SolrMultipleServerHost([\"localhost:8983\", \"localhost:8984\"], 5),\n SolrBasicAuth('solr', 'SolrRocks'),\n)\nclient = AsyncSolrCloudClient(context)\n```\n\n### Zookeeper\n\n```python\nfrom solrstice import SolrServerContext, ZookeeperEnsembleHostConnector, SolrBasicAuth, AsyncSolrCloudClient\n\nasync def main() -> None:\n context = SolrServerContext(\n await ZookeeperEnsembleHostConnector([\"localhost:2181\"], 30).connect(),\n SolrBasicAuth('solr', 'SolrRocks'),\n )\n client = AsyncSolrCloudClient(context)\n```\n\n## Notes\n\n* Multiprocessing does not work, and will block forever. Normal multithreading works fine.\n* Pyo3, the Rust library for creating bindings does not allow overriding the `__init__` method on objects from\n Rust. `__new__` has to be overridden instead.\n\n For example, if you want to create a simpler way to create a client\n ```python\n from typing import Optional\n from solrstice import SolrServerContext, SolrSingleServerHost, SolrBasicAuth, AsyncSolrCloudClient, SolrAuth\n class SolrClient(AsyncSolrCloudClient):\n def __new__(cls, host: str, auth: Optional[SolrAuth] = None):\n context = SolrServerContext(SolrSingleServerHost(host), auth)\n return super().__new__(cls, context=context)\n client = SolrClient(\"localhost:8983\", SolrBasicAuth(\"username\", \"password\"))\n ```\n",
"bugtrack_url": null,
"license": "MIT OR Apache-2.0",
"summary": "A Solr client library written in Rust",
"version": "0.12.0",
"project_urls": {
"Homepage": "https://github.com/Sh1nku/solrstice",
"Repository": "https://github.com/Sh1nku/solrstice"
},
"split_keywords": [
"solr",
" rust",
" search"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "d46ee872f235f4b9ecb0d485db16fea52dcc776cda49a61d50a8101c09cb3598",
"md5": "1fceb958554d16137ae6e17ce46ad093",
"sha256": "6bf2fb1c3af9b84c181b4241723b18ed29a1bc4818153cadacf8d863e83d8d5e"
},
"downloads": -1,
"filename": "solrstice-0.12.0-cp39-abi3-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "1fceb958554d16137ae6e17ce46ad093",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 3729964,
"upload_time": "2025-07-10T09:51:34",
"upload_time_iso_8601": "2025-07-10T09:51:34.670850Z",
"url": "https://files.pythonhosted.org/packages/d4/6e/e872f235f4b9ecb0d485db16fea52dcc776cda49a61d50a8101c09cb3598/solrstice-0.12.0-cp39-abi3-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "382a412f9181b8e0a9dd62f2b43b8cb4d4bbcae9de70f16dcb9312f75c87d84c",
"md5": "8e33c17b383fd4950bea5ceba7bda897",
"sha256": "0bdb65faab3b316e57cb95b25367f4ac4effaf1e3432b1b839c6fb1ed0dda979"
},
"downloads": -1,
"filename": "solrstice-0.12.0-cp39-abi3-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "8e33c17b383fd4950bea5ceba7bda897",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 3561506,
"upload_time": "2025-07-10T09:51:33",
"upload_time_iso_8601": "2025-07-10T09:51:33.431474Z",
"url": "https://files.pythonhosted.org/packages/38/2a/412f9181b8e0a9dd62f2b43b8cb4d4bbcae9de70f16dcb9312f75c87d84c/solrstice-0.12.0-cp39-abi3-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "6af09f12e209197e9276da38535466c9bbbe083b6605dd33bbe92b77292d6d8d",
"md5": "ef387e11a88475661d99712318be7451",
"sha256": "d9a1896b34a4449b77f961b46cad14498e4b92b7193c0a0d1e90a19039b9d86a"
},
"downloads": -1,
"filename": "solrstice-0.12.0-cp39-abi3-manylinux_2_28_aarch64.whl",
"has_sig": false,
"md5_digest": "ef387e11a88475661d99712318be7451",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 3953083,
"upload_time": "2025-07-10T09:51:25",
"upload_time_iso_8601": "2025-07-10T09:51:25.302385Z",
"url": "https://files.pythonhosted.org/packages/6a/f0/9f12e209197e9276da38535466c9bbbe083b6605dd33bbe92b77292d6d8d/solrstice-0.12.0-cp39-abi3-manylinux_2_28_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "a324f8462733681c5b758af941bed2ee09544c049fa61475cde9298e85d3ca54",
"md5": "d9885199753c82185cf5de7272ab49e5",
"sha256": "bb5cb7edc2625f94a11a3cde18f962ca54a303ed071283cf24d20d49012e9676"
},
"downloads": -1,
"filename": "solrstice-0.12.0-cp39-abi3-manylinux_2_28_armv7l.whl",
"has_sig": false,
"md5_digest": "d9885199753c82185cf5de7272ab49e5",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 3727581,
"upload_time": "2025-07-10T09:51:27",
"upload_time_iso_8601": "2025-07-10T09:51:27.509351Z",
"url": "https://files.pythonhosted.org/packages/a3/24/f8462733681c5b758af941bed2ee09544c049fa61475cde9298e85d3ca54/solrstice-0.12.0-cp39-abi3-manylinux_2_28_armv7l.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "187d85929ebe5213872642daecdcb94a73441b888763e34b12942e32c1d6b22a",
"md5": "7a884c6ff6daba910b9476f5c8cb1ffc",
"sha256": "86422a63eb8e42f80c0bad78a1f88ce1ef5f89ca73a898a56cd198b14279e346"
},
"downloads": -1,
"filename": "solrstice-0.12.0-cp39-abi3-manylinux_2_28_ppc64le.whl",
"has_sig": false,
"md5_digest": "7a884c6ff6daba910b9476f5c8cb1ffc",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 4493902,
"upload_time": "2025-07-10T09:51:29",
"upload_time_iso_8601": "2025-07-10T09:51:29.147600Z",
"url": "https://files.pythonhosted.org/packages/18/7d/85929ebe5213872642daecdcb94a73441b888763e34b12942e32c1d6b22a/solrstice-0.12.0-cp39-abi3-manylinux_2_28_ppc64le.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "effc850b47c73f1639311440532bfb82a01f447d83dbd37bd9914604ce2dbf73",
"md5": "e47db8de187f9fccc874bc94ce4359f0",
"sha256": "ba6ee832968e1aefc0d16e5d15abd6b91a4bde211d09f9831ecd70bb111d5b26"
},
"downloads": -1,
"filename": "solrstice-0.12.0-cp39-abi3-manylinux_2_28_s390x.whl",
"has_sig": false,
"md5_digest": "e47db8de187f9fccc874bc94ce4359f0",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 3935916,
"upload_time": "2025-07-10T09:51:30",
"upload_time_iso_8601": "2025-07-10T09:51:30.637613Z",
"url": "https://files.pythonhosted.org/packages/ef/fc/850b47c73f1639311440532bfb82a01f447d83dbd37bd9914604ce2dbf73/solrstice-0.12.0-cp39-abi3-manylinux_2_28_s390x.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "f8cbf123de4f4c1072f6439e1f4da6272a10e5ce08bf669801f06b7fd83e4f2b",
"md5": "965e190336df4875373758fd0a8bb909",
"sha256": "94457a2c731021fa5f0c1b75acb1db98f4f4cadf2aaa395698e70d5b79230c06"
},
"downloads": -1,
"filename": "solrstice-0.12.0-cp39-abi3-manylinux_2_28_x86_64.whl",
"has_sig": false,
"md5_digest": "965e190336df4875373758fd0a8bb909",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 4080035,
"upload_time": "2025-07-10T09:51:31",
"upload_time_iso_8601": "2025-07-10T09:51:31.952290Z",
"url": "https://files.pythonhosted.org/packages/f8/cb/f123de4f4c1072f6439e1f4da6272a10e5ce08bf669801f06b7fd83e4f2b/solrstice-0.12.0-cp39-abi3-manylinux_2_28_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "da8fe02fbede7abe87c3cf014cababb64d66db1864a3eff14e03fab93f225408",
"md5": "83b1e6428a2cbd4e59cdbca6fe278007",
"sha256": "463d9fca279c5b61c197d7ddd5e611c3c8ebd46289b2cf48b1347b882da5163a"
},
"downloads": -1,
"filename": "solrstice-0.12.0-cp39-abi3-musllinux_1_2_aarch64.whl",
"has_sig": false,
"md5_digest": "83b1e6428a2cbd4e59cdbca6fe278007",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 4112054,
"upload_time": "2025-07-10T09:51:35",
"upload_time_iso_8601": "2025-07-10T09:51:35.893212Z",
"url": "https://files.pythonhosted.org/packages/da/8f/e02fbede7abe87c3cf014cababb64d66db1864a3eff14e03fab93f225408/solrstice-0.12.0-cp39-abi3-musllinux_1_2_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "08bbbceb450136eb25ffe922902629cd8c8676b801d7ef083e113fafe0682f1f",
"md5": "fee80047321a51fbecdf866064804e5f",
"sha256": "a698f4128e44b786f33d4cd8f74900f640f6f3093e5b532ac773da450cca64d9"
},
"downloads": -1,
"filename": "solrstice-0.12.0-cp39-abi3-musllinux_1_2_armv7l.whl",
"has_sig": false,
"md5_digest": "fee80047321a51fbecdf866064804e5f",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 3954665,
"upload_time": "2025-07-10T09:51:37",
"upload_time_iso_8601": "2025-07-10T09:51:37.422372Z",
"url": "https://files.pythonhosted.org/packages/08/bb/bceb450136eb25ffe922902629cd8c8676b801d7ef083e113fafe0682f1f/solrstice-0.12.0-cp39-abi3-musllinux_1_2_armv7l.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "2eebf63c8fe9d4857566932c50fd5d0e659549ffd77b9ca7ccdb6a26852efc90",
"md5": "1a0e5ee0a99a03456ae11f672fc25115",
"sha256": "34ef8bda904f4a381a405eea6399fe8e3c14c9eb6b5fd7eb76cd7cd14abfd390"
},
"downloads": -1,
"filename": "solrstice-0.12.0-cp39-abi3-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "1a0e5ee0a99a03456ae11f672fc25115",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 4246751,
"upload_time": "2025-07-10T09:51:39",
"upload_time_iso_8601": "2025-07-10T09:51:39.172814Z",
"url": "https://files.pythonhosted.org/packages/2e/eb/f63c8fe9d4857566932c50fd5d0e659549ffd77b9ca7ccdb6a26852efc90/solrstice-0.12.0-cp39-abi3-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "9733258483abcf1010f55661391e4561458295d4ac0bf3d9f1100eebf14041de",
"md5": "cded4db04304c0b3c476dd630e1366de",
"sha256": "8a731a7e08f94d00abafa4e467b16151f4400323d2efd1748451b7901df2b3b2"
},
"downloads": -1,
"filename": "solrstice-0.12.0-cp39-abi3-win_amd64.whl",
"has_sig": false,
"md5_digest": "cded4db04304c0b3c476dd630e1366de",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 3295662,
"upload_time": "2025-07-10T09:51:43",
"upload_time_iso_8601": "2025-07-10T09:51:43.057801Z",
"url": "https://files.pythonhosted.org/packages/97/33/258483abcf1010f55661391e4561458295d4ac0bf3d9f1100eebf14041de/solrstice-0.12.0-cp39-abi3-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "89ddd2790789afaf2f789dbdfe173bd1fe19402076374bd3983d03291b324581",
"md5": "a239a7ed5515de79b242bb730c6b14a9",
"sha256": "0f6b385a2a2e36f7cd16ef91e9a2817717a0ee6487f2c3996e3f38a71f64c070"
},
"downloads": -1,
"filename": "solrstice-0.12.0.tar.gz",
"has_sig": false,
"md5_digest": "a239a7ed5515de79b242bb730c6b14a9",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.9",
"size": 108701,
"upload_time": "2025-07-10T09:51:41",
"upload_time_iso_8601": "2025-07-10T09:51:41.326920Z",
"url": "https://files.pythonhosted.org/packages/89/dd/d2790789afaf2f789dbdfe173bd1fe19402076374bd3983d03291b324581/solrstice-0.12.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-07-10 09:51:41",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "Sh1nku",
"github_project": "solrstice",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "solrstice"
}