web-dev-qa-db-ja.com

検索可能な住所データベース(フォーム用)を実装する方法は?

このサイトでこの種の質問をする必要があるかどうかはわかりませんが、Drupalフォーラム here で質問したところ、今のところ返信がありません。

次の要件を満たす必要がある既存のDrupal 7サイトにソリューションを実装する最良の方法を見つけようとしています。

  1. csv/xlsファイルからデータベースにアドレスをインポートするオプション:
    • フィールド:id、city、locality、street、street-number、postal code
    • 約10万件のレコード/住所
  2. 住所を検索する検索機能を備えた住所セクション/フィールドを含むフォーム
    • ユーザーが住所フィールドの一部を入力する場所(例:市、通り、または通り)
      • 一致したアドレスのリストが表示されます
      • それは関連性でソートされます
        • たとえば、「street」フィールドだけでなく、「street」フィールドと「city」フィールドの両方にある場合は、より関連性があります(理想的には、Googleマップ検索を複製するといいでしょう)。
  3. 送信されたフォームの値をcsv/xlsにエクスポートするオプション(これが話題になりすぎる場合は、この手順(3)を無視してください)(サイトはDrupal 7、mysql 5.5、phpにあります5.5)

以前は、クライアントはインポート要件を実装しようとしましたが、フィードプラグインと分類構造を使用して住所フィールドの一部を保存すると、遅くなりました(csvファイルをロードするだけで数日)。

私はDrupalでDrupalバックエンドの開発、主にフロントエンド、テーマ(html、js、css/sass、およびわずかなphpを含むテンプレート)に比較的慣れており、いくつかの簡単なことをしていますバックエンドのフォームですが、MySQLとPHPのバックグラウンドがあります。

だから私はモジュールを構築することを考えていました:

  • 次のデータベーステーブルを作成します。
    • アドレス(フィールド:id、city、locality、...)
    • 文字列を変換することにより、アドレス文字列フィールドを持つアドレス_検索可能:
      • 小文字に
      • ラテン語以外のテキストをUS-ASCIIに置き換える(例: "á"、 "à"から "a")
      • 検索を高速化するために
        • Drupalデータベース検索APIで「like」を使用する場合
    • form_submitions(フィールド:id(送信されたフォームの))、name、...(他のフォームフィールド)、adress_id)
  • フォームを作成します。 ajaxを使用してボタンを押して検索アドレスリストを読み込む
  • インポートページとエクスポートページのバックエンドページを(権限を使用して)セットアップする
    • インポート:
      • アドレスファイル(csv/xls)をロードするためのボタンと、ロードされた最新のファイルを実行するためのボタンを含み、進行状況バーとエラーの可能性があるログを表示
    • 書き出す:
      • ボタンを使用して、現在まで、または選択した日付まで/後にすべてのフォーム送信をダウンロードする

私がこれまでに調査したことから:

  • ファイルの読み取り用:
    • xls:Drupalモジュールphpexcelを使用できます
    • csv:PHPネイティブ関数を使用
  • アドレスを検索するには:
    • Drupal api、をチェックする
    • たぶん行くだろう検索APIモジュールがあります
      • 以前は使用していませんが、一致するフィールドを使用して住所のエンティティを作成すると機能する可能性があります。専用のテーブルよりも速くなりますか?
      • この方法の方が良い場合は、csv/xlsアドレスファイルのインポートを高速化するために、アドレステーブルを一時テーブルとして使用できます。

これが問題への最良のアプローチであるかどうか、およびDrupal 7でこれを実装するためのベストプラクティスは何であるかはわかりません。

  • Laravel(v5.4)(これも私が学習する必要がある)のようなものを使用し、他のサーバーからのフォームを表示するiframeを介してDrupal 7にフォームをロードしますとフレームワーク。

Googleを検索しましたが、まだ混乱しています。誰かが私を正しい方向に向けることができますか?

1
Seeker

