1. 程式人生 > >Elasticsearch教程 elasticsearch Mapping的建立

Elasticsearch教程 elasticsearch Mapping的建立

一、Mapping介紹

在 Elasticsearch  中, Mapping  是什麼?

mapping  在 Elasticsearch  中的作用就是約束。

1.資料型別宣告

它類似於靜態語言中的資料型別宣告,比如宣告一個欄位為String, 以後這個變數都只能儲存String型別的資料。同樣的, 一個number型別的 mapping  欄位只能儲存number型別的資料。

2.Mapping它定義了 Type 的屬性。

  1. "_ttl": {"enabled": false}

表示 ttl關閉,其實ttl預設就是關閉。

3.指定分詞器。

  1. "id": {
  2. "index": "not_analyzed",
  3. "type": "string"
  4. }

指定欄位 id不分詞,並且型別為 string

二、建立Mapping

1.下面介紹一下HTTP的建立方式。我一般用Java 建立方式。

  1. PUT http://123.123.123.123:9200/index/type/
  2. {
  3. "settings": {
  4. //設定10個分片,理解為類似資料庫中的表分割槽中一個個分割槽的概念,不知道是否妥當
  5. "number_of_shards": 10
  6. },
  7. "mappings": {
  8. "trades": {
  9. "_id": {
  10. "path": "id"
  11. },
  12. "properties": {
  13. "id": {
  14. "type": "integer",
  15. //id:自增數字
  16. //要求:查詢
  17. "store" : true
  18. },
  19. "name": { //名稱
  20. "type": "string"
  21. },
  22. "brand": { //品牌: PG,P&G,寶潔集團,寶潔股份,聯想集團,聯想電腦等
  23. "type": "string"
  24. },
  25. "orderNo": { //訂單號 :如ATTS000928732
  26. "type": "string",
  27. "index": "not_analyzed"
  28. },
  29. "description": {
  30. //描述: 2015款玫瑰香型強生嬰兒沐浴露,550ml,包郵
  31. "type": "string",
  32. "sort": true
  33. },
  34. "date": {
  35. "type": "date"
  36. },
  37. "city": {
  38. "type": "string"
  39. },
  40. "qty": {// index分詞無效
  41. "type": "float"
  42. },
  43. "price": {
  44. //價格: float index無效
  45. "type": "float"
  46. }
  47. }
  48. }
  49. }
  50. }

上面是從其他地方抄過來的。因為我不用這種方式。

2.Java方式建立。

構建 Mapping 

  1. package com.sojson.core.elasticsearch.mapping;
  2. import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;
  3. import java.io.IOException;
  4. import org.elasticsearch.common.xcontent.XContentBuilder;
  5. public class ZhidaoMapping {
  6. public static XContentBuilder getMapping(){
  7. XContentBuilder mapping = null;
  8. try {
  9. mapping = jsonBuilder()
  10. .startObject()
  11. //開啟倒計時功能
  12. .startObject("_ttl")
  13. .field("enabled",false)
  14. .endObject()
  15. .startObject("properties")
  16. .startObject("title")
  17. .field("type","string")
  18. .endObject()
  19. .startObject("question")
  20. .field("type","string")
  21. .field("index","not_analyzed")
  22. .endObject()
  23. .startObject("answer")
  24. .field("type","string")
  25. .field("index","not_analyzed")
  26. .endObject()
  27. .startObject("category")
  28. .field("type","string")
  29. .field("index","not_analyzed")
  30. .endObject()
  31. .startObject("author")
  32. .field("type","string")
  33. .field("index","not_analyzed")
  34. .endObject()
  35. .startObject("date")
  36. .field("type","string")
  37. .field("index","not_analyzed")
  38. .endObject()
  39. .startObject("answer_author")
  40. .field("type","string")
  41. .field("index","not_analyzed")
  42. .endObject()
  43. .startObject("answer_date")
  44. .field("type","string")
  45. .field("index","not_analyzed")
  46. .endObject()
  47. .startObject("description")
  48. .field("type","string")
  49. .field("index","not_analyzed")
  50. .endObject()
  51. .startObject("keywords")
  52. .field("type","string")
  53. .field("index","not_analyzed")
  54. .endObject()
  55. .startObject("read_count")
  56. .field("type","integer")
  57. .field("index","not_analyzed")
  58. .endObject()
  59. //關聯資料
  60. .startObject("list").field("type","object").endObject()
  61. .endObject()
  62. .endObject();
  63. } catch (IOException e) {
  64. e.printStackTrace();
  65. }
  66. return mapping;
  67. }
  68. }

建立 Mapping 

  1. public static void createBangMapping(){
  2. PutMappingRequest mapping = Requests.putMappingRequest(INDEX).type(TYPE).source(ZhidaoMapping.getMapping());
  3. ESTools.client.admin().indices().putMapping(mapping).actionGet();
  4. }

建立的時候,需要 index已經建立才行,要不然會報錯。

  1. //構建一個Index(索引) CreateIndexRequest request = new CreateIndexRequest(INDEX);
  2. ESTools.client.admin().indices().create(request);

建立完畢在 Head  外掛裡檢視或者Get請求。

  1. http://123.123.123.123:9200/index/type/_mapping

得到的結果:

  1. {
  2. "zhidao_index": {
  3. "mappings": {
  4. "zhidao_type": {
  5. "_ttl": {
  6. "enabled": false
  7. },
  8. "properties": {
  9. "answer": {
  10. "type": "string",
  11. "index": "not_analyzed"
  12. },
  13. "answerAuthor": {
  14. "type": "string"
  15. },
  16. "answerDate": {
  17. "type": "date",
  18. "format": "strict_date_optional_time||epoch_millis"//這裡出現了複合型別
  19. },
  20. "answer_author": {
  21. "type": "string",
  22. "index": "not_analyzed"
  23. },
  24. "answer_date": {
  25. "type": "string",
  26. "index": "not_analyzed"
  27. },
  28. "author": {
  29. "type": "string",
  30. "index": "not_analyzed"
  31. },
  32. "category": {
  33. "type": "string",
  34. "index": "not_analyzed"
  35. },
  36. "date": {
  37. "type": "string",
  38. "index": "not_analyzed"
  39. },
  40. "description": {
  41. "type": "string",
  42. "index": "not_analyzed"
  43. },
  44. "id": {
  45. "type": "string",
  46. "index": "not_analyzed"
  47. },
  48. "keywords": {
  49. "type": "string",
  50. "index": "not_analyzed"
  51. },
  52. "list": {
  53. "type": "object"
  54. },
  55. "question": {
  56. "type": "string",
  57. "index": "not_analyzed"
  58. },
  59. "readCount": {
  60. "type": "long"
  61. },
  62. "read_count": {
  63. "type": "integer"
  64. },
  65. "title": {
  66. "type": "string"
  67. }
  68. }
  69. }
  70. }
  71. }
  72. }

Head外掛檢視

其實 Mapping  ,你接觸 Elasticsearch  久一點也就那麼回事。我們雖然知道 Elasticsearch  有根據資料識別建立 Mapping  ,但是最好是建立,並且指定分詞與否。這樣高效一點。