elasticsearch,lucene,Indexing,elasticsearch,Lucene" /> elasticsearch,lucene,Indexing,elasticsearch,Lucene" />

Indexing 弹性搜索未进行分析和分析

Indexing 弹性搜索未进行分析和分析,indexing,elasticsearch,lucene,Indexing,elasticsearch,Lucene,您好,对于某些要求,我已经做了所有未分析的索引 { "template": "*", "mappings": { "_default_": { "dynamic_templates": [ { "my_template": { "match_mapping_type": "string", "mapping": {

您好,对于某些要求,我已经做了所有未分析的索引

{
"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"
            }
          }
        }
      ]
    }
  }
}
然后在插入数据时出错


{“错误”:“MapperParsingException[未能解析[field19]];嵌套:ElasticsearchIllegalArgumentException[未知属性[field20]];”,“状态”:400}

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

  • 如果您的索引不包含任何数据(我想这不是 然后您可以简单地删除索引并使用 新地图
  • 如果索引包含数据,则必须
    reindex
重新编制索引的步骤:

  • 将现有索引中的所有数据放到虚拟索引中
  • 删除现有索引。生成新映射
  • 将数据从虚拟索引传输到新创建的索引
您还可以查看
弹性搜索别名

链接也可能有用

如果要同时使用与
已分析的
未分析的
相同的字段,则必须使用
多字段

"title": {
"type": "multi_field",
"fields": {
    "title": { "type": "string" },
    "raw":   { "type": "string", "index": "not_analyzed" }
 }
}
仅供参考

要在
动态\u模板中定义
多字段
,请使用:

{
"template": "*",
"mappings": {
"_default_": {
    "dynamic_templates": [
        {
            "my_template": {
                "match_mapping_type": "string",
                 "mapping": {
                 "type": "string",
                 "fields": {
                  "raw": {
                   "type":  "string",
                     "index": "not_analyzed"
                }
               }
              }
            }
        }
      ]
    }
  }
 }

有关这方面的更多信息,请参阅。

您可以编写多个模板
,也可以根据您的要求使用单独的属性。两者都将顺利运作

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"
            }
          }
        }
      ]
    }
  }
}
这里的标题和摘要由
关键字分析器
分析。我还添加了
date
字段,该字段是可选的,它将创建日期等映射为日期。最后一个将匹配任何内容,并且它将
不进行分析
,这将满足您的需求

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"
            }
          }
        }
      ]
    }
  }
}
在这里,标题和摘要字段将被分析,而其余字段将被分析

无论采用哪种解决方案,都必须对数据重新编制索引

编辑1:查看数据和映射后,其中有一个小问题。您的数据包含
对象
结构,您正在将除filed6之外的所有内容映射为
字符串
,filed19是对象而不是字符串,因此ES抛出错误。解决方案是让ES决定字段的
数据类型是
动态类型
。将映射更改为此

{
  "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"
            }
          }
        }
      ]
    }
  }
}
{
“模板”:“*”,
“映射”:{
“\u默认值”:{
“财产”:{
“文件6”:{
“类型”:“字符串”,
“分析器”:“关键字”,
“字段”:{
“原始”:{
“类型”:“字符串”,
“索引”:“未分析”
}
}
}
},
“动态模板”:[
{
“我的模板”:{
“匹配映射类型”:“*”,
“映射”:{

“类型”:“{dynamic_type}”,是的,我必须更改它,但我想保留所有字段,除了一些未分析的字段。此外,我需要动态映射,以便日志中的任何新字段都不会被分析。但我不确定该如何操作。因为我可能随时都有新字段,因此没有固定格式来创建已分析或未分析的映射。新字段的附加条件是n这是一个问题。你可以用你想要的任何映射添加字段。当你必须更改现有映射时,问题就会出现。你是否有这样的要求:你可能需要将分析的字段更改为未分析的字段,或者一次又一次地将分析的字段更改为未分析的字段?我们可能有这样的要求,即生成更多已分析的字段,同时保持未分析的字段ld是您所需要的。通过使用多字段,您可以将同一字段保留为已分析字段,而不是同时进行分析。编辑答案。您可以与我当前的模板共享一个示例吗?我应该更改什么以获得字段名“sid”要分析和不分析,因为在我的问题中,我已经粘贴了我正在使用的模板。第一个模板与第二个模板不同。你能帮助我理解属性以及我们何时使用属性吗。另外,如果你能联系我,如果我想保持与不分析和不分析相同的字段,我将如何做。我将不胜感激。。使用以上两个示例,您已经在查看了您的数据和模板后编辑了我的答案。现在应该可以使用了。AFA关于属性和模板的问题,基本上您在不控制ES中的字段时使用模板,您需要一些控制,或者您有许多具有类似特征的字段。您使用pr属性,当有几个不同类型的字段并且您希望对特定字段使用自定义分析器时,等等。