sql >> Databasteknik >  >> RDS >> Mysql

Hur skulle jag implementera en enkel webbplatssökning med php och mySQL?

Alla föreslår MySQL fulltextsökning, men du bör vara medveten om en ENORM varning. Fulltextsökmotorn är endast tillgänglig för MyISAM-motorn (inte InnoDB, som är den mest använda motorn på grund av dess referensintegritet och ACID-kompatibilitet).

Så du har några alternativ:

1. Det enklaste tillvägagångssättet beskrivs av Partikelträd . Du kan faktiskt få rankade sökningar från ren SQL (ingen fulltext, inget ingenting). SQL-frågan nedan kommer att söka i en tabell och rangordna resultat baserat på antalet förekomster av en sträng i sökfälten:

SELECT
    SUM(((LENGTH(p.body) - LENGTH(REPLACE(p.body, 'term', '')))/4) +
        ((LENGTH(p.body) - LENGTH(REPLACE(p.body, 'search', '')))/6))
    AS Occurrences
FROM
    posts AS p
GROUP BY
    p.id
ORDER BY
    Occurrences DESC

redigerade sitt exempel för att ge lite mer klarhet

Variationer på ovanstående SQL-fråga, lägga till WHERE-satser (WHERE p.body LIKE '%whatever%you%want'), etc. kommer förmodligen att ge dig exakt vad du behöver.

2. Du kan ändra ditt databasschema för att stödja fulltext. Ofta görs det för att behålla InnoDB:s referensintegritet, ACID-kompatibilitet och hastighet utan att behöva installera plugins som Sphinx Fulltext Search Engine för MySQL är att dela upp offertdata i sin egen tabell. I grund och botten skulle du ha en tabell Quotes som är en InnoDB-tabell som istället för att ha ditt TEXT-fält "data" har en referens "quote_data_id" som pekar på ID:t på en Quote_Data-tabell som är en MyISAM-tabell. Du kan göra din fulltext på MyISAM-tabellen, gå med i ID:n som returneras med dina InnoDB-tabeller och voila du har dina resultat.

3. Installera Sphinx . Lycka till med den här.

Med tanke på det du beskrev skulle jag MÖJLIGT göra rekommenderar att du tar det första tillvägagångssättet jag presenterade eftersom du har en enkel databasdriven webbplats. Den första lösningen är enkel, gör jobbet snabbt. Lucene kommer att vara en bitch att konfigurera speciellt om du vill integrera den med databasen eftersom Lucene är designad främst för att indexera filer inte databaser. Googles anpassade webbplatssökning gör att din webbplats förlorar massor av rykte (får dig att se amatörmässig och hackad ut), och MySQL-fulltext kommer med största sannolikhet att få dig att ändra ditt databasschema.



  1. Hur kommer du till gränser på 8060 byte per rad och 8000 per (varchar, nvarchar) värde?

  2. SIGN() Exempel i SQL Server

  3. Laravel dynamisk rullgardinsmeny land och stat

  4. Varför får jag "Binär loggning inte möjligt." på min MySQL-server?