python elasticsearch:如何在所有字段上查询字符串

时间:2018-11-26 17:01:57

标签: python elasticsearch elastic-stack elasticsearch-py

我有以下运行良好的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 :(得分:1)

Nishant所说的是使用copy_to字段的最佳解决方案,但是,如果您没有更改映射的控件,则可以尝试看看以下任何一种方法是否有帮助。

使用查询字符串查询

您可以使用Query String Query进行查询,如下所示:

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

一个重要的注意事项是query_string默认搜索所有字段。我提到的链接如下所示:

  

如果未指定前缀字段,则为查询词的默认字段。   默认为index.query.default_field索引设置,该设置位于   将默认设置为*。 *提取映射中的所有字段   符合条件查询和过滤元数据字段的条件。

我之所以提及这一点,是因为我希望您在决定使用query_string之前先了解一下使用query_string与简单匹配Match vs Query-String的区别。

  

匹配项查询没有经过“查询解析”   处理。它不支持字段名称前缀,通配符,   或其他“高级”功能。因此,失败的机会   很小/根本不存在,并且行为出色   仅涉及分析和运行该文本作为查询行为时   (通常是文本搜索框的功能)。另外,   statement_prefix类型可以为您提供出色的“输入时”行为   自动加载搜索结果。

使用多重匹配

下面是另一个可能的解决方案,如果您不想更改映射,该映射将使用multi-match个查询

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

了解如何在查询时明确提及要考虑的字段。但是请确保您对其进行了彻底的验证/测试。

让我知道这是否有帮助!