Gelişmiş arama işlevselliği

2 Cevap php

Ben inşaat büyük bir jQuery tabanlı otomatik tamamlama arama işlevselliği ile bir web sitesi var.

Tüm kategoriler için sadece bir arama kutusu, birisi yazın edebilmek için ne istiyorum olsa Şu anda, için arayacaktır örneğin, dorian gray dvd (herhangi bir sırayla) söylemek {[(1) ]} dvd kategori içinde. Ne bu gerektirecektir sonra kelimelerin herhangi kategorisi anahtar kelimeler olup olmadığını anlamaya, ve o kadar aramayı sınırlandırmak için sunucu tarafında büyü biraz.

PHP / MySQL bunun için en iyi (ve en hızlı) yolu nedir?

Şu anda düşünce birkaç trenler var

  • Search the category table for matches and perhaps order the results by that.
  • Or split up the search terms into an array and separately search the categories for that for a match.
  • Another thought I just had is to concat the category title to the dvd title in the database and match against that, or something similar... but this sounds computationally expensive?

Herhangi bir tavsiye?

2 Cevap

İlk fikir muhtemelen kadar döngüler ve kod satırları gider gibi hızlı olduğunu. o yüzden çökmek ve sağ mysql sorgunun ucunda yeni dize ekleyebilirsiniz, arama sorgusu patlamaya biçimlendirmek için yeni dizinin her bölümünü sarın.

Sonra sadece sonucunu almak ve arama sorgusuna ekleyebilir. Kategoriler sorgu gibi aynı zamanda uzay formatlamasýný arama sorgusu kaydetmek için.

$temp=explode(" ", $string);
foreach($temp as $key=>$var) {
   $where[$key]=>"category='".mysql_real_escape_string($var)."'";
   $where2[$var]=>"field like '%".mysql_real_escape_string($var)."%'"; //formating the second query at the same time
}
$result=mysql_query("SELECT name FROM categories WHERE ".implode(" OR ", $where));
$cat=mysql_fetch_object($result)->name;
unset($where2['cat']); //removing the category from the search
$where2=implode(" OR ", $where2);
$result=mysql_query("SELECT * FROM table WHERE ($where2) and category='$cat'");

IN() comes in handy here. There are several methods, they vary in complexity and performance I'll assume that you have a Categories table, and that whatever uses the category uses it by the category identifier, like so:

categories
    id
    name

posts
    id
    category
    name

Bu fonksiyon aynı zamanda bir kategoriye uyan anahtar kelimeleri kaldırır - size anlatıldığı gibi. Aynı zamanda birden fazla kategori arama yapmanızı sağlar. Bu sizin için arama uygulanmasını bırakır, ben gerçekten performansı vurur gibi GİBİ "% anahtar kelime%" kullanarak vazgeçirmek olsa.

Use IN keyword

$keywords = $escaped_keywords = explode(' ', $user_input);
array_walk($escaped_keywords, 'db_escape');
$query = 'SELECT id, name FROM categories WHERE name IN ("' . implode('", "', $escaped_keywords) . ")";
$result = db_query($query);
$category_in = '';
while($row = db_fetch($result)) {
    $category_in .= ($category ? ', ' : '') . db_escape($row['id']);
    unset($keywords[$row['name']))
}
if($category_in) {
    // $where is your conditional from your current script
    $where .= ($where ? ' AND ' : '') . "category IN($category_in)";
}

Build an search index instead

Bir arama indeksi yapma gerektirir başka bir çözüm ölçüde daha karmaşıktır. Bir arama indeksi, arama indeksi kısmen kategori adlarını yerleştirin ve (sonrası vücutta demek daha) o anahtar kelime için daha alakalı olarak işaretlemek ve diğer anahtar kelimelere göre daha alakalı kategoriyi işaretlemek yapmak için izin verecek. Gibi bir şey: bu avantajı ilk ne gelir üzerinde kontrolün her türlü var olduğunu:

SELECT p.*, MAX(pi.relevance) relevance FROM posts LEFT JOIN post_index pi ON pi.post = post.id WHERE keyword IN (keyword_list) GROUP BY pi.post_date, pi.post ORDER BY relevance DESC

Sizin indexer bu sıralamayı veya uygunluğu belirlemek için istediği her şeyi yapabilir. Zaman dizin içerik için zor kısmı sergiyi olduğunu.