2

我有一个像下面这样的文档,“标签”字段是一个嵌套文档,我想让标签文档的所有子字段成为 index = not_analyzed。问题是标签中的字段将是动态的。任何标签都是可能的。那么我如何为此定义动态映射。

{
 strong text'level': 'info',
 'tags': {
  'content': u'Nov  6 11:07:10 ja10 Keepalived_healthcheckers: Adding service [172.16.08.105:80] to VS [172.16.1.21:80]',
  'id': 1755360087,
  'kid': '2012121316',
  'mailto': 'yanping3,chunying,pengjie',
  'route': 15,
  'service': 'LVS',
  'subject': 'LVS_RS',
  'upgrade': 'no upgrade configuration for this alert'
 },
 'timestamp': 1383707282.500464
}
4

3 回答 3

6

我认为您可以为此使用动态模板。例如,以下 shell 脚本在索引字段时dynamic_mapping_test使用 set 创建索引,映射设置为and 。dynamic templatetags.*type:stringindex:not_analyzed

echo "Delete dynamic_mapping_test"
curl -s -X DELETE http://localhost:9200/dynamic_mapping_test?pretty ; echo ""

echo "Create dynamic_mapping_test with nested tags and dynamic_template"
curl -s -X POST http://localhost:9200/dynamic_mapping_test?pretty -d '{
  "mappings": {
    "document": {
      "dynamic_templates": [
        {
          "string_template": {
            "path_match": "tags.*",
            "mapping": {
              "type": "string",
              "index": "not_analyzed"
            }
          }
        }
      ],
      "properties": {
        "tags": {
          "type": "nested"
        }
      }
    }
  }
}' ; echo ""


echo "Display mapping"
curl -s "http://localhost:9200/dynamic_mapping_test/_mapping?pretty" ; echo ""

echo "Index document with new property tags.content"
curl -s -X POST "http://localhost:9200/dynamic_mapping_test/document?pretty" -d '{
  "tags": {
    "content": "this CONTENT should not be analyzed"
  }
}' ; echo ""

echo "Refresh index"
curl -s -X POST "http://localhost:9200/dynamic_mapping_test/_refresh"

echo "Display mapping again"
curl -s "http://localhost:9200/dynamic_mapping_test/_mapping?pretty" ; echo ""

echo "Index document with new property tags.title"
curl -s -X POST "http://localhost:9200/dynamic_mapping_test/document?pretty" -d '{
  "tags": {
    "title": "this TITLE should not be analyzed"
  }
}' ; echo ""

echo "Refresh index"
curl -s -X POST "http://localhost:9200/dynamic_mapping_test/_refresh"; echo ""

echo "Display mapping again"
curl -s "http://localhost:9200/dynamic_mapping_test/_mapping?pretty" ; echo ""
于 2013-11-12T14:03:10.167 回答
2

我建议,所有字符串“not_analyzed”,所有数字都长和“not_analyzed”。

因为分析的默认字符串有更多的内存和文件大小。

我缩小了大小并搜索字段的完整字词

范围搜索长类型。

{
  "mappings": {
    "_default_": {
      "_source": {
        "enabled": true
      },
      "_all": {
        "enabled": false
      },
      "_type": {
        "index": "no",
        "store": false
      },
      "dynamic_templates": [
        {
          "el": {
            "match": "*",
            "match_mapping_type": "long",
            "mapping": {
              "type": "long",
              "index": "not_analyzed"
            }
          }
        },
        {
          "es": {
            "match": "*",
            "match_mapping_type": "string",
            "mapping": {
              "type": "string",
              "index": "not_analyzed"
            }
          }
        }
      ]
    }
  }
}
于 2014-11-24T06:24:08.700 回答
0

我认为在索引数据时没有任何方法可以指定映射。因此,作为替代方案,您可以修改标签文档以具有以下映射:

{ tags: {
          properties: {
                        tag_type: {type: 'string', index: 'not_analyzed'}
                        tag_value: {type: 'string', index: 'not_analyzed'}
                       }
        }
}

在这里,tag_type可以包含任何值(contentidkidmailto等),并且tag_values可以包含在 tag_type 中命名的字段的实际值。

于 2013-11-12T12:36:04.457 回答