2

私はCakePHP2.0を使用して検索エンジンに取り組んでおり、希望する結果を得る最も効率的な方法を見つけるのに苦労しています。

人々にクエリを実行しているとすると、5歳20歳、10歳30歳、5歳40歳の20の結果のセットが得られます。さらに、これらの人々のうち15人は茶色、3人は青、2人は緑です。これらの特定のカウントを取得するための最も効率的な方法を見つけたいと思います。次に、これらの結果をページに表示して、ユーザーがこれらのパラメーターを使用して結果の内容を確認できるようにします。次に、それらの1つをクリックして、その検索パラメーターを現在のクエリに追加できるようになります。

これは、データベースやキャッシュに保存できるものではありません。検索ごとに異なる可能性があり、異なる結果を返す可能性があるためです。

私がやろうとしていることを説明していない場合(これはおそらくそうかもしれません)、これを行ういくつかのWebサイトがあります。Cars.comは、車を検索するときにこの方法を使用します。一般的な検索を検索してから、側面のリンクを使用して結果を絞り込むことができます。これらのリンクには、特定のパラメーターに含まれる現在の結果セットのカウントが含まれます。

アイデアは、完全な結果セットを取得し、それを解析してカウントを生成することでしたが、これは機能しますが、私の特定のプロジェクトでは、何千ものレコードを処理しており、これによりページに追加の読み込み時間が追加される可能性があります/またはサーバーに負担をかけます。

視覚的な例を次に示します。 私が達成しようとしている質問/結果の視覚的な例

4

1 に答える 1

2

Cars.comは、カウントされる機能ごとに関連するタグを使用している可能性があります。関連付けられたタグを使用すると、テーブルレコードには多くの機能タグがあり、多くの機能タグに属します。

車の価格ごとにタグを作成する必要がないようにします。価格帯タグを作成します。

すべての車のレコードには、その車のすべての機能を保持するタグレコードが関連付けられています。次に、その機能を備えた車の数のカウントをタグレコードにキャッシュできます。

SQLテーブルの構造は次のようになります。

 CREATE TABLE `cars` (
   `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
   `make` varchar(45) DEFAULT NULL,
   `model` varchar(45) DEFAULT NULL,
   PRIMARY KEY (`id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

 CREATE TABLE `features` (
   `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
   `name` varchar(45) DEFAULT NULL,
   `count` int(11) NOT NULL DEFAULT '0',
   PRIMARY KEY (`id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

 CREATE TABLE `cars_features` (
   `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
   `car_id` int(11) NOT NULL,
   `feature_id` int(11) NOT NULL,
   PRIMARY KEY (`id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

車のレコードごとに、複数の機能レコードが存在する可能性があります。これらは、cars_featuresテーブルを介して各Carに関連付けられています。誰かがCarXXXXを検索して見つけたら、その車の機能を検索し、その機能を備えた車の数のキャッシュカウントを表示することもできます。

編集:

検索で発見された車のみに限定されるようにカウントを絞り込みます。最初にすべての車IDのリストを取得してから、cars_featuresテーブルと機能の間のJOINを使用してCOUNTを実行する必要があります。

ここにいくつかのサンプルデータがあります。

  INSERT INTO `cars` (`make`, `model`) VALUES ('Ford', 'Explorer');
  INSERT INTO `cars` (`make`, `model`) VALUES ('Hond', 'Civic');
  INSERT INTO `cars` (`make`, `model`) VALUES ('Hond', 'Civic');

  INSERT INTO `features` (`name`, `count`) VALUES ('Red', 2);
  INSERT INTO `features` (`name`, `count`) VALUES ('Green', 1);

  INSERT INTO `cars_features` (`car_id`, `feature_id`) VALUES (1, 1);
  INSERT INTO `cars_features` (`car_id`, `feature_id`) VALUES (2, 1);
  INSERT INTO `cars_features` (`car_id`, `feature_id`) VALUES (3, 2);

それを検索すると、2つのアイテムが返され、車のIDは(1,2)になります。次のSQLクエリを使用して機能数を見つけることができます。

 SELECT `features`.`id`,COUNT(`features`.`id`)
     FROM `cars_features` 
     JOIN `features` ON (`cars_features`.`feature_id`=`features`.`id`)
     WHERE `cars_features`.`car_id` IN (1,2)
     GROUP BY `features`.`id`

これにより、見つかった車のレコードのみに限定された各機能のカウントが報告されます。

上記をCakePHPモデル形式で書いてみます。

 $this->CarFeature->find('all',array(
    'conditions'=>array('CarFeature.car_id'=>$ids),
    'fields'=>array('Feature.id','COUNT(Feature.id)'),
    'group'=>array('Feature.id'),
    'contain'=>'Feature'
 ));
于 2013-01-14T22:17:41.783 に答える