2009-09-06 3 views
1

Я пытаюсь получить полнотекстовые поиски, которые будут отсортированы по релевантности в запросе Doctrine_RawSql .Как использовать Doctrine_RawSql для полнотекстового поиска и сортировки по релевантности

Этот код будет выполнять поиск:

$q = new Doctrine_RawSql(); 

$q->select('{p.*}') 
    ->from('cms_page p') 
    ->where('match(p.content) against (?)', $user_query) 
    ->addComponent('p', 'CmsPage p'); 

Это будет выполняться. Я хотел бы, чтобы результаты были отсортированы по релевантности

Реальный SQL бы выглядеть примерно так:

select 
    p.id, 
    match(p.content) against (?) as score 
from 
    cms_page as p 
order by 
    score desc; 

Поэтому мне нужно получить, что матч ... против статьи в избранных ... Я думать.

Мой crapshoot догадка выполнения этого было:

$q->select("{p.id}, match({p.content}) against ('$escaped_user_query') as score") 
    ->from('cms_page p') 
    ->orderBy('score DESC') 
    ->addComponent('p', 'CmsPage p'); 

Это не работает. Любые указатели?

Заранее благодарен!

ответ

3

В соответствии с MySQL полнотекстового естественным языком поиска документы:

Когда MATCH() используется в ИНЕКЕ, как в примере, показанном выше, строки возвращано автоматически сортируются с самой высокой релевантностью первым. Значения релевантности - неотрицательные числа с плавающей запятой. Нулевая релевантность означает отсутствие сходства. Релевантность вычисляется на основе количества слов в строке, количества уникальных слов в этой строке, общего количества слов в коллекции и количества документов (строк), содержащих определенное слово.

Это не работает для вас?

Подробнее о естественном полнотекстовом поиске в MySQL here.