如何使用ElasticSearch将唯一记录插入到我们的类型中,例如,3个用户更新了相同的记录,我们应该在索引中存储3个记录,其中包含3个updated_by
和updated_at
字段。我正在使用Elasticquent
,例如,现在当我想更新course
表中的记录时,我会执行以下操作:
例如id为CCD_ 5的用户更新记录。
$course = new Course();
......
.....
$course->save();
$course->updated_at = '2016-01-06'
$course->updated_by = '1';
$course->addToIndex();
然后id为2
的用户更新相同的记录
但是在索引内部,在第一用户更新动作中创建的文档被第二用户动作重写。
我不明白你为什么需要弹性搜索。您可以很容易地维护一个course_history表:id、course_id、updated_by、updated_at。然后,要查找任何课程历史版本,您只需加入即可。如果您需要文档存储来获得一些性能优势,我建议您选择不同的文档存储,因为弹性搜索更适合搜索和聚合。它不是为文档存储而制作的。然而,如果这确实是您的要求,那么我建议维护一个历史表,然后使用与弹性搜索的关联使其可搜索。
在这种情况下,最好存储多个文档。你想做的事情不可能在一份文件中轻易完成。存储多个文档是一个更简单、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"
}
]
现在,您可以轻松地搜索所需内容,并在必要时删除特定记录。
你真的不在乎这里的纪念碑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的问题,然后你创建了一个合适的文档。不要创建文档,然后怀疑他们是否能回答你的问题。