Как изменить / отфильтровать запрос поиска эластичного поиска? - PullRequest
0 голосов
/ 01 марта 2019

Я новичок в Elasticsearch (5.5.2) и пытаюсь настроить запрос ( в этом пакете Python ), чтобы получить результаты, которые больше соответствуют моим потребностям.В пакете у меня есть следующая функция в Python:

def query_geonames(self, placename):
    """
    Wrap search parameters into an elasticsearch query to the geonames index
    and return results.

    Parameters
    ---------
    conn: an elasticsearch Search conn, like the one returned by `setup_es()`

    placename: str
        the placename text extracted by NER system

    Returns
    -------
    out: The raw results of the elasticsearch query
    """
    # first first, try for country name
    if self.is_country(placename):
        q = {"multi_match": {"query": placename,
                             "fields": ['name', 'asciiname', 'alternativenames'],
                            "type" : "phrase"}}
        r = Q("match", feature_code='PCLI')
        res = self.conn.query(q).query(r)[0:5].execute()  # always 5
        #self.country_exact = True

    else:
        # second, try for an exact phrase match
        q = {"multi_match": {"query": placename,
                             "fields": ['name^5', 'asciiname^5', 'alternativenames'],
                            "type" : "phrase"}}
        r = Q("match", feature_code='PPL')
        res = self.conn.query(q).query(r)[0:50].execute()

        # if no results, use some fuzziness, but still require all terms to be present.
        # Fuzzy is not allowed in "phrase" searches.
        if res.hits.total == 0:
            # tried wrapping this in a {"constant_score" : {"query": ... but made it worse
            q = {"multi_match": {"query": placename,
                                 "fields": ['name', 'asciiname', 'alternativenames'],
                                     "fuzziness" : 1,
                                     "operator":   "and"},
                    }
            #self.fuzzy = True  # idea was to preserve this info as a feature, but not using state like this
            res = self.conn.query(q)[0:50].execute()
    es_result = utilities.structure_results(res)
    return es_result

Я хотел бы отфильтровать результаты, которые я получаю от ES (в первой части оператора else), на основе feature_code .Но вместо того, чтобы фильтровать один и тот же код feature_code, как это делают два поиска, я бы хотел получить результаты из ограниченного набора кодов feature_codes.

Я пытался использовать:

r = Q("match", feature_code=['PPL','PPLA','PPLA2']), но это не правильно.

Я посмотрел на эту страницу справки итакже на этом обсуждении .Но я все еще не могу понять, как использовать multi_match и filter .Отчасти трудность связана с моей неопытностью в ES, а отчасти из-за того, что я не до конца понимаю, как первый запрос взаимодействует со вторым запросом в операторе self.conn.query(q).query(r).

Кроме того, яуверен, что в моем документе / базе данных могут быть другие соответствующие поля / условия, похожие на код_функции, которые я потенциально хотел бы использовать.(В частности, я думаю, многие из этих полей должны быть доступны для использования.) Как мне получить точный синтаксис этих других полей из документа / базы данных ES?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...