Elasticsearch 索引的映射配置詳解


概述

Elasticsearch 與傳統的 SQL數據庫的一個明顯的不一樣點是,Elasticsearch 是一個 非結構化 的數據庫,或者說是一個 無模式 的數據庫。Elasticsearch 中數據最重要的三要素當屬:索引類型文檔,其中索引這個概念很是重要,咱們能夠粗略地將其類比到傳統SQL數據庫中的 數據表。本文就從 Elasticsearch 的索引映射如何配置開始講起。數據庫

注: 本文首發於 My Personal Blog,歡迎光臨 小站json

本文內容腦圖以下:文章共1540字,閱讀本文大約須要5分鐘 !bash

本文內容腦圖



索引模式映射

建立索引時,能夠自定義索引的結構,好比 建立一個保存用戶信息數據的 users 索引,其典型的結構以下:app

  • id:惟一表示符
  • name:姓名
  • birthday:出生日期
  • hobby:愛好

爲此咱們能夠建立一個 json 格式的索引模式映射文件:users.jsoncurl

{
	"mappings" : {
		"user" : {
			"properties" : {
				"id" : {
					"type" : "long",
					"store" : "yes"
				},
				"name" : {
					"type" : "string",
					"store" : "yes",
					"index" : "analyzed"
				},
				"birthday" : {
					"type" : "date",
					"store" : "yes"
				},
				"hobby" : {
					"type" : "string",
					"store" : "no",
					"index" : "analyzed"
				}
				
			}
		}
	}
}
複製代碼

上面的 json代碼意義以下:工具

  • 建立一個名稱爲 usersIndex
  • 裏面有一個名稱爲 userType
  • user 有四個 field
  • 且每一個 field 都有本身的 屬性 定義

而後咱們來執行以下命令來新建一個索引:post

curl -X PUT http://47.98.43.236:9200/users -d @users.json
複製代碼

結果以下,索引 users、類型 user、以及 四個字段 都已經順利插入:性能

新建一個索引

關於字段的 可選類型,有以下幾種:學習

  • string:字符串
  • number:數字
  • date:日期
  • boolean:布爾型
  • binary:二進制
  • ip:IP地址
  • token_count類型

關於每種類型有哪些 屬性,可參考官方文檔,因爲內容太多,此處再也不贅述。測試



分析器的使用

分析器是一種用於 分析數據 或者按照用戶想要的方式 處理數據 的工具,對於 字符串類型 的字段,Elasticsearch 容許用戶自定義分析器。

  • 先來自定義一個分析器
{
  "settings" : {
    "index" : {
      "analysis" : {
        "analyzer" : {
          "myanalyzer" : {
            "tokenizer" : "standard",
            "filter" : [
              "asciifolding",
              "lowercase",
              "myFilter"
            ]
          }
        },
        "filter" : {
          "myFilter" : {
            "type" : "kstem"
          }
        }
      }

    }
  },
	"mappings" : {
		"user" : {
			"properties" : {
				"id" : {
					"type" : "long",
					"store" : "yes"
				},
				"name" : {
					"type" : "string",
					"store" : "yes",
					"index" : "analyzed",
                    "analyzer" : "myanalyzer"
				},
				"birthday" : {
					"type" : "date",
					"store" : "yes"
				},
				"hobby" : {
					"type" : "string",
					"store" : "no",
					"index" : "analyzed"
				}

			}
		}
	}
}
複製代碼

