Zend Framework Lucene Boolean / "Google" -подобный поиск - PullRequest
1 голос
/ 23 марта 2009

Я работаю над приложением на http://demos.zatechcorp.com/codeigniter/

В его текущем воплощении, работающем на моей машине, я загрузил ZendFramework внутри Codeigniter и сгенерировал индекс, например:

    // ... Some code that loads all the markets
    foreach ($markets as $market)
    {
        $doc = new Zend_Search_Lucene_Document();
        // Id for retrieval
        $doc->addField(Zend_Search_Lucene_Field::UnIndexed('id', $market->id));
        // Store document URL to identify it in search result.
        $doc->addField(Zend_Search_Lucene_Field::Text('url', $market->permalink));
        // Index document content
        $doc->addField(Zend_Search_Lucene_Field::UnStored('contents', $market->description));
        // Title
        $doc->addField(Zend_Search_Lucene_Field::Text('title', $market->title));
        // Phone
        $doc->addField(Zend_Search_Lucene_Field::Keyword('phone', $market->phone));
        // Fax
        $doc->addField(Zend_Search_Lucene_Field::Keyword('fax', $market->fax));
        // Street
        $doc->addField(Zend_Search_Lucene_Field::Keyword('street', $market->street));
        // City
        $doc->addField(Zend_Search_Lucene_Field::Keyword('city', $market->city));
        // State
        $doc->addField(Zend_Search_Lucene_Field::Keyword('state', $market->state));
        // Zip
        $doc->addField(Zend_Search_Lucene_Field::Keyword('zip', $market->zip));
        // Type
        $doc->addField(Zend_Search_Lucene_Field::UnIndexed('type', 'market'));

        // Store Document
        $index->addDocument($doc);
    }

В моем поиске я делаю это:

    $hits    = $index->find($q);

Это работает с простыми словами, но когда я хочу выполнить поиск, такой как "Sheba Foods" (включая цитаты), он возвращает один результат, но неверный, в котором даже нет слова "Sheba". 1010 *

Я отошел от полнотекстового поиска MySQL из-за его очевидных проблем и не могу с этим справиться.

Я смотрю на метод Zend_Search_Lucene_Search_QueryParser :: parse (). Ответ лежит в этом методе?

Ответы [ 2 ]

3 голосов
/ 24 марта 2009

Я понял это. В Lucene вы можете добавить поле с именем «id», но получение идентификатора из попадания дает вам нечто иное - я думаю, это идентификатор поискового запроса во всех результатах поиска.

В этом случае мне нужно было использовать другое имя поля, например:

    // Id for retrieval
    $doc->addField(Zend_Search_Lucene_Field::UnIndexed('item_id', $market->id));
0 голосов
/ 24 марта 2009

В прошлом я использовал полнотекстовый поиск MySQL, но он действительно сильно загружал процессор.

Вы всегда можете положиться на SELECT * FROM table WHERE column = '% query%'

:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...