from flask import g, current_app from realms.lib.util import filename_to_cname def simple(app): return SimpleSearch() def elasticsearch(app): from flask.ext.elastic import Elastic return ElasticSearch(Elastic(app)) class Search(object): def __init__(self, app=None): if app is not None: self.init_app(app) def init_app(self, app): search_obj = globals()[app.config['SEARCH_TYPE']] app.extensions['search'] = search_obj(app) def __getattr__(self, item): return getattr(current_app.extensions['search'], item) class BaseSearch(): pass class SimpleSearch(BaseSearch): def wiki(self, query): res = [] for entry in g.current_wiki.get_index(): name = filename_to_cname(entry['name']) if set(query.split()).intersection(name.split('-')): page = g.current_wiki.get_page(name) res.append(dict(name=name, content=page['data'])) return res def users(self, query): pass class ElasticSearch(BaseSearch): def __init__(self, elastic): self.elastic = elastic def index(self, index, doc_type, id_=None, body=None): return self.elastic.index(index=index, doc_type=doc_type, id=id_, body=body) def index_wiki(self, name, body): self.index('wiki', 'page', id_=name, body=body) def delete_index(self, index): return self.elastic.indices.delete(index=index, ignore=[400, 404]) def wiki(self, query): if not query: return [] res = self.elastic.search(index='wiki', body={"query": { "multi_match": { "query": query, "fields": ["name"] }}}) return [hit["_source"] for hit in res['hits']['hits']] def users(self, query): pass