A first-party Python client for building excellent, relevant search experiences with Elastic App Search.
To install the client, use pip:
python -m pip install elastic-app-search
You can also download the project source and run::
python setup.py install
This client is versioned and released alongside App Search.
To guarantee compatibility, use the most recent version of this library within the major version of the corresponding App Search implementation.
For example, for App Search 7.3
, use 7.3
of this library or above, but not 8.0
.
If you are a SaaS user, simply use the most recent version of this library.
>>> from elastic_app_search import Client
>>> host_identifier = 'host-c5s2mj'
>>> api_key = 'private-mu75psc5egt9ppzuycnc2mc3'
>>> client = Client(host_identifier, api_key)
The client can be configured to use a managed deploy by adjusting the base_endpoint
and use_https
parameters. Since managed deploys do not rely on a host_identifier
, it can be omitted.
>>> from elastic_app_search import Client
>>> client = Client(
api_key='private-mu75psc5egt9ppzuycnc2mc3',
base_endpoint='localhost:3002/api/as/v1',
use_https=False
)
>>> engine_name = 'favorite-videos'
>>> document = {
'id': 'INscMGmhmX4',
'url': 'https://www.youtube.com/watch?v=INscMGmhmX4',
'title': 'The Original Grumpy Cat',
'body': 'A wonderful video of a magnificent cat.'
}
>>> client.index_document(engine_name, document)
{'id': 'INscMGmhmX4'}
>>> engine_name = 'favorite-videos'
>>> documents = [
{
'id': 'INscMGmhmX4',
'url': 'https://www.youtube.com/watch?v=INscMGmhmX4',
'title': 'The Original Grumpy Cat',
'body': 'A wonderful video of a magnificent cat.'
},
{
'id': 'JNDFojsd02',
'url': 'https://www.youtube.com/watch?v=dQw4w9WgXcQ',
'title': 'Another Grumpy Cat',
'body': 'A great video of another cool cat.'
}
]
>>> client.index_documents(engine_name, documents)
[{'id': 'INscMGmhmX4', 'errors': []}, {'id': 'JNDFojsd02', 'errors': []}]
>>> engine_name = 'favorite-videos'
>>> documents = [
{
'id': 'INscMGmhmX4',
'title': 'Updated title'
}
]
>>> client.update_documents(engine_name, documents)
>>> engine_name = 'favorite-videos'
>>> client.get_documents(engine_name, ['INscMGmhmX4'])
[{'id': 'INscMGmhmX4','url': 'https://www.youtube.com/watch?v=INscMGmhmX4','title': 'The Original Grumpy Cat','body': 'A wonderful video of a magnificent cat.'}]
>>> engine_name = 'favorite-videos'
>>> client.list_documents(engine_name, current=1, size=20)
{
'meta': {
'page': {
'current': 1,
'total_pages': 1,
'total_results': 2,
'size': 20
}
},
'results': [{'id': 'INscMGmhmX4','url': 'https://www.youtube.com/watch?v=INscMGmhmX4','title': 'The Original Grumpy Cat','body': 'A wonderful video of a magnificent cat.'}]
}
>>> engine_name = 'favorite-videos'
>>> client.destroy_documents(engine_name, ['INscMGmhmX4'])
[{'id': 'INscMGmhmX4','result': True}]
>>> engine_name = 'favorite-videos'
>>> client.get_schema(engine_name)
{'name':'text', 'square_km': 'number', 'square_mi': 'text'}
>>> engine_name = 'favorite-videos'
>>> client.update_schema(engine_name, {'square_km': 'text'})
{'square_km': 'text'}
>>> client.update_schema(engine_name, {'square_mi': 'text'})
{'square_km': 'text', 'square_mi': 'text'}
>>> client.update_schema(engine_name, {'square_km': 'number'})
{'square_km': 'number', 'square_mi': 'text'}
>>> client.list_engines(current=1, size=20)
{
'meta': {
'page': {
'current': 1,
'total_pages': 1,
'total_results': 2,
'size': 20
}
},
'results': [{'name': 'favorite-videos'}, {'name': 'another-engine'}]
}
>>> client.get_engine('favorite-videos')
{'name': 'favorite-videos'}
>>> client.create_engine('favorite-videos', 'en')
{'name': 'favorite-videos', 'type': 'default', 'language': 'en'}
>>> client.destroy_engine('favorite-videos')
{'deleted': True}
>>> client.list_synonym_sets('us-national-parks')
{
'meta': {
'page': {
'current': 1,
'total_pages': 1,
'total_results': 3,
'size': 20
}
},
'results': [
{
'id': 'syn-5b11ac66c9f9292013220ad3',
'synonyms': [
'park',
'trail'
]
},
{
'id': 'syn-5b11ac72c9f9296b35220ac9',
'synonyms': [
'protected',
'heritage'
]
},
{
'id': 'syn-5b11ac66c9f9292013220ad3',
'synonyms': [
'hectares',
'acres'
]
}
]
}
>>> client.list_synonym_sets('us-national-parks', size=1, current=1)
{
'meta': {
'page': {
'current': 1,
'total_pages': 3,
'total_results': 3,
'size': 1
}
},
'results': [
{
'id': 'syn-5b11ac66c9f9292013220ad3',
'synonyms': [
'park',
'trail'
]
}
]
}
>>> client.get_synonym_set('us-national-parks', 'syn-5b11ac66c9f9292013220ad3')
{
'id': 'syn-5b11ac66c9f9292013220ad3',
'synonyms': [
'park',
'trail'
]
}
>>> client.create_synonym_set('us-national-parks', ['park', 'trail'])
{
'id': 'syn-5b11ac72c9f9296b35220ac9',
'synonyms': [
'park',
'trail'
]
}
>>> client.update_synonym_set('us-national-parks', 'syn-5b11ac72c9f9296b35220ac9', ['park', 'trail', 'ground'])
{
'id': 'syn-5b11ac72c9f9296b35220ac9',
'synonyms': [
'park',
'trail',
'ground'
]
}
>>> client.destroy_synonym_set('us-national-parks', 'syn-5b11ac66c9f9292013220ad3')
{
'deleted': True
}
>>> client.search('favorite-videos', 'grumpy cat', {})
{'meta': {'page': {'current': 1, 'total_pages': 1, 'total_results': 2, 'size': 10}, ...}, 'results': [...]}
>>> client.multi_search('favorite-videos', [{
'query': 'cat',
'options': { 'search_fields': { 'title': {} }}
},{
'query': 'dog',
'options': { 'search_fields': { 'body': {} }}
}])
[{'meta': {...}, 'results': [...]}, {'meta': {...}, 'results': [...]}]
>>> client.query_suggestion('favorite-videos', 'cat', {
'size': 10,
'types': {
'documents': {
'fields': ['title']
}
}
})
{'results': {'documents': [{'suggestion': 'cat'}]}, 'meta': {'request_id': '390be384ad5888353e1b32adcfaaf1c9'}}
>>> client.click(engine_name, {'query': 'cat', 'document_id': 'INscMGmhmX4'})
Creating a search key that will only search over the body field.
>>> api_key = 'private-mu75psc5egt9ppzuycnc2mc3'
>>> api_key_name = 'my-api-token'
>>> signed_search_key = Client.create_signed_search_key(api_key, api_key_name, {'search_fields': { 'body': {}}})
>>> client = Client(host_identifier, signed_search_key)
python setup.py test
If something is not working as expected, please open an issue.
Your best bet is to read the documentation.
You can checkout the Elastic App Search community discuss forums.
We welcome contributors to the project. Before you begin, a couple notes:
- Prior to opening a pull request, please create an issue to discuss the scope of your proposal.
- Please write simple code and concise documentation, when appropriate.
Thank you to all the contributors!