使用zend实现搜索

时间:2012-10-26 17:16:51

标签: php zend-framework zend-db zend-studio zend-search-lucene

我有使用完全在zend上开发的CMS管理的网站。现在我也要实现搜索功能。我做了一些与zend搜索相关的事情。我收到的一些建议是实施蜘蛛。该网站将有足够的链接(并将继续添加)。我完全糊涂了,我不知道从哪里开始。 zend_search_lucene能解决这个问题吗?

3 个答案:

答案 0 :(得分:2)

你可能不会为此找到完全交钥匙的东西。如果您的内容全部公开,只使用抓取工具就可以了,最简单的方法就是使用Google Site Search。

http://www.google.com/enterprise/search/products_gss.html

如果您需要从搜索中获得不同的功能,那么您可能会遇到一些代码。 Alvar发布的Zend Lucene链接很好。关于Zend_Lucene的一个丑陋的事情,如果我没有弄错的话,它依赖于基于文本的lucene索引而没有任何Java。管理速度更慢,更麻烦。

更强大的基于Lucene的方法是Solr。它是基于Java的,并使用API​​运行它自己的服务。它可以很好地扩展,现在有一个PHP Pecl可以帮助你与它进行通信。

请参阅http://php.net/manual/en/book.solr.php

另一个选择是Sphinx。此搜索引擎直接绑定到您的数据库,因此索引可能更直观一些。

http://sphinxsearch.com/

祝你好运!

答案 1 :(得分:1)

Lucene很奇怪,我从来没有让它正常工作并开发了我自己的搜索逻辑,但也许这有帮助:

http://devzone.zend.com/397/roll-your-own-search-engine-with-zend_search_lucene/

答案 2 :(得分:0)

因为您使用的是本土产品,所以通过尽可能保持简单,至少在开始时,您可能会更好。另外,因为你的产品是本土的,所以你应该对数据结构有很好的处理。

构建简单的基于查询的搜索可能适合初学者。

我从一个简单的搜索表单开始:

<?php

    class Application_Form_Search extends Zend_Form
    {

        public function init() {

            $this->setMethod('POST');
            $this->setDecorators(array(
                array('ViewScript', array(
                        'viewScript' => '_searchForm.phtml'
                ))
            ));

            // create new element
            $query = $this->createElement('text', 'query');
            // element options
            $query->setLabel('Search Keywords');
            $query->setAttribs(array('placeholder' => 'Title',
                'size' => 27,
            ));
            // add the element to the form
            $this->addElement($query);

            $submit = $this->createElement('submit', 'search');
            $submit->setLabel('Search Site');
            $submit->setDecorators(array('ViewHelper'));
            $this->addElement($submit);
        }
    }

然后我构建了一个简单的动作助手来显示和路由表单:

<?php

class Library_Controller_Action_Helper_Search extends Zend_Controller_Action_Helper_Abstract
{

    public function direct($action, $label = null, $placeHolder = null)
    {
        $form = new Application_Form_Search();
        $form->setAction($action);
        $form->search->setLabel($label);
        $form->query->setAttribs(array('placeholder' => $placeHolder,
            'size' => 27,
        ));

        return $form;
    }
}

然后我在layout.phtml中添加了搜索表单的占位符

<?php echo $this->layout()->search ?>

然后在需要使用搜索功能的控制器中,我将帮助器添加到predispatch():

public function preDispatch()
    {
        //assign search action helper to view placeholder
        $this->_helper->layout()->search = $this->_helper->search(
                'url_for_action', 'Submit button label', 'placeholder text'
        );
    }

然后我使用一个简单的mapper方法来执行适当的查询,我通常返回一个paginator适配器:

 public function fetchPagedMoviesByTitle($title)
    {

        $select = $this->getGateway()->select();
        $select->where(new Zend_Db_Expr("title LIKE '%$title%'"));
        $select->order('title', 'ASC');

        //create a new instance of the paginator adapter and return it
        $adapter = new Video_Model_Paginator_Video($select);

        return $adapter;
    }

这是实现搜索功能的简单方法,适用于大多数类型的查询。我发现可以使用交换机语句和几个简单的数据库查询以及我需要的几乎任何信息。

祝你好运。