當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 }}
]
}}}}
]
}}}