0

orCondition メソッドに問題がありました。このプラグインを使用して単純な検索エンジンを作成したいのですが、タイトルと説明でデータベースにある場合にフレーズ (同じまたは類似) を見つけたいだけですが、何が間違っているのか本当にわかりません。 . 私が達成した唯一の効果は、元のデータベースとまったく同じ順序でフォームに入力したときにタイトルを見つけることができることです. たとえば、投稿のタイトルが「One two three」で「two」と入力すると機能しますが、「three two」と入力すると結果はありません。ここにいくつかのコードがあります。

モデル:

public $actsAs = array('Search.Searchable');

public $filterArgs = array(
'title' => array('type' => 'query', 'method' => 'orConditions'),
'status' => array('type' => 'value'),
'category' => array('type' => 'value'),
'country' => array('type'=>'value'),
'continent' => array('type'=>'value'),
'cycle' => array('type'=>'value'),);

...
        public function orConditions($data = array()) {
        $title = $data['title'];
        $cond = array(
            'OR' => array(
                $this->alias . '.title LIKE' => '%' . $title . '%',
                $this->alias . '.description LIKE' => '%' . $title . '%',
            ));
        return $cond;
        }

意見:

echo $this->Form->create('Ad', array('url' => array_merge(array('action' => 'index'), $this->params['pass'])));
4

1 に答える 1

1

いくつか間違っていることを理解していると思います。検索プラグインは、いかなる種類の検索エンジンとも考えられていません。readme.md にも、プラグインが PRG パターンを実装するだけであると記載されていると思います。基本的に、POST を GET に変換し、GET パラメータを CakePHP の検索条件に変換します。検索条件はその「検索」部分です。

あなたがしていることは実際には「検索エンジン」ではありません。検索エンジンは、あなたがやろうとしていることよりももう少し「インテリジェント」で複雑です。行うことは、いくつかの論理演算子を使用した単純な SQL クエリです。構築しようとしているのは検索インデックスです。

あなたが抱えている問題は、検索プラグインや CakePHP ではなく、クエリを作成する方法の問題です。タイトルが「One two three」で検索式が「two」%two%という単語がどこにあってもタイトルに一致するため、検索式は機能します。しかし、それを使用してクエリを実行する%three two%と、正確にその文字列を探しているため、何にも一致しません。

それを実現したい場合は、2 つの単語を のようなクエリに分割する必要がありますWHERE TITLE LIKE = %two% OR %three%。または、両方を含む必要があるタイトルを一致させたい場合%two% AND %three%

Mysql の全文検索について、または SQL を使用して一般的にデータを検索する方法について読むことをお勧めします。検索インデックスを構築するには、Elastic Searchなどのより優れたデータベースが利用可能です。Elastic Search は、検索インデックスを構築するために作られています。「シンプル」または「小さい」が何を意味するかに応じて、物事を検索しようとする方法は、ある時点で確実に非効率になります。

于 2013-11-24T23:09:01.147 に答える