我想运行一个查询,筛选出一个IP地址范围,如123.[16-31].0.*
(包括16和31)。
GET _search
{
"query": {
"bool": {
"must": {
"match_phrase": {
"somefield": "somevalue"
}
},
"must_not": {
... ip filter ...
}
}
}
}
字符串
如何编写must_not
部分?
一个似乎可行的解决方案是在must_not
中放入16个范围:
"must_not": [
{
"range": {
"host.ip": {
"gte": "123.16.0.0",
"lte": "123.16.0.255"
}
}
},
.... same for 17 until 30
{
"range": {
"host.ip": {
"gte": "123.31.0.0",
"lte": "123.31.0.255"
}
}
}
]
型
但是需要输入很多东西。我喜欢使用这样的正则表达式:
"must_not": {
"regexp": {
"host.ip": "123.(1[6-9]|2[0-9]|30|31).0.*"
}
}
型
但是很明显它在Can only use regexp queries on keyword and text fields - not on [host.ip] which is of type [ip]
上失败了。
1条答案
按热度按时间zu0ti5jz1#
生成16个范围是最快的解决方案。但是,如果您不多次运行此请求,并且更愿意用一些CPU时间换取程序员时间,则可以使用运行时Map将
ip
字段转换为keyword
字段。这样,您将能够像对待任何其他文本字段一样对待此字段。因此,您可以这样做:字符串
或者更好的是这样的:
型