2011-01-16 2 views
2

Есть ли способ поиска в Sphinx в коллекции атрибутов?Поиск Sphinx в коллекции атрибутов

У меня есть свойство (как в здании, а не атрибут), которое среди других атрибутов имеет набор средств, например. бассейн, Wi-Fi.

Каждое свойство имеет несколько объектов

ответ

5

вычислен это, вы должны использовать "мульти" атрибут, прилагается xmlpipe2 документ + PHP пример поиска

<?xml version="1.0" encoding="UTF-8"?> 
<sphinx:docset> 
<sphinx:schema> 
    <sphinx:field name="capacity"/> 
    <sphinx:field name="region"/> 
    <sphinx:field name="facilities"/> 
    <sphinx:attr name="capacity" type="int"/> 
    <sphinx:attr name="region" type="int"/> 
    <sphinx:attr name="facilities" type="multi"/> 
</sphinx:schema> 
<sphinx:document id="94"> 
    <capacity>37</capacity> 
    <region>12</region> 
    <facilities> 
    <attr>23</attr> 
    <attr>5</attr> 
    <attr>2</attr> 
    <attr>1</attr> 
    </facilities> 
</sphinx:document> 
</sphinx:docset> 

PHP поиск:

$sp = new SphinxClient(); 
$sp->SetMatchMode(SPH_MATCH_ALL); 
$sp->SetArrayResult(true); 
$sp->SetServer('localhost', 3312); 
$sp->SetFilter('facilities', array(23, 5)); 
$sp->Query(); 
1

Для этого случая лучше использовать Multi value attributes.

sql_attr_multi = uint facilities from query; \ 
SELECT id, facility_id FROM facilities 

В приложении:

$cl->SetFilter('facilities', array(1, 2, 3)); 
$cl->Query(); 

Но вы можете избежать использования атрибутов MVA. Просто Concat каждый объект в SQL запросе:

sql_query = select group_concat(facilities SEPARATOR ' ') as facilties \ 
from building b inner join facilities f on (b.facility_id = f.id) 

В приложении:

$cl->Query("@facilities pool"); 
1

В моем случае объявляющего MVA атрибуты как:

<facilities> 
    <attr>23</attr> 
    <attr>5</attr> 
    <attr>2</attr> 
    <attr>1</attr> 
</facilities> 

не работает. Но когда я делаю это нравится:

<facilities>23,5,2,1</facilities> 

... это работает !;)

(Sphinx 2.0.6-id64-релиз (r3473))

Смежные вопросы