elasticsearch Not_analyzed and analysis

时间:2016-01-29 10:28:51

标签: indexing elasticsearch lucene

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}

2 个答案:

答案 0 :(得分:4)

简而言之,您希望更改索引的映射。

  • 如果你的索引不包含任何数据(我想,不是 case),然后你可以简单地删除索引并再次创建它 新的地图。
  • 如果索引包含数据,则必须reindex

重建索引的步骤:

  • 将现有索引中的所有数据放入虚拟索引。
  • 删除现有索引。生成新的映射。
  • 将数据从虚拟索引传输到新创建的索引。

您还可以查看elastic search alias here

This链接也可能有用。

如果您想同时使用analysednot 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"
            }
          }
        }
      ]
    }
  }
}

希望这会有所帮助!!