上述 json代碼中,用戶定義了一個名爲 myanalyzer 的分析器,該分析器包含 一個分詞器 + 三個過濾器,分別以下:

  1. 分詞器:standard
  2. 過濾器:asciifolding
  3. 過濾器:lowercase
  4. 過濾器:myFilter(自定義過濾器,其本質是 kstem
  • 再來看如何測試和使用自定義的分析器

能夠經過相似以下的 Restful接口來測試 analyze API 的工做狀況:

curl -X GET 'http://47.98.43.236:9200/users/_analyze?field=user.name' -d 'Cars Trains'
複製代碼

可見咱們輸入的時一行字符串普通"Cars Trains",而輸出爲:cartrain,這說明短語 "Cars Trains" 被分紅了兩個詞條,而後所有轉爲小寫,最後作了詞幹提取的操做,由此證實咱們上面自定義的分析器已然生效了!



類似度模型的配置

Elasticsearch 容許爲索引模式映射文件中的不一樣字段指定不一樣的 類似度得分 計算模型,其用法例析以下:

"mappings" : {
		"user" : {
			"properties" : {
				"id" : {
					"type" : "long",
					"store" : "yes"
				},
				"name" : {
					"type" : "string",
					"store" : "yes",
					"index" : "analyzed",
                    "analyzer" : "myanalyzer",
                    "similarity" : "BM25"
				},
				"birthday" : {
					"type" : "date",
					"store" : "yes"
				},
				"hobby" : {
					"type" : "string",
					"store" : "no",
					"index" : "analyzed"
				}

			}
		}
	}
複製代碼

上述 json文件中,咱們爲 name 字段使用了 BM25 這種類似度模型,添加的方法是使用 similarity 屬性的鍵值對,這樣一來 Elasticsearch 將會爲 name 字段使用 BM25 類似度計算模型來計算類似得分。



信息格式的配置

Elasticsearch 支持爲每一個字段指定信息格式,以知足經過改變字段被索引的方式來提升性能的條件。Elasticsearch 中的信息格式有以下幾個:

  • default:默認信息格式,其提供了實時的對存儲字段和詞向量的壓縮
  • pulsing:將 重複值較少字段 的信息列表 編碼爲詞條矩陣,可加快 該字段的查詢速度
  • direct:該格式在讀過程當中將詞條加載到未經壓縮而存在內存的矩陣中,該格式能夠提高經常使用字段的性能,但損耗內存
  • memory:該格式將全部的數據寫到磁盤,而後須要FST來讀取詞條和信息列表到內存中
  • bloom_default:默認信息格式的擴展,增長了把 bloom filter 寫入磁盤的功能。讀取時 bloom filter 被讀取並存入內存,以便快速檢查給定的值是否存在
  • bloom_pulsingpulsing 格式的擴展,也加入 bloom filter 的支持

信息格式字段(postings_format)能夠在 任何一個字段上 進行設置,配置信息格式的示例以下:

"mappings" : {
		"user" : {
			"properties" : {
				"id" : {
					"type" : "long",
					"store" : "yes",
                    "postings_format" : "pulsing"
				},
				"name" : {
					"type" : "string",
					"store" : "yes",
					"index" : "analyzed",
                    "analyzer" : "myanalyzer"
				},
				"birthday" : {
					"type" : "date",
					"store" : "yes"
				},
				"hobby" : {
					"type" : "string",
					"store" : "no",
					"index" : "analyzed"
				}

			}
		}
	} 
複製代碼

在該例子之中,咱們手動配置改變了 id 字段的信息格式爲 pulsing,所以可加快該字段的查詢速度。



文檔值及其格式的配置

文檔值 這個字段屬性做用在於:其容許將給定字段的值被寫入一個更高內存效率的結構,以便進行更加高效排序搜索。咱們一般能夠將該屬性加在 須要進行排序 的字段上,這樣能夠 提效

其配置方式是 經過屬性 doc_values_format 進行,有三種經常使用的 doc_values_format 屬性值,其含義從名字中也能猜個大概:

  • default:默認格式,其使用少許的內存但性能也不錯
  • disk:將數據存入磁盤,幾乎無需內存
  • memory:將數據存入內存

舉個栗子吧:

"mappings" : {
		"user" : {
			"properties" : {
				"id" : {
					"type" : "long",
					"store" : "yes"
				},
				"name" : {
					"type" : "string",
					"store" : "yes",
					"index" : "analyzed",
          "analyzer" : "myanalyzer"
				},
				"birthday" : {
					"type" : "date",
					"store" : "yes"
				},
				"hobby" : {
					"type" : "string",
					"store" : "no",
					"index" : "analyzed"
				},
                "age" : {
                    "type" : "integer",
                    "doc_values_format" : "memory"
                 }
			}
		}
	}
複製代碼

上述 json配置中,咱們給類型 user 添加了一個 age 字段,假如咱們想對年齡字段進行排序,那麼給該字段設置文檔值格式的屬性是能夠提高效率的。



後 記

因爲能力有限,如有錯誤或者不當之處,還請你們批評指正,一塊兒學習交流!


長按掃描 下面的 當心心 來訂閱 CodeSheep,獲取更多 務實、能看懂、可復現的 原創文 ↓↓↓

CodeSheep · 程序羊
相關文章
相關標籤/搜索