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