A Solr client library written in Rust
Project description
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. Documentation can be found at sh1nku.github.io/solrstice/python
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
pip install solrstice
Basic Usage
Async
import asyncio
from solrstice.auth import SolrBasicAuth
from solrstice.clients import AsyncSolrCloudClient
from solrstice.hosts import SolrServerContext, SolrSingleServerHost
from solrstice.queries import DeleteQuery, SelectQuery, UpdateQuery
# 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
from solrstice.auth import SolrBasicAuth
from solrstice.clients import BlockingSolrCloudClient
from solrstice.hosts import SolrServerContext, SolrSingleServerHost
from solrstice.queries import 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
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
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
query_parser = LuceneQuery(df="population")
select_builder = SelectQuery(q="outdoors", def_type=query_parser)
await client.select(select_builder, "example_collection")
docs = response.get_docs_response().get_docs()
Dismax
query_parser = DismaxQuery(qf="interests^20", bq=["interests:cars^20"])
select_builder = SelectQuery(q="outdoors", def_type=query_parser)
await client.select(select_builder, "example_collection")
docs = response.get_docs_response().get_docs()
Edismax
query_parser = EdismaxQuery(qf="interests^20", bq=["interests:cars^20"])
select_builder = SelectQuery(q="outdoors", def_type=query_parser)
await client.select(select_builder, "example_collection")
docs = response.get_docs_response().get_docs()
FacetSet Component
Pivot facet
select_builder = SelectQuery(facet_set=FacetSetComponent(pivots=PivotFacetComponent(["interests,age"])))
await client.select(select_builder, "example_collection")
facets = response.get_facet_set()
pivots = facets.get_pivots()
interests_age = pivot.get("interests,age")
Field facet
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
select_builder = SelectQuery(facet_set=FacetSetComponent(queries=["age:[0 TO 59]"]))
response = await client.select(select_builder, name)
facets = response.get_facet_set()
queries = facets.get_queries()
query = queries.get("age:[0 TO 59]")
Json Facet Component
Query
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
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
select_builder = SelectQuery(
json_facet=JsonFacetComponent(facets={"age": JsonTermsFacet("age")})
)
response = await config.async_client.select(select_builder, name)
facets = response.get_json_facets()
age_buckets = facets.get_nested_facets().get("age").get_buckets()
assert len(age_buckets) == 3
Nested
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
context = SolrServerContext(SolrSingleServerHost('localhost:8983'), SolrBasicAuth('solr', 'SolrRocks'))
client = AsyncSolrCloudClient(context)
Multiple servers
# 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
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.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
solrstice-0.4.3.tar.gz
(86.4 kB
view hashes)
Built Distributions
Close
Hashes for solrstice-0.4.3-cp38-abi3-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 1a21fa85bd281280cea13bb0f7061e3e422d5174ca181d39ffa2657e115e9dc1 |
|
MD5 | 2717ff4ee764a0f4d828869316fb6226 |
|
BLAKE2b-256 | decf97a71da0373dd752b0e85d37bd9c13f2cce076056f27f00b5bbb041cc83f |
Close
Hashes for solrstice-0.4.3-cp38-abi3-win32.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 4590ece44f353003cea09353761c8ce263a6c87e7aeef0f84e52f27c447657e7 |
|
MD5 | 3974e0a51ea5974444242f130f044dee |
|
BLAKE2b-256 | 17951c5b8fb139cdfbcbe6fc836daf16276ba3010b66b3370285a968245e7252 |
Close
Hashes for solrstice-0.4.3-cp38-abi3-manylinux_2_28_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 6d06e1b70f3f54156b5aa755bf19d857edc4f02026e5f22fd9e4d5a5e347338b |
|
MD5 | c0ab6230f3e5ccce1c8915daaa66e434 |
|
BLAKE2b-256 | 94df8b37a7fc6dad36fa75693b9e24de6ee3529e837a17a6418960fcdd2c060b |
Close
Hashes for solrstice-0.4.3-cp38-abi3-manylinux_2_28_s390x.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 9969949196a2777e64ef45d31e4b153c45d047e2f079119b202e2c902bc9b961 |
|
MD5 | 4e3b40d06ccb8580d1d6b9de0371a0ec |
|
BLAKE2b-256 | d01e6c9518605932147c881e89c26f8358c84c3a5b31933e795e7e333982f325 |
Close
Hashes for solrstice-0.4.3-cp38-abi3-manylinux_2_28_ppc64le.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 60c185f1ca3a12926a58d0f3085ea1deddfa2f5a008987e34a70e05875f99a96 |
|
MD5 | 7d73bbee16d0177b1171e9c6d45f1745 |
|
BLAKE2b-256 | 9ecd09ece4a40ec71ccadc10cacb7297181e0a4587064a7fc3a02df0a273cad2 |
Close
Hashes for solrstice-0.4.3-cp38-abi3-manylinux_2_28_armv7l.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 6c5907d38d39320d028f632db10cbc2449d7fe467ab8427f49b926ca9579b768 |
|
MD5 | 956ec8f6b9ced619ea7915236185dcd8 |
|
BLAKE2b-256 | a17605f750887f2479b9eda4abf6bb9cd9c8bfccb03eede4bd6256da741adf4d |
Close
Hashes for solrstice-0.4.3-cp38-abi3-manylinux_2_28_aarch64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 0fc7b180ce09470caf93ceed9778228f6f82c97da64e567fea2098e9c2b3789a |
|
MD5 | 8cb0eebd212d5b8c24223c1eef5f5ef5 |
|
BLAKE2b-256 | e3eb20790381f9bc77ba843784c51fd8be615e43cd633ccbcd39b293899b607b |
Close
Hashes for solrstice-0.4.3-cp38-abi3-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 0e7361eec365c974d039b32e97b069063634cad4f5d260fbed5eb311ef1f1845 |
|
MD5 | dec379c1ad96510f9e690ab3cc6a611c |
|
BLAKE2b-256 | 821c51819e62b28af3e6e3d04c3688231506b7c7ab5a6620f2f8f1b39d122f57 |
Close
Hashes for solrstice-0.4.3-cp38-abi3-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | d478ce3770b57346f276bd91b330df4227c4eeb83467c18f9ec38faf3f807c76 |
|
MD5 | 303c0bcdbf432d5b8de46d92c41b5e1b |
|
BLAKE2b-256 | 9c4c0beafde7a3ce39cf87428be42fcad95c208656241dd917f3495dd79ccc46 |