2011-01-16 11 views
2

属性のコレクション内でSphinxを検索する方法はありますか?Sphinxで属性コレクション内を検索

私は他の属性の中でも施設のコレクションを持っている(建物のように、属性ではない)プロパティを持っています。プール、無線LAN。

各プロパティは

答えて

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の属性を使用して回避することができます。 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> 

を...それは!;作品)

(スフィンクス2.0.6-id64リリース(r3473))

関連する問題