def handle(self, *args, **options): es = connections.get_connection('default') minions_idx.delete(ignore=404) minions_idx.create() ElasticMinion.init() es.indices.put_settings(index=ElasticMinion._doc_type.index, body={'index.max_result_window': 100000}) counter = 0 portion = [] for p in Minion2MP2Convocation.objects.select_related( "minion", "mp2convocation", "mp2convocation__mp").iterator(): portion.append(ElasticMinion(**p.to_dict()).to_dict(True)) counter += 1 if len(portion) >= 100: bulk(es, portion) portion = [] bulk(es, portion) self.stdout.write( 'Loaded {} persons to persistence storage'.format(counter))
def handle(self, *args, **options): Index(ElasticMinion._doc_type.index).delete(ignore=404) ElasticMinion.init() counter = 0 for p in Minion2MP2Convocation.objects.select_related( "minion", "mp2convocation", "mp2convocation__mp").all(): item = ElasticMinion(**p.to_dict()) item.save() counter += 1 self.stdout.write( 'Loaded {} persons to persistence storage'.format(counter))
def search(request): query = request.GET.get("q", "") if query: persons = ElasticMinion.search().query( "multi_match", query=query, operator="and", fields=["mp.name", "name"]) else: persons = ElasticMinion.search().query('match_all') return render(request, "search.jinja", { "minions": paginated( request, persons.sort('mp.grouper', '-paid', 'name'), cnt=30), "q": query })
def assume(q, fuzziness): results = [] search = ElasticMinion.search()\ .suggest( 'name', q, completion={ 'field': "name_suggest", 'size': 10, 'fuzzy': { 'fuzziness': fuzziness, 'unicode_aware': 1 } } ) res = search.execute() if res.success: results += res.suggest['name'][0]['options'] search = ElasticMinion.search()\ .suggest( 'name', q, completion={ 'field': "mp_name_suggest", 'size': 10, 'fuzzy': { 'fuzziness': fuzziness, 'unicode_aware': 1 } } ) res = search.execute() if res.success: results += res.suggest['name'][0]['options'] results = sorted(results, key=itemgetter("score"), reverse=True) if results: return [val['text'] for val in results] else: []
def get(self, request): q = request.GET.get('q', '').strip() suggestions = [] seen = set() s = ElasticMinion.search().source([ 'names_autocomplete' ]).highlight('names_autocomplete').highlight_options( order='score', fragment_size=100, number_of_fragments=10, pre_tags=['<strong>'], post_tags=["</strong>"]) s = s.query("bool", must=[ Q("match", names_autocomplete={ "query": q, "operator": "and" }) ], should=[ Q( "match_phrase", names_autocomplete__raw={ "query": q, "boost": 2 }, ), Q( "match_phrase_prefix", names_autocomplete__raw={ "query": q, "boost": 2 }, ) ])[:200] res = s.execute() for r in res: if "names_autocomplete" in r.meta.highlight: for candidate in r.meta.highlight["names_autocomplete"]: if candidate.lower() not in seen: suggestions.append(candidate) seen.add(candidate.lower()) rendered_result = [ render_to_string("autocomplete.jinja", {"result": { "hl": k }}) for k in suggestions[:20] ] return JsonResponse(rendered_result, safe=False)
def search(request): query = request.GET.get("q", "") if query: persons = ElasticMinion.search().query( "multi_match", query=query, operator="and", fields=["mp.name", "name", "persons"]) else: persons = ElasticMinion.search().query('match_all') return render( request, "search.jinja", { "minions": paginated(request, persons.sort('mp.grouper', '-paid', 'name.raw'), cnt=30), "q": query })