Beispiel #1
0
    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))
Beispiel #2
0
    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))
Beispiel #3
0
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
    })
Beispiel #4
0
    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:
            []
Beispiel #5
0
    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)
Beispiel #6
0
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
        })