商店

时间:2017-04-04 10:23:48

标签: php elasticsearch drupal drupal-8

没有太多代码示例只是一个问题和想法。

我希望能够使用弹性DSL查询将节点数据(从内容创建)保存到内部数据存储区。

我听说/看过有关Drupal支持MongoDB的幻灯片,这让我认为这是可行的。即使我必须覆盖NodeForm / save处理程序,有没有办法为此目的操纵节点实体?

2 个答案:

答案 0 :(得分:1)

我的想法是让他们保存两次。首先,通过使用那些"弹性DSL查询来获得正常节点和第二个节点。 (不确定它们是什么)。

无论如何,您可以使用hook_node_presave()

http://www.drupalcontrib.org/api/drupal/drupal%21core%21modules%21node%21node.api.php/function/hook_node_presave/8

每次正常节点保存都会被调用,并且你可以在那里放置你的代码"弹性DSL"扑救。从该钩子,您可以访问将被保存的数据,但如果您需要,也可以更改它们。

答案 1 :(得分:1)

这是完全可行的。我们在所有Drupal项目中使用Elasticsarch,主要用于全文搜索。每个节点都保存两次:

  • 在Drupal的数据库中有一次,这是每个代码行中使用的节点
  • 一次在Elasticsearch索引中,这个从未被“使用过”;我们使用全文搜索来查找nids,然后我们在Drupal DB中检索完整对象

您可以使用elasticsearch_connector模块来获得一个易于使用的管理器:

$cluster = Cluster::load('ES-CLUSTER');
$clientManager = \Drupal::service('elasticsearch_connector.client_manager');
$client = $clientManager->getClientForCluster($this->cluster);

然后使用此客户端管理节点的索引:

function hook_node_insert($node) {
  $client->insert($node);
}
function hook_node_update($node) {
  $client->update($node);
}
function hook_node_insert($node) {
  $client->delete($node);
}

这项工作的最大部分是创建您的映射(如果您希望它可以通过模块进行管理),但是elasticsearch_connector将再次为您提供工具:

$client->indices()->putMapping($params); 
$client->indices()->putSettings($params); 
$client->search($params);