Nedir (PHP) Sfenks bilgi almak için en iyi yolu nedir?

3 Cevap php

I'm new to sphinx, and I'm seting it up on a new website. It's working fine, and when i search with the search in the console, everything work.

PHP API ve arama kullanarak, hem de bana aynı sonuçları verir. Ama bana bulundu satırlar sadece kimlikleri ve ağırlıklarını vermektedir. Örneğin, 'maçların karma ile bazı metin alanları togheter getirmek için bazı yolu var mı?

Bunu yapmak için hiçbir yolu varsa, herkes (aynı zamanda tüm bunları arama) sfenks ağırlık sıralama düzeninde veritabanı (sql) gelen kayıtları almak için nasıl hakkında iyi bir fikir var mı?

3 Cevap

Her şeyi belirtilen sipariş sfenks sağlamak için ORDER BY bir MySQL alan () işlev çağrısı kullanabilirsiniz.


$idlist = array();
foreach ( $sphinx_result["matches"] as $id => $idinfo ) {
    $idlist[] = "$id";
}
$ids = implode(", ", $idlist);

SELECT * FROM table WHERE id IN ($ids) ORDER BY FIELD(id, $ids)

Yeah, sphinx doesn't bring the results. But I found out a simple way to reorder the query using the IN() clause, to bring all together.

Şey Quering

SELECT * FROM table WHERE id IN(id_list... )

sadece tabloda kendi kimliği ile, sonuç indeksleme:

while ($row = mysql_fetch_objects)
   $result[$row->id] = $row;

ve sfenks gelen eşleşen sonuçlara sahip, onun yeniden düzenlemek çok kolay:

$ordered_result = array();
foreach ($sphinxs_results['matches'] as $id => $content)
   $ordered_result[] = $result1[$id];

Lütfen $ sphinxs_results doğru sırayla ise bu işe zorundadır.

onun neredeyse Pat'in cevabı, ama daha az bir döngü ile. Büyük sonuçlarında bazı diference yapabilirsiniz sanırım.

Alex söylediği gibi, Sfenks bu bilgi vermez. Ağırlık sırayla sonuçları tutarak, dışarı ilgili veri almak, sadece döngü her ID ile - Sen veritabanını kendinizi sorgulamak için kimlikleri kullanmak zorunda olacak. Bir sorguda tüm yapmak için, aşağıdaki gibi bir şey deneyebilirsiniz (pseudo-code - PHP seçim benim dil değil):

results = db.query("SELECT * FROM table WHERE id IN (%s)", matches.join(", "));
ordered_results = [];

for (match in matches) {
  for (result in results) {
    if (result["id"] == match) {
      ordered_results << result;
    }
  }
}

return ordered_results;