search.py 1.54 KB
import typesense

TYPESENSE_API = open('./docs/typesense').read().strip()
client = typesense.Client({
	'api_key': TYPESENSE_API,
	'nodes': [{
		'host': 'localhost',
		'port': '8108',
		'protocol': 'http'
	}],
	'connection_timeout_seconds': 2
})

COLLECTION = 'presup_actpro_fts'
schema = {
	'name': COLLECTION,
	'fields': [
        {'name': 'devengado', 'type': 'float'},
        {'name': 'is_class', 'type': 'bool'},
        {'name': 'class_', 'type': 'string'},
        {'name': 'texto', 'type': 'string'},
        {'name': 'metadatos', 'type': 'string'},
	],
	'default_sorting_field': 'devengado',
}

search_parameters = {
	"q": "cuba",
	"query_by": "texto",
	# "facet_by": "gestion",
	"sort_by": "devengado:desc",
	"per_page": 20,
}


AVAILABLE_CLASSES = [
	'programa_proyecto', 'entidad', 'objeto', 'finfun', 'acteco'
]
def do_search(query, page, is_class, class_=None, order=None):
	search_parameters_ = search_parameters.copy()
	search_parameters_['q'] = query

	if is_class is not None:
		filter_c = ''
		if is_class:
			filter_c = 'is_class:true'
		else:
			filter_c = 'is_class:false'

		search_parameters_['filter_by'] = filter_c

	if (class_ is not None):
		class_ = [_ for _ in class_.split(',') if _ in AVAILABLE_CLASSES]
		if len(class_):
			search_parameters_['filter_by'] = 'class_:[{}]'.format(', '.join(class_))

	if (page is not None) and (page > 0) and (page < 100):
		search_parameters_['page'] = page

	if order == 'asc':
		search_parameters_['sort_by'] = 'devengado:asc'

	return client.collections[COLLECTION].documents.search(
		search_parameters_
	)