【问题标题】:Should I store strings directly or their numeric tokens in elasticsearch我应该直接在elasticsearch中存储字符串还是它们的数字标记
【发布时间】:2018-02-04 03:31:47
【问题描述】:

我无法决定将事件信息保存到 elasticsearch 的方式。信息存储在 mysql 中,因为我想让它们可过滤,所以我决定使用 elasticsearch 来索引事件。每个字段都有有限数量的选项,但允许有多个选项。我应该像这样直接存储信息吗:

{
   "id":"1",
   "name":"Event A",
   "type":"Training,Workshop,Meeting",
   "industrialSector":"Energy,Transport",
   "country":"China"
   // + 80 fields alike
}

或者在保存到elasticsearch之前使用一些后端工作将字符串值转换为数字标记:

{
   "id":"1",
   "name":"Event A",
   "type":"1 3 5",
   "industrialSector":"2 3",
   "country":"7"
   // + 80 fields alike
}

在保存之前或获取之后会有一个地图对象来引用字段选项:

let options = 
{
    type:{
        Training:1,
        Fair:2
        Workshop:3,
        Brokerage:4
        Meeting:5
    },
    industrialSector:{
       Tech:1
       Energy:2
       Transport:3
    }
}

第一个需要较少的工作,但它的执行速度是否比第二个慢并且需要更多的磁盘空间?

【问题讨论】:

    标签: elasticsearch lucene elasticsearch-5


    【解决方案1】:

    我认为您的第二种解决方案没有任何好处。我只是将选项存储为一个数组:

    {
       "id":"1",
       "name":"Event A",
       "type":["Training","Workshop","Meeting"]
       "industrialSector":["Energy","Transport"]
       "country":"China"
       // + 80 fields alike
    }
    

    【讨论】:

    • 谢谢。我一直在这两种解决方案之间切换,无法决定哪一种。我正在认真考虑你的建议。但是,顺序在某些领域也很重要,所以我会选择存储字符串而不是数组。与我的第二种解决方案相比,额外的磁盘空间是直接存储字符串的唯一缺点吗?
    • @RedGiant 是的,源文档(您发送到 elasticsearch 的文档)将存储在磁盘上,您可以禁用此功能或启用压缩。所以我认为 99% 的用例真的没问题。如果顺序很重要,我的数组应该不起作用,我认为文本字段可能是解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-24
    • 1970-01-01
    • 2019-06-11
    • 1970-01-01
    • 1970-01-01
    • 2011-11-04
    • 1970-01-01
    相关资源
    最近更新 更多