solrstice


Namesolrstice JSON
Version 0.6.0 PyPI version JSON
download
home_pageNone
SummaryA Solr client library written in Rust
upload_time2024-10-27 18:59:06
maintainerNone
docs_urlNone
authorNone
requires_python>=3.8
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
    * 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():
    # 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.get_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.get_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():
  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():
  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()
  docs = group.get_docs()
```

## Query parsers

### Lucene

```python
from solrstice import LuceneQuery, SelectQuery, SolrServerContext, AsyncSolrCloudClient
client = AsyncSolrCloudClient(SolrServerContext('localhost:8983'))

async def main():
  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():
  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():
  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():
  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():
  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():
  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]")
```

## Json Facet Component

### Query

```python
from solrstice import JsonFacetComponent, JsonQueryFacet, SelectQuery, SolrServerContext, AsyncSolrCloudClient
async def main():
  client = AsyncSolrCloudClient(SolrServerContext('localhost:8983'))
  select_builder = SelectQuery(
      json_facet=JsonFacetComponent(
          facets={"below_60": JsonQueryFacet("age:[0 TO 59]")}
      )
  )
  response = await client.select(select_builder, "example_collection")
  facets = response.get_json_facets()
  below_60 = facets.get_nested_facets().get("below_60")
  assert below_60.get_count() == 4
```

### Stat

```python
from solrstice import JsonFacetComponent, JsonStatFacet, SelectQuery, SolrServerContext, AsyncSolrCloudClient
client = AsyncSolrCloudClient(SolrServerContext('localhost:8983'))

async def main():
  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()
  total_people = facets.get_flat_facets().get("total_people")
  assert total_people == 1000
```

### Terms

```python
from solrstice import AsyncSolrCloudClient, SolrServerContext, SelectQuery, JsonFacetComponent, JsonTermsFacet
client = AsyncSolrCloudClient(SolrServerContext('localhost:8983'))

