2014-12-19 119 views
22

是否可以選擇性地爲某個類型啓用彈性搜索字段的索引?在彈性搜索中默認禁用字段分析

通過用於特定索引的映射設置,可以設置屬性

{「索引」:「not_analyzed」}

對於一個特定的字段。由於我的文檔有太多的字段,並且很可能在未來會改變結構,所以我需要一個映射,其中默認情況下不分析字段,除非有不同的指定。

這可能嗎?

回答

31

是 - 看看dynamic templates

嘗試以下操作:

PUT /my_index 
{ 
    "mappings": { 
    "my_type": { 
     "dynamic_templates": [ 
      { "notanalyzed": { 
        "match":    "*", 
        "match_mapping_type": "string", 
        "mapping": { 
         "type":  "string", 
         "index":  "not_analyzed" 
        } 
       } 
      } 
      ] 
     } 
    } 
} 

動態模板是那些不屬於你的映射新領域 - 從文檔:

使用dynamic_templates,您可以完全控制爲新檢測字段生成的映射 。

您還可以根據字段名稱來改變映射,例如,使用"match": "*_data",爲以「_data」結尾的字段名稱有一組不同的映射。

+0

我想分析哪些字段? – Edmondo1984

+3

動態模板適用於未被映射覆蓋的新字段 - 「使用dynamic_templates,您可以完全控制爲新檢測字段生成的映射。」您還可以根據字段名稱來改變映射,例如使用「匹配」:「* _data」,以「_data」結尾的字段有一組不同的映射。 –

1

來自elasticsearch 5.x 字符串類型被禁用。相反elasticsearch已經推出了兩種類型文字關鍵字。閱讀這個博客的原因是遷移數據https://www.elastic.co/blog/strings-are-dead-long-live-strings

因此,而不是添加一個模板來禁用分析器,你可以簡單地使用field.keyword進行精確搜索。 例如如果字段名稱是全名,你有項

  1. 全名:「李四」
  2. 全名:「約翰」

然後,全名:「約翰」將返回兩種結果,而全名。關鍵字:「John」將返回單個記錄。

以防萬一,你還是要禁用文本字段,可以使用下面的動態模板,

PUT _template/disable_all_analyzer 
    { 
    "template": "*", 
    "mappings": { 
     "_default_": { 
      "dynamic_templates": [ 
       { "notanalyzed": { 
        "match":    "*", 
        "match_mapping_type": "string", 
        "mapping": { 
         "type":  "keyword" 
        } 
        } 
       } 
      ] 
      } 
     } 
    } 

乾杯!