Hello对于某些要求,我已将所有索引设为not_analyzed
{
"template": "*",
"mappings": {
"_default_": {
"dynamic_templates": [
{
"my_template": {
"match_mapping_type": "string",
"mapping": {
"index": "not_analyzed"
}
}
}
]
}
}
}
但是现在根据我们的要求,我必须对某些领域进行分析。并保持其他领域未分析
我的数据类型为:
{ "field1":"Value1",
"field2":"Value2",
"field3":"Value3",
"field4":"Value3",
"field5":"Value4",
"field6":"Value5",
"field7":"Value6",
"field8":"",
"field9":"ce-3sdfa773-7sdaf2-989e-5dasdsdf",
"field10":"12345678",
"field11":"ertyu12345ffd",
"field12":"A",
"field13":"Value7",
"field14":"Value8",
"field15":"Value9",
"field16":"Value10",
"field17":"Value11",
"field18":"Value12",
"field19":{
"field20":"Value13",
"field21":"Value14"
},
"field22":"Value15",
"field23":"ipaddr",
"field24":"datwithtime",
"field25":"Value6",
"field26":"0",
"field20":"0",
"field28":"0"
}
如果我根据建议将模板更改为此类
{
"template": "*",
"mappings": {
"_default_": {
"properties": {
"filed6": {
"type": "string",
"analyzer": "keyword",
"fields": {
"raw": {
"type": "string",
"index": "not_analyzed"
}
}}},
"dynamic_templates": [
{
"my_template": {
"match_mapping_type": "*",
"mapping": {
"type": "string",
"index": "not_analyzed"
}
}
}
]
}
}
}
然后我插入数据说明
时出错{“error”:“MapperParsingException [无法解析[field19]];嵌套:ElasticsearchIllegalArgumentException [未知属性[field20]];”,“状态”:400}
答案 0 :(得分:4)
简而言之,您希望更改索引的映射。
reindex
。 重建索引的步骤:
您还可以查看elastic search alias
here
This链接也可能有用。
如果您想同时使用analysed
和not analysed
相同的字段,则必须使用multifield
"title": {
"type": "multi_field",
"fields": {
"title": { "type": "string" },
"raw": { "type": "string", "index": "not_analyzed" }
}
}
This供您参考。
要在multifield
中定义dynamic_templates
,请使用:
{
"template": "*",
"mappings": {
"_default_": {
"dynamic_templates": [
{
"my_template": {
"match_mapping_type": "string",
"mapping": {
"type": "string",
"fields": {
"raw": {
"type": "string",
"index": "not_analyzed"
}
}
}
}
}
]
}
}
}
有关详细信息,请参阅this。
答案 1 :(得分:1)
您可以根据自己的要求编写multiple templates
或具有单独的属性。两者都会顺利进行。
1)多个模板
{
"mappings": {
"your_doctype": {
"dynamic_templates": [
{
"analyzed_values": {
"match_mapping_type": "*",
"match_pattern": "regex",
"match": "title|summary",
"mapping": {
"type": "string",
"analyzer": "keyword"
}
}
},
{
"date_values": {
"match_mapping_type": "date",
"match": "*_date",
"mapping": {
"type": "date"
}
}
},
{
"exact_values": {
"match_mapping_type": "*",
"mapping": {
"type": "string",
"index": "not_analyzed"
}
}
}
]
}
}
}
此处标题和摘要是analyzed
keyword analyzer
。我还添加了date
字段,该字段是可选的,它会将 create_date 等映射为日期。最后一个将匹配任何内容,not_analyzed
将满足您的要求。
2)将分析的字段添加为属性。
{
"mappings": {
"your_doctype": {
"properties": {
"title": {
"type": "string",
"analyzer": "keyword"
},
"summary": {
"type": "string",
"analyzer": "keyword"
}
},
"dynamic_templates": [
{
"any_values": {
"match_mapping_type": "*",
"mapping": {
"type": "string",
"index": "not_analyzed"
}
}
}
]
}
}
}
此处标题和摘要字段为analyzed
,而其余字段为not_analyzed
无论采用哪种解决方案,都必须重新编制数据索引。
编辑1 :查看数据和映射后,其中存在一个小问题。您的数据包含object
结构,您将除 filed6 之外的所有内容映射为string
而已归档19 是对象,不是字符串,因此ES抛出错误。解决方案是让ES决定哪个datatype
字段与dynamic_type
。将映射更改为此
{
"template": "*",
"mappings": {
"_default_": {
"properties": {
"filed6": {
"type": "string",
"analyzer": "keyword",
"fields": {
"raw": {
"type": "string",
"index": "not_analyzed"
}
}
}
},
"dynamic_templates": [
{
"my_template": {
"match_mapping_type": "*",
"mapping": {
"type": "{dynamic_type}", <--- this will decide if field is either object or string.
"index": "not_analyzed"
}
}
}
]
}
}
}
希望这会有所帮助!!