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

时间:2016-01-06 06:52:38

标签: php elasticsearch laravel-5

我们如何使用ElasticSearch向我们的类型插入唯一记录,例如3个用户更新了相同的记录,我们应该在3个updated_byupdated_at字段的索引中存储3条记录。我正在使用Elasticquent现在,例如,当我想要更新course表中的记录之后我做了以下情况:

例如标识为1的用户更新记录。

$course = new Course();
......
.....
$course->save();

$course->updated_at = '2016-01-06'
$course->updated_by = '1';
$course->addToIndex();

然后标识为2的用户更新相同的记录

但在索引内部,第一个用户更新操作中创建的文档由第二个用户操作重写。

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的问题,然后从中创建适当的文档。不要创建文档,然后想知道他们是否可以回答你的问题。