在 Elasticsearch 中的 IP 数据类型上按类型搜索
Search-as-you-type on IP datatype in Elasticsearch
我们目前正在 UI 中为索引中的某些字段添加“键入即搜索”。
对于字符串字段,Elasticsearch 的功能允许通过多种方式来实现,例如通过 match_phrase_prefix 查询已分析的标记或在索引期间通过 ngrams。
然而,由于 IPv4 地址在内部是 stored as long,据我所知,对它们进行通配符或前缀搜索并不容易。
可以使用范围查询来搜索 IP 范围,但我更想让用户输入“118”并显示“168.1.118.32”、“118.43.119.4”和“ 1.1.1.118".
是否有执行此类查询的内置方法?或者我们是否需要将字段单独存储为分析字符串?
经过更多调查后,我们使用 multi field 将 IP 地址存储两次,一次作为正常 IP 类型,第二次作为分析值,我们将 IP 拆分为 4 个八位字节,以便我们可以搜索这些部分separately.
在模板中,我们使用以下模式在写入索引时拆分值:
"analyzer": {
"ipv4analyzer": {
"tokenizer": "ipv4tokenizer"
}
},
"tokenizer": {
"ipv4tokenizer": {
"pattern": "([0-9]{1,3})",
"type": "pattern",
"group": "1"
}
}
我们目前正在 UI 中为索引中的某些字段添加“键入即搜索”。
对于字符串字段,Elasticsearch 的功能允许通过多种方式来实现,例如通过 match_phrase_prefix 查询已分析的标记或在索引期间通过 ngrams。
然而,由于 IPv4 地址在内部是 stored as long,据我所知,对它们进行通配符或前缀搜索并不容易。
可以使用范围查询来搜索 IP 范围,但我更想让用户输入“118”并显示“168.1.118.32”、“118.43.119.4”和“ 1.1.1.118".
是否有执行此类查询的内置方法?或者我们是否需要将字段单独存储为分析字符串?
经过更多调查后,我们使用 multi field 将 IP 地址存储两次,一次作为正常 IP 类型,第二次作为分析值,我们将 IP 拆分为 4 个八位字节,以便我们可以搜索这些部分separately.
在模板中,我们使用以下模式在写入索引时拆分值:
"analyzer": {
"ipv4analyzer": {
"tokenizer": "ipv4tokenizer"
}
},
"tokenizer": {
"ipv4tokenizer": {
"pattern": "([0-9]{1,3})",
"type": "pattern",
"group": "1"
}
}