使用ElasticSearch映射文档的问题

时间:2014-02-18 20:30:31

标签: elasticsearch

我有一个文档,我希望存储在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个字段将明确标识“类型”。

从上面的例子中我看不出如何编写映射,因为“值”可以是:

  • 整数
  • IP地址
  • 需要仅通过空格进行标记化的字段
  • 日期时间
  • GEO Point

我能看到的唯一解决方案是需要将文档转换为另一种格式,以便更容易使用ElasticSearch进行映射吗?

2 个答案:

答案 0 :(得分:0)

这种情况在这里有所描述:http://www.found.no/foundation/beginner-troubleshooting/#keyvalue-woes

您不能在同一个字段中使用不同类型的值。您可以执行的操作包括location_valuetimestamp_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设计为在字段和值方面具有灵活性,因此它几乎可以处理你抛出的任何键/值组合。

您可以选择将原始文档包含在显式存储但未编入索引的字段中,以防您需要在查询中返回原始文档。