解决的问题/使用场景:
字符串字段中的JSON数据也能够被搜索
有个索引RequestLog记录客户端请求log
RequestLog {
String time; // 请求时间
String params; // 请求参数,json格式的字符串
xxxx
}
由于无法确定请求参数包含的所有属性,所以建立索引时无法确定字段。
此时,将 params 字段的es数据类型设置为flattened 即可在数据进入es时,自动展开json中的所有字段。
具体操作如下
在Elasticsearch中,如果你有一个字段存储了JSON格式的字符串,你可以使用内置的flattened
数据类型将其转换为可搜索的对象。flattened
数据类型能够自动展开嵌套的JSON对象,使其中的字段可以被单独索引和查询。
示例:
假设你有一个名为my_index
的索引,其中包含一个名为json_field
的字段,该字段存储了JSON格式的字符串:
-
创建映射
PUT my_index
{
"mappings": {
"properties": {
"json_field": {
"type": "flattened"
}
}
}
}
在上面的映射中,我们将json_field
字段的类型设置为flattened
。
-
索引一个文档
PUT my_index/_doc/1
{
"json_field": "{\"a\": 1, \"b\": {\"c\": 2}}"
}
在这个示例中,我们索引了一个包含JSON字符串的文档。
-
查询文档
现在,你可以像查询普通字段一样查询JSON字段中的键值对:
GET my_index/_search
{
"query": {
"term": {
"json_field.a": 1
}
}
}
GET my_index/_search
{
"query": {
"term": {
"json_field.b.c": 2
}
}
}
以上查询将返回包含a=1
和b.c=2
的文档。
结语
使用flattened
数据类型,Elasticsearch能够自动展开嵌套的JSON对象,并将其中的字段作为单独的字段进行索引和查询。这使得存储在单个字符串字段中的JSON数据也能够被高效地搜索。