elasticsearch 数据建模(一)

文章转自:https://www.jianshu.com/p/098236cf3a44
https://blog.csdn.net/napoay/article/details/62233031

例1:电商推广数据结构

{
  "id": 536600477,
  "name": "黑色外穿打底裤女春秋薄款铅笔裤2019新款高腰九分显瘦紧身小脚裤",
  "image": "http://img.alicdn.com/bao/uploaded/i4/1687728515/O1CN015vKRk22Clv2z9jVKM_!!0-item_pic.jpg",
  "item_url":  "http://item.taobao.com/item.htm?id=536600477798",
  "shop_name": "XXX旗舰店",
  "price": 35.00,
  "sales": 12866,
  "contact_info": "XXX旗舰店",
  "short_url": "https://s.click.taobao.com/6dhjX0w",
  "sales_url":  "https://s.click.taobao.com/t?e=m%3D2%26s%3DhqNnFErxaS0cQipKwQzePOeEDrYVVa64K7Vc7tFgwiG3bLqV5UHdqSJ215tW5ra7%2Fl0%2B1yuzCtL9CVjm9%2FaTIMEcIrQjme5phH%2FwEhdaGdpwfW9VvJkbiUOLibAxXu8J4DrzI0Q%2Bh5mWydDa%2BK5%2FZ44CXhN9RDLu87eUjW4Ylwlp3E7b2H5imSCyCj9paIOIxiXvDf8DaRs%3D",
  "sales_pass":  "¥q6vvYNlY15Y¥",
  "coupon_total_num": 50000,
  "coupon_remaining_num":  49981,
  "coupon_quota": "满35减10",
  "coupon_start_date": "2019-09-20",
  "coupon_end_date": "2019-09-25",
  "coupon_url": "https://uland.taobao.com/coupon/edetail?e=EpEKjA4ejsRt3vqbdXnGlgxMgopp14njlHycenxkSuDwJfMHI%2FfVmw2KFrzHTGtgHv69%2F64THFCtOwU1ltpiC5ZrJ2LltVbgH31ZeQAUzbQ%3D&af=1&pid=mm_226490165_153450382_44990650090",
  "coupon_pass": "¥b0NmYNlbC8t¥",
  "coupon_short_url": "https://s.click.taobao.com/XRkjX0w"
}

"id"为整形,设置为long类型
"name" 名称是字符串类型,需要作为查询条件,并且需要分词。类型设置为"text",指定中文分词器为"ik_max_word",搜索的时候指定"ik_smart"分词器。
注意:1、"type": "text"会分词, "type": "keyword"不会分词
2、"ik_max_word" 为最细粒度分词,"ik_smart"为粗粒度分词,
索引时,为了提高索引的范围,通常会采用"ik_max_word" ,会以最细粒度分词索引,
搜索是,为了提高搜索的准确性,会采用"ik_smart"分词器为粗粒度分词;

ik_max_word: 会将文本做最细粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,中华人民,中华,华人,人民共和国,人民,人,民,共和国,共和,和,国国,国歌”,会穷尽各种可能的组合;
ik_smart: 会做最粗粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,国歌”。

字段mapping设置如下:

   "name":  {
        "type":  "text",
        "analyzer":  "ik_max_word",
        "search_analyzer": "ik_smart"
      },

"image" 字段是一个链接,不需要搜索,只需要显示就可以,索引不必添加索引,节省内存和空间,也不需要做集合分析,可以直接设置"enabled":false。其它类似需要也可以和这个字段一样处理。
"shop_name"是店铺名称,可以和"name"一样使用分词

"coupon_pass"是优惠券推广口令,不需要分词,但是需要放进索引中,设置"keyword"。
对应的数据模型

PUT item_index
{
 "mappings":  {
   "dynamic": false,
   "properties":  {
     "id":  {
       "type":  "long"
     },
     "name":  {
       "type":  "text",
       "analyzer":  "ik_max_word",
       "search_analyzer": "ik_smart"
     },
     "image":  {
       "enabled": false
     },
     "item_url":  {
       "enabled": false
     },
     "shop_name":  {
       "type":  "text",
       "analyzer":  "ik_max_word",
       "search_analyzer": "ik_smart",
       "fields": {
           "keyword": {
               "type":  "keyword"
            }
        }
     },
     "price":  {
       "type":  "double"
     },
     "sales":  {
       "type":  "integer"
     },
     "contact_info":  {
       "type":  "keyword"
     },
     "short_url":  {
       "enabled": false
     },
     "sales_url":  {
        "enabled": false
     },
     "sales_pass":  {
       "type":  "keyword"
     },
     "coupon_total_num":  {
       "type":  "integer"
     },
     "coupon_remaining_num":  {
       "type":  "integer"
     },
     "coupon_quota":  {
       "type":  "keyword"
     },
     "coupon_start_date":  {
       "type":  "date",
       "format":  "yyyy-MM-dd"
     },
     "coupon_end_date":  {
       "type":  "date",
       "format":  "yyyy-MM-dd"
     },
     "coupon_url":  {
       "enabled": false
     },
     "coupon_pass":  {
       "type":  "keyword"
     },
     "coupon_short_url":  {
       "enabled": false
     },
   }
 }
}

