PHP / MySQL 'Gelişmiş Arama' Sayfa

5 Cevap php

Ben böyle 'Ben elma gibi' gibi bir anahtar kelime girersiniz ve aşağıdaki seçenekleri kullanarak veritabanı arayabilirsiniz bir sitede bir 'gelişmiş arama' sayfasında çalışıyorum:

Find : With all the words, With the exact phrase , With at least one of the words, Without the words

Ben tarafından 'Tam ifade' bakabilirim:

SELECT * FROM myTable WHERE field='$keyword';

By: 'kelimelerin en az biri'

SELECT * FROM myTable WHERE field LIKE '%$keyword%';//Let me know if this is the wrong approach

Ama üzerinde şaşırıp 'kelimeler olmadan' ve 'en az kelimelerden biri' With.

Bu ikisini nasıl uygulanacağı konusunda herhangi bir öneriniz?

Edit:, kelimelerle anahtar kelimeleri kırmak için explode () kullanmak için iyi bir yaklaşım olabilir, ve eklemek için bir döngü çalıştırmak olmaz 'En az bir kelime' İlişkin

(field='$keywords') OR ($field='$keywords) (OR)....

Orada bazı diğer VE / VEYA maddeleri de sorguda ve ben fıkralar maksimum sayıda farkında değilim çünkü orada olabilir.

5 Cevap

I MySQL FullText Search İstediğiniz sonucu elde etmek mümkün olmalıdır Boolean Full-Text Searches işlevselliği ile bu kullanarak kullanımını öneririm.

Edit:

İstenen bir örnek talep koşullarına göre ("Onun sadece tek bir alan ve 4 seçenekli (vadede olmadan yani 1 kelime, tam kelime, en az 1 kelime) birini seçebilirsiniz.")

Ben size ilk mesajı dayalı php kullanarak varsayarak yaşıyorum

<?php
$choice = $_POST['choice'];
$query = $_POST['query'];

if ($choice == "oneWord") {
    //Not 100% sure what you mean by one word but this is the simplest form
    //This assumes $query = a single word
    $result = mysql_query("SELECT * FROM table WHERE MATCH (field) AGAINST ('{$query}' IN BOOLEAN MODE)");
} elseif ($choice == "exactWords") {
    $result = mysql_query("SELECT * FROM table WHERE MATCH (field) AGAINST ('\"{$query}\"' IN BOOLEAN MODE)");
} elseif ($choice == "atLeastOneWord") {
    //The default with no operators if given multiple words will return rows that contains at least one of the words
    $result = mysql_query("SELECT * FROM table WHERE MATCH (field) AGAINST ('{$query}' IN BOOLEAN MODE)");
} elseif ($choice == "withoutTheTerm") {
    $result = mysql_query("SELECT * FROM table WHERE MATCH (field) AGAINST ('-{$query}' IN BOOLEAN MODE)");
}
?>

Bu boolean maçta operatörler bakın Boolean Full-Text Searches tam olarak kullanmak için yardımcı olur umarım

Sen kullanabilirsiniz

Kelimelerden en az biri ile

SELECT * FROM myTable WHERE field LIKE '%$keyword%' 
or field LIKE '%$keyword2%' 
or field LIKE '%$keyword3%';

Kelime etmeden

SELECT * FROM myTable WHERE field NOT LIKE '%$keyword%';

Ben kolayca diğer ikisi gibi naif bir şekilde bu arama seçeneklerini yapabileceğini emin değilim.

Bu senaryoları desteklemek için gerekirse Sizin ise daha iyi bir arama motoru uygulanması iyi olurdu. Muhtemelen sizi alabilir basit bir bu çizgisinde bir şeydir:

Bir öğe veritabanına eklendiğinde, bu tek tek kelime bölünmüş olduğunu. Bu noktada "ortak" kelimeleri (a, vs ..) (muhtemelen common_words tabloya dayalı) kaldırılır. Onlar zaten mevcut değilse kalan kelimeler bir kelime tabloya eklenir. Kelime girişi ve madde girişi arasında yapılan bir bağlantı sonra yoktur.

Ararken, o zaman kelime tablosundan kelime kimlikleri ve katılma tabloda öğe kimlikleri uygun arama almanın bir durumdur.

Arama iyi yapmak çok zordur.

Sen Lucene veya Sphider gibi bir şey kullanarak bir üçüncü taraf arama motorunu kullanarak düşünmelisiniz.

Zürafa ve Re0sless 2 iyi cevaplar pooseted.

notes: "SELECT * " sucks... only select the columns that you need. Re0sless puts a "OR" between keywords. - you should eliminate common words (" ","i","am","and"..etc) - mysql has a 8kb i belive limit on the size of the query, so for really long SELECTS you should slipt it into separate queries. - try to eliminate duplicate keywords (if i search for "you know you like it" the SELECT should basically only search for "you" once and elimnate common words as "it")

Ayrıca kullanmak "GİBİ" ve "maç gibi" (mysql man sayfasına bakın) bu "bulanık" aramalar için harikalar yapabiliyorlardı çalışın