首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何实现可搜索地址数据库(用于表单)?

如何实现可搜索地址数据库(用于表单)?
EN

Drupal用户
提问于 2017-04-15 13:24:29
回答 2查看 1.5K关注 0票数 1

我不确定我是否应该问这种类型的问题在这个网站,但我已经尝试问在Drupal论坛这里到目前为止没有答复。

我试图找出在现有Drupal 7站点中实现解决方案的最佳方法,该解决方案必须满足以下要求:

  1. 从csv/xls文件将地址导入数据库的选项,使用:
    • 字段: id、城市、地点、街道、街道号码、邮政编码
    • 大约100000条记录/地址

  2. 一种包括地址部分/字段(S)的表单,具有搜索功能以搜索地址
    • 其中,用户将填充一些地址字段(例如:城市、街道;或者仅仅是街道)
      • 它将显示一个具有匹配地址的列表
      • 它将按相关性排序。
        • 例如:如果它同时存在于“街道”和“城市”字段中,则比仅在“街道”字段中更相关(理想情况下,复制谷歌地图搜索会更好)。

  3. 将提交的表单值导出到csv/xls的选项(如果这也是主题,只需忽略此步骤(3)) (站点位于Drupal 7上,mysql 5.5和php 5.5)

以前,客户端试图实现导入需求,但它是慢慢来(几天来加载csv文件),使用提要插件和分类法结构来保存部分地址字段。

我是Drupal后端开发的新手,在Drupal中主要是前端、主题化(带有html、js、css/sass和一些PHP的模板),在后端做一些简单的表单,但我有一些MySQL和PHP背景。

所以我想在构建一个模块时:

  • 创建以下数据库表:
    • 地址(字段: id、城市、地点、.)
    • addresses_searchable,其中有地址字符串字段,方法是通过转换字符串:
      • 降至小写
      • 将非拉丁文改为US-ASCII (例如:"á","à“改为"a")
      • 以帮助加快搜索
        • 在Drupal数据库搜索api中使用"like“时

代码语言:javascript
复制
- form\_submitions (fields: id (of the submitted form), name, ... (other form fields) , adress\_id)
  • 创建一个表单。使用ajax按一个按钮加载搜索地址列表
  • 为导入和导出页面设置后端页面(使用权限)
    • 进口:
      • 包括要加载地址文件(csv/xls)的按钮,以及运行最新加载文件的其他按钮,并显示进度条和可能出现错误的日志。

代码语言:javascript
复制
- export:  
    - using a button to download all form submissions up to now, or up to / after a selected date

从我迄今为止的研究来看:

  • 用于读取文件:
    • xls:可以使用Drupal模块phpexcel
    • csv:通过使用PHP本机函数

  • 搜索地址:

代码语言:javascript
复制
- there is a Search API module that maybe would be the way to go  
    - I haven't used it before, but maybe it would work if i create a entity for the address with the matching fields. Would be faster that a dedicated table?
    - in case it's better this way maybe, i could still use the address table as a temporary table, just to speed up the importing of the csv/xls addresses file

我不确定这是否是解决问题的最佳方法,以及在Drupal 7中实现这个问题的最佳实践是什么。

  • 使用类似Laravel (v5.4)的东西(我也必须学习它),并通过iframe加载Drupal 7中的表单,该iframe将显示来自其他服务器和框架的表单。

我搜索过谷歌,但我还是有点困惑。有人能给我指明正确的方向吗?

EN

回答 2

Drupal用户

回答已采纳

发布于 2017-04-15 16:03:05

我的第一种方法是使用BatchAPI构建一个基本导入程序,并创建一个自定义实体来保存地址数据(而不是内容类型),并结合address进行适当的存储。

然后,我将使用Search和Search对这些实体进行索引和存储,然后可以使用表单API构建自定义表单,或者使用视图来公开和搜索索引--这将比Drupal db查询快得多。只要有可能,就不要让MySQL做工作,因为这将使您的站点陷入困境。

这使事情保持接近"Drupal本机“,同时解决了您在Solr中提出的许多性能问题。

您也可以使用Form构建带有#ajax回调的表单,以查询和返回Search查询中的数据。

除非您没有使用Drupal将它们存储为实体,否则进口永远不会是闪电般的快。当您不将它们存储为实体时,就会失去很多灵活性,比如插入视图或搜索API,而不需要做大量的工作。您也不能用字段API添加字段,此时它只是平面数据,所以对简单添加分类法字段或使用Address说再见。

随着Solr不断地为新的和更新的实体建立索引,只要它是合理的,让导入快速就不是一个真正的优先事项(IMO)。如果您有数百万个地址,那么Drupal将只能如此快地解析行,这在很大程度上是由于事件系统(保存一个实体、字段附加、钩子火、修改等)对entity_save的每次调用。当您想要操作或集成该数据时,您在这里以速度支付的代价将在稍后得到回报。

我链接到的要点是我对数据模块和CSV文件所做的一个实验。这将加载整个CSV文件,并使用load将其内容转储到MySQL中。这将非常快地将数据植入数据库,但是,正如我所说,您将有更多的工作试图让Drupal识别、与之通信和扩展该数据。

另一种完全非Drupal的方法是将数据导入PostgreSQL (9.4+)数据库或类似于Firebase的非SQL数据库,并对其执行搜索。再说一遍,这与执行Search + Search几乎是一样的,但您必须构建包装器来创建这些服务器并将查询发送到这些服务器。因此,仅仅为了处理数据,将所有这些工作卸载到一个单独的系统中仍然是有效的。这真的取决于你想做多少编程。

首先要说明的是,这里有几个选项,这取决于如果它不以某种方式使用Drupal,您可以忍受多少。就个人而言,我不想放弃Drupal在理解您的数据模型方面提供的灵活性,因此,我将创建一个自定义实体并从那里开始。它会慢一些,但最终会为模块生态系统中的您提供更多的集成点。

票数 2
EN

Drupal用户

发布于 2017-04-15 15:43:59

一种可能的方法是将数据导入MySQL数据库(一个或多个表,根据您自己的想象)。然后使用福雷纳模块(公开:我是一个维护人员)构建与这些数据相关的任何报告(和/或图表)。

要真正做到这一点,您也可以将它与DataTables结合起来,例如,实现它附带的典型搜索工具。

除此之外,您还可以通过Forena将数据导出到任何典型格式,如CSV、XLS等。

PS:另一个变化是甚至不导入您的数据,而只是让Forena从Drupal中访问您现有的数据。只有Forena支持您的数据库格式(如PDO兼容、Oracle、MySQL、SQLite、MySQL等),才能工作。

票数 0
EN
页面原文内容由Drupal提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://drupal.stackexchange.com/questions/234147

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档