solrstice


Namesolrstice JSON
Version 0.12.0 PyPI version JSON
download
home_pageNone
SummaryA Solr client library written in Rust
upload_time2025-07-10 09:51:41
maintainerNone
docs_urlNone
authorNone
requires_python>=3.9
licenseMIT 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"
}
        
Elapsed time: 0.96647s