Esempio n. 1
0
def straatnaam_query(analyzer: QueryAnalyzer) -> ElasticQueryWrapper:
    street_part = analyzer.get_straatnaam()
    return ElasticQueryWrapper(
        query={
            'multi_match': {
                'query': street_part,
                'type': 'phrase_prefix',
                'fields': [
                    'straatnaam',
                    'straatnaam_nen',
                    'straatnaam_ptt',
                ]
            },
        },
        sort_fields=['straatnaam.raw', 'huisnummer', 'toevoeging.keyword'],
        indexes=[NUMMERAANDUIDING])
Esempio n. 2
0
def pandnaam_query(analyzer: QueryAnalyzer) -> ElasticQueryWrapper:
    """
    Maak een query voor pand op pandnaam.
    """
    pandnaam = analyzer.get_straatnaam()

    return ElasticQueryWrapper(query={
        'multi_match': {
            'query': pandnaam,
            'type': 'phrase_prefix',
            'fields': [
                'pandnaam',
            ]
        },
    },
                               sort_fields=['_display'],
                               indexes=[BAG_PAND])
Esempio n. 3
0
def _basis_openbare_ruimte_query(
        analyzer: QueryAnalyzer,
        must: [dict] = None,
        must_not: [dict] = None,
        index: str = None,
        useorder: [bool] = False) -> ElasticQueryWrapper:
    """
    Basis openbare-ruimte query.

    Het resultaat ordent pure prefix matches vóór phrase_prefix matches.
    """

    # Logica:
    # Het doel is om 'echte' prefix-matches te sorteren vóór phrase-prefix
    # matches.  Met alleen phrase-prefix kan dat niet, dus we gebruiken twee
    # 'should' queries waarvan er minimaal één moet matchen. Met de
    # constant_score wrapper zorgen we ervoor dat alle 'prefix' matches een
    # score van 10 krijgen, en alle 'phrase_prefix' matches een score van 5.
    # De 'constant_score' op de 'must' voorkomt dat die in de weg zit.  Op
    # basis van deze output kunnen we vervolgens ordenen op score, gevolgd
    # door naam.
    #
    # Voorbeelden: Zoeken op Weesp, geeft eerst Weesperstraat, dan pas
    # Metrostation Weesperstraat.  Zoeken op Prinsen, geeft eerst
    # Prinsengracht, dan pas Korte Prinsengracht.

    _must = [{'constant_score': {'filter': q}} for q in (must or [])]
    _must_not = [{'constant_score': {'filter': q}} for q in (must_not or [])]

    sort_fields = ['_score', 'naam.keyword']

    if useorder:
        sort_fields = ['order', 'naam.keyword']

    return ElasticQueryWrapper(
        query={
            'bool': {
                'must':
                _must,
                'must_not':
                _must_not,
                'should': [{
                    'constant_score': {
                        'filter': {
                            'prefix': {
                                'naam.keyword': analyzer.get_straatnaam(),
                            }
                        },
                        'boost': 10,
                    },
                }, {
                    'constant_score': {
                        'filter': {
                            'multi_match': {
                                'query':
                                analyzer.get_straatnaam(),
                                'type':
                                'phrase_prefix',
                                'fields': [
                                    'naam',
                                    'naam_nen',
                                    'naam_ptt',
                                    'postcode',
                                ]
                            }
                        },
                        'boost': 5,
                    }
                }],
                'minimum_should_match':
                1,
            }
        },
        indexes=[BAG_GEBIED],
        sort_fields=sort_fields,
        size=100,
    )