当ES在文档中碰到一个以前没见过的字段时,它会利用动态映射来决定该字段的类型,并自动地对该字段添加映射。
ES动态映射,创建了字段,而且默认添加一个keyword的field,导致不能全文索引
"custom_info": {
"properties": {
"attendSchool": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
查询语句,查询不出来。必须精确查询才能匹配上。
GET /imc_case_v3/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"custom_info.case.motherName": "mmmm"
}
}
]
}
}
}
有时这正是需要的行为,但有时不是。你或许不知道在以后你的文档中会添加哪些字段,但是你想要它们能够被自动地索引。或许你只是想要忽略它们。或者 - 尤其当你将ES当做主要的数据存储使用时 - 大概你会希望这些未知的字段会抛出异常来提醒你注意这一问题。
幸运的是,你可以通过dynamic
设置来控制这一行为,它能够接受以下的选项:
true
:默认值。动态添加字段false
:忽略新字段strict
:如果碰到陌生字段,抛出异常
尽管ES索引一旦创建就不能呗修改,但是也有例外,例如:
- new
properties
can be added to Object fields. - new multi-fields can be added to existing fields.
- the
ignore_above
parameter can be updated.
修改之后,还是不能模糊搜索,后来知道有nested类型,会对内部对象也索引,但是隐藏文档,不能直接用query查询。
GET /my_index/blogpost/_search
{
"query": {
"bool": {
"must": [
{ "match": { "title": "eggs" }}, <1>
{
"nested": {
"path": "comments", <2>
"query": {
"bool": {
"must": [ <3>
{ "match": { "comments.name": "john" }},
{ "match": { "comments.age": 28 }}
]
}}}}
]
}}}