我有以下运行良好的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界面发生的相同行为。
答案 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']}}
]
...
了解如何在查询时明确提及要考虑的字段。但是请确保您对其进行了彻底的验证/测试。
让我知道这是否有帮助!