我有一个文档,我希望存储在ElasticSearch中并能够运行查询,但我认为文档结构可能很糟糕,因此我无法进行有效的查询。
该文档试图是通用的,因此具有一组重复结构。
例如:
description : [
{ type : "port", value : 1234 }.
{ type : "ipaddress", value : "192.168.0.1" },
{ type : "path", value : "/app/index.jsp app/hello.jsp" },
{ type : "upsince", value : "2014-01-01 12:00:00" },
{ type : "location", value : "-40, 70" }
]
注意:我简化了示例,因为在真实文档中重复结构有大约7个字段,其中3个字段将明确标识“类型”。
从上面的例子中我看不出如何编写映射,因为“值”可以是:
我能看到的唯一解决方案是需要将文档转换为另一种格式,以便更容易使用ElasticSearch进行映射吗?
答案 0 :(得分:0)
这种情况在这里有所描述:http://www.found.no/foundation/beginner-troubleshooting/#keyvalue-woes
您不能在同一个字段中使用不同类型的值。您可以执行的操作包括location_value
,timestamp_value
等不同字段。
这是一个可运行的示例:https://www.found.no/play/gist/ad90fb9e5210d4aba0ee
#!/bin/bash
export ELASTICSEARCH_ENDPOINT="http://localhost:9200"
# Create indexes
curl -XPUT "$ELASTICSEARCH_ENDPOINT/play" -d '{
"mappings": {
"type": {
"properties": {
"description": {
"type": "nested",
"properties": {
"integer_value": {
"type": "integer"
},
"type": {
"type": "string",
"index": "not_analyzed"
},
"timestamp_value": {
"type": "date"
}
}
}
}
}
}
}'
# Index documents
curl -XPOST "$ELASTICSEARCH_ENDPOINT/_bulk?refresh=true" -d '
{"index":{"_index":"play","_type":"type"}}
{"description":[{"type":"port","integer_value":1234},{"type":"upsince","timestamp_value":"2014-01-01T12:00:00"}]}
'
答案 1 :(得分:0)
如果您先将这些文档转换为
,那么您正在为自己节省很多麻烦{
"port": 1234,
"ipaddress" : "192.168.0.1" ,
"path" : "/app/index.jsp app/hello.jsp",
"upsince" : "2014-01-01 12:00:00",
"location" : "-40, 70"
}
Elasticsearch设计为在字段和值方面具有灵活性,因此它几乎可以处理你抛出的任何键/值组合。
您可以选择将原始文档包含在显式存储但未编入索引的字段中,以防您需要在查询中返回原始文档。