0

我对 orCondition 方法有疑问。我想用这个插件创建一个简单的搜索引擎,我只想在标题和描述的数据库中找到一个短语(相同或相似),我真的不知道我在做什么错. 我实现的唯一效果是,当我以与数据库中原始顺序完全相同的顺序在表单中键入标题时,我可以找到标题。例如,如果帖子的标题是“一二三”并且我输入“二”它可以工作,但如果我输入“三二”则没有结果。这是一些代码。

模型:

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。如果您的标题是“一二三”并且您的搜索表达式是%two%它将起作用,因为无论单词二在哪里,它都会匹配标题。但是,如果您使用%three two%它进行查询,则不会匹配任何内容,因为它正在寻找该字符串。

如果你想做到这一点,你必须把这两个词分成一个查询,比如WHERE TITLE LIKE = %two% OR %three%. 或者,如果您想匹配必须同时包含%two% AND %three%.

我建议您阅读有关Mysql 全文搜索或一般如何使用 SQL 搜索数据的信息。对于构建搜索索引,有更好的数据库,如Elastic Search可用。Elastic Search 用于构建搜索索引。您尝试搜索事物的方式在某些时候肯定会变得低效,这取决于“简单”或“小”对您意味着什么。

于 2013-11-24T23:09:01.147 回答