elasticsearch - ElasticSearch:何时使用多字段
问题描述
我们有一个带有关键字字段的索引,该字段通常是 IP 地址,但并非总是如此。我们希望能够不仅使用关键字而且还使用 CIDR 表示法在该字段上搜索此索引,CIDR 表示法仅支持“ip”类型的字段。从表面上看,这看起来像是多字段的用例。
来自https://www.elastic.co/guide/en/elasticsearch/reference/current/multi-fields.html:
出于不同目的以不同方式索引同一字段通常很有用。这就是多领域的目的
所以看起来下面的映射对我们来说是有意义的:
{
"mappings": {
"my_field": {
"type": "keyword"
"fields": {
"ip": {
"type": "ip"
"ignore_malformed": true
}
}
}
}
}
因此,当我们的应用程序有一组非 IP 地址、IP 地址和 IP 地址的 CIDR 表示法块/范围并需要通过它们查询时,我假设应用程序会将该组拆分为一组具有非 IP 地址另一个带有 ip 地址/CIDR-notation 块,并在我的查询中从它们中生成两个单独的术语过滤器,如下所示:
{
"query": {
"bool": {
"filter": [
{
"terms": {
"my_field.ip": [
"123.123.123.0/24",
"192.168.0.1",
"192.168.16.255",
"192.169.1.0/24"
]
}
},
{
"terms": {
"my_field": [
"someDomain.com",
"notAnIp.net"
]
}
}
]
}
}
}
这是对多字段的正确使用吗?我们应该以其他方式实现这一目标吗?它与使用多字段的示例不同,因为它实际上是字段值的子集,而不是全部,因为我使用 ignore_malformed 来丢弃子字段中的非 IP 地址。如果有更好的方法,它是什么?
解决方案
是的,您对多字段的理解是正确的,您只需要了解您需要显式定义子字段定义(数据类型和分析器)并显式映射它们,以便它使用定义的(数据类型和分析仪)。
现在,一旦以您想要的格式索引数据,您就可以根据您的用例包含/排除子字段。
具有多个分析器的多字段是实现多语言搜索非常常见的一个更好的示例,您可以参考。
推荐阅读
- sql - 插入查询以同时具有选择和值作为值
- reactjs - 根据所选应用更改外部共享消息
- elasticsearch - Elasticsearch 可以做反向前缀搜索吗?
- excel - VBA 类不支持自动化或不支持预期的接口
- json - 从 Snowflake 卸载数据时,将 OBJECT_CONSTRUCT 结果嵌套在 JSON 数组中
- ios - iOS 通过蓝牙控制音量
- asp.net-core - 在 asp.net core 2.1 中使用自定义 log4net 提供程序时添加结构日志记录功能
- c# - CompileAssemblyFromFile c# 属性 7.2 失败
- excel - 基于索引匹配的 SUM 单元格
- swift - 使用 SwiftyJSON 将数据附加到现有的 JSON 数组