私の最初のアプローチは、BatchAPIを使用して基本的なインポーターを作成し、アドレスデータ(コンテンツタイプではない)を保持するカスタムエンティティを作成し、アドレスフィールドと組み合わせて適切に保存することです。

次に、Search APIとSearch API Solrを使用してこれらのエンティティにインデックスを付けて保存します。その後、Form APIを使用してカスタムフォームを作成するか、ビューを使用してインデックスを公開および検索できます。これはDrupalよりもはるかに高速です。 dbクエリ。これはあなたのサイトを悩ませるものであるため、可能な限り、MySQLが作業を行わないようにしてください。

これにより、Solrで発生したパフォーマンスの問題の多くを解決しながら、「Drupalネイティブ」に近い状態を維持できます。

Form APIを使用して、#ajaxコールバックでフォームを作成し、Search APIクエリからデータをクエリして返すこともできます。

Drupal AP​​Iを使用してエンティティ として格納しない限り、インポートは高速ではありません。それらをエンティティとして保存しないと、かなりの作業をせずにビューや検索APIにプラグインするなど、柔軟性が大幅に失われます。フィールドAPIを使用してフィールドを追加することもできませんでした。この時点では、データはフラットなデータであるため、分類フィールドを簡単に追加したり、住所フィールドを使用したりすることはできません。

Solrは常に新しいエンティティと更新されたエンティティのインデックスを作成するので、合理的である限り、インポートを高速化することは実際には優先度(IMO)ではありません。数百万のアドレスがある場合、Drupalは行を非常に高速に解析できるだけであり、これの多くはイベントシステム(エンティティの保存、フィールドのアタッチ、フックの発火、発火の変更など)によるものです。 )entity_saveを呼び出すたびに。ここで高速に支払う価格は、後でそのデータを操作したり、コントリビュートスペースと統合したりするときに払い戻されます。

リンクした要点は、DataモジュールとCSVファイルを使用して行った実験です。これにより、CSVファイル全体がロードされ、load infileを使用してその内容がMySQLにダンプされます。これにより、データがデータベースにすぐに埋め込まれますが、先ほど述べたように、Drupalがそのデータを認識、通信、および拡張できるようにするためには、さらに多くの作業が必要になります。

完全にDrupal以外の別のアプローチは、PostgreSQL(9.4+)データベースまたはSQLに相当しないものにデータをインポートすることです。おそらく Firebase 、それに対して検索を実行します。繰り返しますが、これはSearch API + Search API Solrを実行する場合とほぼ同じですが、クエリを作成してサーバーに送信するためにラッパーを作成する必要があります。したがって、データを整理するためだけに、この作業のすべてを別のシステムでオフロードすることは依然として有効です。それは本当にあなたがどれくらいプログラミングをしたいかによって異なります。

明確にするために、ここにはいくつかのオプションがあります。それは、何らかの方法でDrupalを使用しない場合に、どれだけお腹を満たせるかに依存します。個人的には、データモデルの理解に関してDrupal AP​​Iが提供する柔軟性を放棄したくないので、カスタムエンティティを作成してそこから始めます。遅くなりますが、最終的にはモジュールエコシステムでの統合のポイントが増えます。

2
Kevin

可能なアプローチは、MySQLデータベースにデータをインポートすることです(1つ以上のテーブル、独自の想像まで)。そして Forena モジュール(開示:私は共同メンテナです)を使用して、それらのデータに関連するレポート(および/またはグラフ)を作成します。

本当にファンシーにするために、これを DataTables と組み合わせることもできます。それを実装するのは、それに付属する典型的な検索機能です。

さらに、Forenaを介して、CSV、XLSなどの一般的な形式のいずれかにデータをエクスポートできます。

PS:別のバリエーションは、データをインポートせずに、Drupal内から既存のデータにForenaにアクセスさせることです。これが機能するために必要なことは、データベースフォーマットがForenaによってサポートされていることです(PDO準拠、Oracle、MS SQL、SQLite、MySQLなど)。

0
Pierre.Vriens