Elasticsearch性能最佳映射

时间:2016-08-26 23:52:08

标签: performance elasticsearch mapping

这是我第一次使用Elasticsearch,即使有嵌套对象和父子关系,我也可以使用我的测试。但是,我有点担心要考虑保持性能的方法。

所以我需要搜索的是一个支持票系统,并且需要将票据及其回复编入索引。但是,我还需要将其他数据编入索引。所以说一张票有多个不同的元数据附在它上面,就像这张票是什么样的食物(不同的肉类,不同的水果等)。所以说我想找到所有与苹果有关的门票,无论什么样的特定苹果(模糊搜索)。所以我可以在我的映射中建立这种父子关系:

{
    mapping : {
        ticket : {},
        food : {
            _parent : {
                type : 'ticket'
            }
        }
    }
}

当然我可以做一个嵌套对象,或者我可以只有一个像“foodName”和“foodId”这样的字段。

所以我的问题是我应该使用哪种策略?我的数据库有几十万张票,超过一百万条回复,超过五十万用户,所以我需要记住我的映射表现,但我没有足够的经验来决定哪个策略特别知道父/儿童关系不能在路上添加。

更多信息是我也将有不同的搜索索引,我将返回facets所以我真的觉得我需要在设置时考虑到性能。这是使用AWS的Elasticsearch服务。

以下是我创建的一些示例数据。对于支持票证系统,如下所示:

{
    "tid"              : 1234,
    "uid"              : 1111,
    "sid"              : "111-22222",
    "open_date"        : "2012-06-30 21:38:11",
    "close_date"       : null,
    "status"           : "Open",
    "title"            : "Food Help",
    "raw_text"         : "I need some help!",
    "owner"            : 999,
    "reply_count"      : 1,
    "reason_id"        : 4,
    "food_id"          : 345,
    "food_info"        : {
        "id"   : 345,
        "name" : "Fuji Apple"
    },
    "opener_info"      : {
        "uid"   : 1111,
        "name"  : "Bob Smith",
        "email" : "bob@smith.com"
    },
    "owner_info"       : {
        "uid"   : 999,
        "name"  : "Joe Smith",
        "email" : "joe@smith.com"
    },
    "reason_info"      : {
        "id"     : 4,
        "reason" : "Help"
    },
    "replies"          : [
        {
            "rid"        : 2222,
            "tid"        : 1234,
            "uid"        : 999,
            "reply_date" : "2014-07-30 14:07:21",
            "raw_body"   : "What do you need help with?"
        }
    ],
    "subscription"     : {
        "sid"     : "111-22222",
        "company" : "Bob Smith Company"
    }
}

我也有一个论坛,所以我有另一个方面的论坛/主题/帖子。以下是它的示例数据:

{
    "threadid"     : 202,
    "title"        : "test",
    "firstpostid"  : 298,
    "lastpostid"   : 300,
    "lastpost"     : 1471546381,
    "lastposterid" : 200,
    "lastposter"   : "test-user",
    "forumid"      : 101,
    "open"         : 1,
    "replycount"   : 2,
    "postusername" : "test-user",
    "postuserid"   : 200,
    "dateline"     : 1471540483,
    "visible"      : 1,
    "sticky"       : 0,
    "taglist"      : null,
    "keywords"     : "test",
    "posts"        : [
        {
            "postid"      : 298,
            "threadid"    : 202,
            "username"    : "test-user",
            "userid"      : 200,
            "title"       : "test",
            "dateline"    : 1471540483,
            "pagetext"    : "test",
            "visible"     : 1,
            "vote_rating" : 0
        },
        {
            "postid"      : 299,
            "threadid"    : 202,
            "username"    : "test-user",
            "userid"      : 200,
            "title"       : "",
            "dateline"    : 1471541280,
            "pagetext"    : "test",
            "visible"     : 1,
            "vote_rating" : 0
        },
        {
            "postid"      : 300,
            "threadid"    : 202,
            "username"    : "test-user",
            "userid"      : 200,
            "title"       : "",
            "dateline"    : 1471546381,
            "pagetext"    : "Whoa, that was weird!",
            "visible"     : 1,
            "vote_rating" : 0
        }
    ]
}

对象和数组来自联接和其他查询。每个数组都可以有任意数字,可以有数百个可能数千个条目,每个回复或帖子的文本都可以很长(MySQL中的LONGTEXT)。

另外,有人问我是什么样的搜索,它是高级过滤还是快速搜索。当然会使用快速搜索(以及建议),但会有很多次会有日期范围,数字范围,当然还有全文搜索。我需要搜索孩子(票证的回复),但要检索父文件。

0 个答案:

没有答案