async def main():
  select_builder = SelectQuery(
      json_facet=JsonFacetComponent(facets={"age": JsonTermsFacet("age")})
  )
  response = await client.select(select_builder, "example_collection")
  facets = response.get_json_facets()
  age_buckets = facets.get_nested_facets().get("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():
  select_builder = SelectQuery(
      json_facet=JsonFacetComponent(
          facets={
              "below_60": JsonQueryFacet(
                  "age:[0 TO 59]",
                  facets={"total_people": JsonStatFacet("sum(count)")},
              )
          }
      )
  )
  response = await client.select(select_builder, "example_collection")
  facets = response.get_json_facets()
  total_people = (
      facets.get_nested_facets()
      .get("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():
  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.8",
    "maintainer_email": null,
    "keywords": "solr, rust, search",
    "author": null,
    "author_email": null,
    "download_url": "https://files.pythonhosted.org/packages/80/1b/9aed6b8a0bed91d4a2c56734e86225212952e976736a584180b2ff2a32e2/solrstice-0.6.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    * 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():\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.get_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.get_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():\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():\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  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():\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():\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():\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():\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():\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():\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## Json Facet Component\n\n### Query\n\n```python\nfrom solrstice import JsonFacetComponent, JsonQueryFacet, SelectQuery, SolrServerContext, AsyncSolrCloudClient\nasync def main():\n  client = AsyncSolrCloudClient(SolrServerContext('localhost:8983'))\n  select_builder = SelectQuery(\n      json_facet=JsonFacetComponent(\n          facets={\"below_60\": JsonQueryFacet(\"age:[0 TO 59]\")}\n      )\n  )\n  response = await client.select(select_builder, \"example_collection\")\n  facets = response.get_json_facets()\n  below_60 = facets.get_nested_facets().get(\"below_60\")\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():\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  total_people = facets.get_flat_facets().get(\"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():\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  age_buckets = facets.get_nested_facets().get(\"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():\n  select_builder = SelectQuery(\n      json_facet=JsonFacetComponent(\n          facets={\n              \"below_60\": JsonQueryFacet(\n                  \"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  total_people = (\n      facets.get_nested_facets()\n      .get(\"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():\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.6.0",
    "project_urls": null,
    "split_keywords": [
        "solr",
        " rust",
        " search"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "acc9f7d458200122ef8935980597cc5c8d8ffff77fce06ca702572f74e7ee9c9",
                "md5": "91eee302647ff5c08234ebec0ec45a2c",
                "sha256": "61e659b37584d7137da333a9e571506d1f35dd24138e97855908113fc954dfc0"
            },
            "downloads": -1,
            "filename": "solrstice-0.6.0-cp38-abi3-macosx_10_12_x86_64.whl",
            "has_sig": false,
            "md5_digest": "91eee302647ff5c08234ebec0ec45a2c",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 3516641,
            "upload_time": "2024-10-27T18:58:47",
            "upload_time_iso_8601": "2024-10-27T18:58:47.524661Z",
            "url": "https://files.pythonhosted.org/packages/ac/c9/f7d458200122ef8935980597cc5c8d8ffff77fce06ca702572f74e7ee9c9/solrstice-0.6.0-cp38-abi3-macosx_10_12_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "30e69b2e191696644df027a0f3a885ed2a9a83b827733073288ade8ba0297695",
                "md5": "43f9b709fc0f4d37c8ece05d9a7fa5a9",
                "sha256": "a89386dfb89d3e594787ee88f0c39acbea2868baa0b913be531a7143daf65d76"
            },
            "downloads": -1,
            "filename": "solrstice-0.6.0-cp38-abi3-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "43f9b709fc0f4d37c8ece05d9a7fa5a9",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 3378811,
            "upload_time": "2024-10-27T18:58:49",
            "upload_time_iso_8601": "2024-10-27T18:58:49.561098Z",
            "url": "https://files.pythonhosted.org/packages/30/e6/9b2e191696644df027a0f3a885ed2a9a83b827733073288ade8ba0297695/solrstice-0.6.0-cp38-abi3-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "776d32cda7f06a99c443137776d76ee1fa5936ac29d0c7b8e15836479628d363",
                "md5": "4e5cc0af3b9675b66e23e9b6efaf5764",
                "sha256": "756f2664691d173d336534d4c189cb1cf1ad80decc91445081a8e24b3c28be42"
            },
            "downloads": -1,
            "filename": "solrstice-0.6.0-cp38-abi3-manylinux_2_28_aarch64.whl",
            "has_sig": false,
            "md5_digest": "4e5cc0af3b9675b66e23e9b6efaf5764",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 3798834,
            "upload_time": "2024-10-27T18:58:51",
            "upload_time_iso_8601": "2024-10-27T18:58:51.800356Z",
            "url": "https://files.pythonhosted.org/packages/77/6d/32cda7f06a99c443137776d76ee1fa5936ac29d0c7b8e15836479628d363/solrstice-0.6.0-cp38-abi3-manylinux_2_28_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "5fd44d449bf162184c35f3919b2b91f391c73475bc2cd76642f4d4da3b62245e",
                "md5": "6c5238879c5cb27f2fd7f492d39d6d3b",
                "sha256": "210c970477c032db00e3d8695685811351752e6d1208f19206432408a4b622e9"
            },
            "downloads": -1,
            "filename": "solrstice-0.6.0-cp38-abi3-manylinux_2_28_armv7l.whl",
            "has_sig": false,
            "md5_digest": "6c5238879c5cb27f2fd7f492d39d6d3b",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 3565354,
            "upload_time": "2024-10-27T18:58:53",
            "upload_time_iso_8601": "2024-10-27T18:58:53.812697Z",
            "url": "https://files.pythonhosted.org/packages/5f/d4/4d449bf162184c35f3919b2b91f391c73475bc2cd76642f4d4da3b62245e/solrstice-0.6.0-cp38-abi3-manylinux_2_28_armv7l.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "1fcb681c828f0341035d38b55cf8a0bffceafe5abb205024b0dc57ddcf459ad5",
                "md5": "d932c4613f09cdf5d4f49c28796d9bb4",
                "sha256": "c408827a8e6f151091da5950cdfa7e6a2f4b1bda0c0d8b2328d1dd1d30936e35"
            },
            "downloads": -1,
            "filename": "solrstice-0.6.0-cp38-abi3-manylinux_2_28_ppc64le.whl",
            "has_sig": false,
            "md5_digest": "d932c4613f09cdf5d4f49c28796d9bb4",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 3921571,
            "upload_time": "2024-10-27T18:58:56",
            "upload_time_iso_8601": "2024-10-27T18:58:56.031423Z",
            "url": "https://files.pythonhosted.org/packages/1f/cb/681c828f0341035d38b55cf8a0bffceafe5abb205024b0dc57ddcf459ad5/solrstice-0.6.0-cp38-abi3-manylinux_2_28_ppc64le.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "cf28e1e7e7e37b626299ac093997a1ec34eadb8140621c56a128f0561907ef3d",
                "md5": "ca606f3d0aca800abd161b4e1d1e015c",
                "sha256": "10a7101e0905d984c287d163eee706e6005385248b5f6b410bf8a573157e50c2"
            },
            "downloads": -1,
            "filename": "solrstice-0.6.0-cp38-abi3-manylinux_2_28_s390x.whl",
            "has_sig": false,
            "md5_digest": "ca606f3d0aca800abd161b4e1d1e015c",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 4242775,
            "upload_time": "2024-10-27T18:58:58",
            "upload_time_iso_8601": "2024-10-27T18:58:58.156204Z",
            "url": "https://files.pythonhosted.org/packages/cf/28/e1e7e7e37b626299ac093997a1ec34eadb8140621c56a128f0561907ef3d/solrstice-0.6.0-cp38-abi3-manylinux_2_28_s390x.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "b81e9314e49bcb24a9efe51bebfcf587b544841dcbee1da0b5560256fb80655e",
                "md5": "86beedc0aa5350dd0bf526b8358906f0",
                "sha256": "e976f3f6a77aff97b00c8a5da150a18e27b1051c909b989e2161d9df23f6e7f5"
            },
            "downloads": -1,
            "filename": "solrstice-0.6.0-cp38-abi3-manylinux_2_28_x86_64.whl",
            "has_sig": false,
            "md5_digest": "86beedc0aa5350dd0bf526b8358906f0",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 3911383,
            "upload_time": "2024-10-27T18:59:00",
            "upload_time_iso_8601": "2024-10-27T18:59:00.016229Z",
            "url": "https://files.pythonhosted.org/packages/b8/1e/9314e49bcb24a9efe51bebfcf587b544841dcbee1da0b5560256fb80655e/solrstice-0.6.0-cp38-abi3-manylinux_2_28_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "b593c59174b344316ed921a75d16ddd1f6a7e42bad6e011500cc65e1cfa2d7ea",
                "md5": "8f46024df6220fed4273e769d7756f92",
                "sha256": "7f7f6260a2931a88ec09fedbc5d216b52a797511d14ba7903168f1226b2f2be4"
            },
            "downloads": -1,
            "filename": "solrstice-0.6.0-cp38-abi3-win32.whl",
            "has_sig": false,
            "md5_digest": "8f46024df6220fed4273e769d7756f92",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 2711598,
            "upload_time": "2024-10-27T18:59:02",
            "upload_time_iso_8601": "2024-10-27T18:59:02.310282Z",
            "url": "https://files.pythonhosted.org/packages/b5/93/c59174b344316ed921a75d16ddd1f6a7e42bad6e011500cc65e1cfa2d7ea/solrstice-0.6.0-cp38-abi3-win32.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "fb49ca98e537cb9104124ad98aa062a69352bb577dc79a25a900d97406f5ff5a",
                "md5": "b67318d50bbdcf03209f0a527d1b4338",
                "sha256": "d36520173b089f5bef0851b90fe76263fc6681c6ae8434d9873a0ba7740cabda"
            },
            "downloads": -1,
            "filename": "solrstice-0.6.0-cp38-abi3-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "b67318d50bbdcf03209f0a527d1b4338",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 3203385,
            "upload_time": "2024-10-27T18:59:04",
            "upload_time_iso_8601": "2024-10-27T18:59:04.877743Z",
            "url": "https://files.pythonhosted.org/packages/fb/49/ca98e537cb9104124ad98aa062a69352bb577dc79a25a900d97406f5ff5a/solrstice-0.6.0-cp38-abi3-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "801b9aed6b8a0bed91d4a2c56734e86225212952e976736a584180b2ff2a32e2",
                "md5": "dbf79616409a165e306a6435b67d4e61",
                "sha256": "eca49f60c7ddaaffce2230b4e6be489bdf209530dacedf3b459cbd67e74e5b50"
            },
            "downloads": -1,
            "filename": "solrstice-0.6.0.tar.gz",
            "has_sig": false,
            "md5_digest": "dbf79616409a165e306a6435b67d4e61",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 94660,
            "upload_time": "2024-10-27T18:59:06",
            "upload_time_iso_8601": "2024-10-27T18:59:06.408410Z",
            "url": "https://files.pythonhosted.org/packages/80/1b/9aed6b8a0bed91d4a2c56734e86225212952e976736a584180b2ff2a32e2/solrstice-0.6.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-10-27 18:59:06",
    "github": false,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "lcname": "solrstice"
}
        
Elapsed time: 0.33540s