例2:服务器日志数据结构

222.67.85.228 - - [14/Nov/2018:14:30:34 +0800] "GET /search?keyword=&hasCoupon=0&pageNum=1&pageSize=100 HTTP/1.1" 200 12268 "-" "Apache-HttpClient/4.5.5 (Java/1.8.0_131)" "-"

通过日志格式化,将nginx日志转换成以下数据结构:

{
    "ip": "222.67.85.228",
    "username": "-",
    "time": "2018-11-14 14:30:34",
    "request_action": "GET",
    "request_url": "/search?keyword=&hasCoupon=0&pageNum=1&pageSize=100",
    "http_version": "1.1",
    "response_status": 200,
    "byte": 12268,
    "referrer": "-",
    "agent": "Apache-HttpClient/4.5.5 (Java/1.8.0_131)",
    "http_forward": "-"
}

一般查看日志按照时间和响应状态这两个维度作为查询条件。比如说,需要查询从2019年01月01日至今为止的响应状态为500的请求。整个日志字段基本不需要做分词处理,基本都是做一个展示,字符串数据基本就是"keyword"类型,日期类型注意格式化。

PUT nginx_log_index
{
    "mappings": {
        "dynamic": false,
        "properties":  {
            "ip":  {
                "type": "keyword"
            },
            "username":  {
                "type": "keyword"
            },
            "time":  {
                "type": "date",
                "format": "yyyy-MM-dd HH:mm:ss"
            },
            "request_action":  {
                "type": "keyword"
            },
            "request_url":  {
                "enabled": false
            },
            "http_version":  {
                "type": "keyword"
            },
            "response_status":  {
                "type": "integer"
            },
            "bytes":  {
                "type": "long"
            },
            "referrer":  {
                "type": "keyword"
            },
            "agent":  {
                "type": "keyword"
            },
            "http_forward":  {
                "type": "keyword"
            }
        }
    }
}

例3:博客数据结构

image.png
{
    "id": "89546eff3cd0",
    "url": "https://www.jianshu.com/p/89546eff3cd0",
    "title": "简单剖析代理模式实现原理",
    "author": "梦想实现家_Z",
    "content": "代理模式在java中随处可见,其他编程语言也一样,它的作用就是用来解耦的。代理模式又分为静态代理和动态代理。......省略剩下的内容",
    "time": "2019.04.10 21:08:21",
    "word_num": 1056,
    "read_num": 161,
    "like_num": 1,
    "reward_num": 0
}

因为博客内容特别大,避免每次查询都带上庞大的博客内容,建议将字段分开存储,查询的时候按需要展示。所有建议将"_source"字段设置为"enabled":false,但是要整的每个字段单独设置"store":true

PUT blog_index
{
    "mappings": {
        "dynamic": false,
        "_source": {
            "enabled": false
        }, 
        "properties":  {
            "id": {
                "type":  "keyword",
                "store":  true,
            },
            "url": {
                "type":  "keyword",
                "store":  true,
                "ignore_above":  100,
                "doc_values":  false,
                "norms":  false,
            },
            "title": {
                "type":  "text",
                "store":  true,
                "analyzer":  "ik_max_word",
                "search_analyzer": "ik_smart",
                "fields": {
                    "keyword": {
                        "type":  "keyword"
                    }
                }
            },
            "author": {
                "type":  "keyword",
                "store":  true,
            },
            "content": {
                "type":  "text",
                "analyzer":  "ik_max_word",
                "search_analyzer": "ik_smart",
                "store":  true
            },
            "time": {
                "type":  "text",
                "format":  "yyyy.MM.dd HH:mm:ss",
                "store":  true
            },
            "word_num": {
                "type":  "integer",
                "store":  true
            },
            "read_num": {
                "type":  "integer",
                "store":  true
            },
            "like_num": {
                "type":  "integer",
                "store":  true
            },
            "reward_num": {
                "type":  "integer",
                "store":  true
            }
        }
    }
}

补充一下,"_source" 是在默认配置是“true”,在某个字段特别大的情况下,不放入索引中,把大字段的内容存在Elasticsearch中只会增大索引,这一点文档数量越大结果越明显,如果一条文档节省几KB,放大到亿万级的量结果也是非常可观的。这里的博客内容就是这样的例子
"_source"的使用方法参考
参考:https://blog.csdn.net/napoay/article/details/62233031

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容