我们如何使用ElasticSearch向我们的类型插入唯一记录,例如3个用户更新了相同的记录,我们应该在3个updated_by
和updated_at
字段的索引中存储3条记录。我正在使用Elasticquent
现在,例如,当我想要更新course
表中的记录之后我做了以下情况:
例如标识为1
的用户更新记录。
$course = new Course();
......
.....
$course->save();
$course->updated_at = '2016-01-06'
$course->updated_by = '1';
$course->addToIndex();
然后标识为2
的用户更新相同的记录
但在索引内部,第一个用户更新操作中创建的文档由第二个用户操作重写。
答案 0 :(得分:0)
我不明白为什么你需要弹性搜索来达到这个目的。您可以轻松维护course_history表:id,course_id,updated_by,updated_at。然后,要查找课程版本的任何历史记录,您只需进行连接即可。如果您需要文档存储以获得一些性能优势,我建议选择一些不同的文件存储,因为elasticsearch对于搜索和聚合更好。它不是为文档存储而创建的。但是,如果这确实是您的要求,那么我建议维护一个历史表,然后使用与elasticsearch的关联来使其可搜索。
答案 1 :(得分:0)
在这种情况下,最好存储多个文档。您要做的事情不能轻易地在单个文档中完成。更简单,更好的IMO解决方案是存储多个文档。因此,每次更新都会让您感到痛苦。 Recorc ID将是您之后可以搜索的字段之一。
[
{
"_index": "logs",
"_type": "log_record",
"record_id": 1,
"updated_by": 100,
"updated_at": "2016-01-01T00:00:00.000Z"
},
{
"_index": "logs",
"_type": "log_record",
"record_id": 1,
"updated_by": 200,
"updated_at": "2016-01-01T01:00:00.000Z"
}
]
现在,您可以轻松搜索所需内容,并在必要时删除特定记录。
你真的不关心这里的decument ID。您可以让ES为您生成它。您只需要在文档中存储正确的记录ID。
编辑:
以下是它在Elasticquent中的样子(请注意我不知道Elasticquent的细节)。
假设您有类似CourseChageLog的类,其中包含以下映射:
class CourseChageLog extends Eloquent
{
use ElasticquentTrait;
public $record_id;
public $updated_by;
public $updated_at;
protected $mappingProperties = array(
'record_id' => array(
'type' => 'integer',
'index' => 'not_analyzed'
),
'updated_by' => array(
'type' => 'integer',
'index' => 'not_analyzed'
),
'updated_at' => array(
'type' => 'date',
'index' => 'not_analyzed'
),
);
}
CourseChageLog::putMapping();
关键是你需要问正确的问题。你不会问如何存储东西。您询问要问Elasticsearch的问题,然后从中创建适当的文档。不要创建文档,然后想知道他们是否可以回答你的问题。