Nasıl Yapılır: Sıralaması Arama Sonuçları

4 Cevap php

Ben için bir çözüm geliştirdik bir webapp kalkınma sorunu var, ama ben görüyorum bazı performans sorunları aşmanın belki başka fikirleri bulmaya çalışıyorum.

sorun bildirimi:

  • Bir kullanıcı birden fazla anahtar kelime / belirteçleri girer
  • belirteçleri maçları için uygulama arar
  • need one result for each token
    • bir giriş 3 belirteçleri varsa yani, ben girdisi kimliğini 3 kez ihtiyaç
  • rank the results
    • belirteç maç için X puan atamak
    • puanlarına dayalı giriş kimlikleri sıralamak
    • puan değerleri aynı ise, sonuçlarını sıralamak için tarih kullanmak

Ben yapmak mümkün olmak istiyorum, ama çözemedim Ne, in () sonuçlarına benzer bir şey verir, ancak her belirteci için bir yinelenen giriş kimliğini döndüren kontrol her giriş id maçları 1 sorgusu göndermektir.

Belirteci başına bir sorguyu çalıştıran birden çok bireysel sorgular kullanarak ben ne yapıyorum daha bunu yapmak için daha iyi bir yolu var mı? Eğer öyleyse, bu uygulamak için en kolay yolu nedir?

edit
I've already tokenized the entries, so, for example, "see spot run" has an entry id of 1, and three tokens, 'see', 'spot', 'run', and those are in a separate token table, with entry ids relevant to them so the table might look like this:

'see', 1 
'spot', 1 
'run', 1 
'run', 2 
'spot', 3

4 Cevap

Eğer MySQL 'UNION ALL' kullanarak tek sorguda bu başarmak olabilir.

PHP her belirteci TÜM UNION oluştururken belirteçleri ile sadece döngü:

örneğin belirteçleri 'x', 'y' ve 'z' sorgu gibi bir şey görünebilir eğer

SELECT * FROM `entries` 
WHERE token like "%x%" union all 
    SELECT * FROM `entries` 
    WHERE token like "%y%" union all 
        SELECT * FROM `entries` 
        WHERE token like "%z%" ORDER BY score ect...

Sipariş fıkra neye ihtiyacınız olduğunu, hangi biri olarak tüm sonuç setinde çalışmalıdır.

Performans açısından bu ancak veritabanları ile hız açısından ana havai genellikle PHP veritabanı altyapısı için sorgu gönderme ve sonuçlarını alıyor, hızlı tüm bu (ben tahmin ediyorum) olmayacaktır. Bu teknik ile bu yerine sadece belirteci kez başına bir kez olur, bu yüzden performansı yeterli olacak eğer ben sadece bilmiyorum, artacaktır.

Ben bu kesinlikle size but if your table is thousands rather than millions of rows, daha sonra FULLTEXT çözüm burada gitmek için en iyi yolu olabilir soruyorsun sorusuna bir cevap değil biliyorum.

Eğer endeksli sütunun üzerinde MAÇ kullandığınızda MySQL, sağladığınız her anahtar kelime yöntemi daha doğru olabilir ve kesinlikle birden fazla anahtar kelimeler için daha verimli olacaktır (her bir anahtar kelime belirttiğimiz kez sayısına göre kabaca hesaplanan) bir alaka puan verilecektir.

See here: http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html

Eğer UNION ALL desen kullanarak ediyorsanız siz de sorgu için aşağıdaki parçaları dahil etmek isteyebilirsiniz:

SELECT COUNT(*) AS C
...
GROUP BY ID
ORDER BY c DESC

Bu gerçekten önemsiz bir örnek olsa da size her sonuç için maç sıklığını olsun ve bu başlangıç ​​için bir sahte rütbe olabilir.

Bunun yerine bir veritabanına göre arama görevleri için tasarlanmış bir veri yapısı kullanılmıştır varsa muhtemelen çok daha iyi performans alırsınız. Örneğin, bir inverted index Bina bakarak deneyebilirsiniz. Aksine kendin yazmayı daha, ancak, aynı zamanda Lucene sizin için işin çoğunu yapar gibi bir şey içine bakmak isteyebilirsiniz.