如何使用ElasticSearch跟踪记录上的每个操作


how to track every actions on records with ElasticSearch?

如何使用ElasticSearch将唯一记录插入到我们的类型中,例如,3个用户更新了相同的记录,我们应该在索引中存储3个记录,其中包含3个updated_byupdated_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的问题,然后你创建了一个合适的文档。不要创建文档,然后怀疑他们是否能回答你的问题。