pythonasticsearch: как запросить строку во всех полях - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть следующий код на Python, который работает нормально, что дает мне ровно 50 ожидаемых результатов:

elastic = settings.ELASTIC
indexes = u'nginx-access-2769z-2018.11.26.16'
filter_by_client = [
    {'match_phrase': {'client_id': '2769z'}},
]
range_for_search = {
    'gte': str(1543248611),
    'lte': str(1543249511),
    'format': 'epoch_second',
}
query_body = {
    'from': 0,
    'size': 50,
    'query': {
        'bool': {
            'must': filter_by_client,
            'filter': {'range': {'@timestamp': range_for_search}},
        },
    }
}
search_result = elastic.search(index=indexes, body=query_body)
results = [result['_source'] for result in search_result['hits']['hits']]

А теперь я добавлю еще один фильтр, например

...
filter_by_client = [
    {'match_phrase': {'client_id': '2769z'}},
    {'match': {'remote_address': '181.220.174.189'}}
]
...

Этотоже отлично работает!Сокращение до 5 результатов.

Моя проблема: как мне запросить эту строку над всеми полями ?Для меня не имеет значения, находится ли эта строка в начале / конце поля, если она в верхнем регистре, если поле на самом деле является целым числом / с плавающей точкой, а не строкой, ...

Уже пробовали использоватьключевое слово "_all", подобное этому

...
filter_by_client = [
    {'match_phrase': {'client_id': '2769z'}},
    {'match': {'_all': '181.220.174.189'}}
]
...

, но дает 0 результатов.Попытка воспроизвести то же поведение, что и в интерфейсе Kibana.

1 Ответ

0 голосов
/ 26 ноября 2018

То, что упомянул Нишант, является лучшим решением с использованием поля copy_to, однако, если у вас нет элемента управления для изменения отображения, то вы можете попробовать и посмотреть, поможет ли какой-либо из приведенных ниже подходов.

Использование Query String Query

Вы можете использовать Query String Query , где ваш запрос будет выглядеть следующим образом:

...
filter_by_client = [
    {'match_phrase': {'client_id': '2769z'}},
    {'query_string': {'query': '181.220.174.189'}}
]
... 

Одно важное замечание: query_string searchпо умолчанию все поля.Ссылка, о которой я упоминал, содержит следующее:

Поле по умолчанию для условий запроса, если префиксное поле не указано.По умолчанию это настройки индекса index.query.default_field, которые по умолчанию *.* извлекает все поля в отображении, которые могут использоваться для запросов, и фильтрует поля метаданных.

Также я упоминаю об этом, потому что я хочу, чтобы вы поняли разницу в использовании query_string по сравнению с простым соответствием Сравнение с Query-String , прежде чем вы решите перейти к query_string.

Совпадение семейства запросов не проходит процесс "разбора запроса".Он не поддерживает префиксы имен полей, символы подстановки или другие «расширенные» функции.По этой причине шансы на его неудачу очень малы / не существуют, и это обеспечивает отличное поведение, когда речь идет просто о том, чтобы анализировать и запускать этот текст как поведение запроса (как правило, это то, что делает поле текстового поиска).Кроме того, тип фразу_prefix может обеспечить отличное поведение «при вводе» для автоматической загрузки результатов поиска.

Использование множественного соответствия

Ниже приведено другое возможное решение, если вы нежелая изменить отображение, которое использует multi-match запросов

...
filter_by_client = [
    {'match_phrase': {'client_id': '2769z'}},
    {'multi_match': {'query': '181.220.174.189', 'fields': ['url', 'field_2']}}
]
...

Посмотрите, как вам нужно явно упомянуть поля, которые необходимо учитывать при запросе.Но обязательно убедитесь, что вы проверили / протестировали его полностью.

Дайте мне знать, если это поможет!

...