ES動態映射成keyword不能全文檢索

當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索引一旦創建就不能唄修改,但是也有例外,例如:

 

修改之後,還是不能模糊搜索,後來知道有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     }}
                ]
        }}}}
      ]
}}}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章