Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: MySQL-hakukoneen suunnittelua

Sivun loppuun

combo [20.10.2014 12:59:24]

#

Heippa!

Tarkoitus olisi toteuttaa ns. "edistynyt" hakukone. Eli käytännössä hakulomake sisältäisi yhden kentän johon kaikki hakusanat voidaan sijoittaa missä tahansa järjestyksessä.

Otetaan esimerkki: käyttäjä hakee "älypuhelin kosketusnäyttö 120€-220€ 6- mpx takakamera android punainen" ja tietokannasta löytyy omista sarakkeistaan seuraavat tiedot: älypuhelin, hinta 180€, kosketusnäyttö, 8 mpx, takakamera, android ja värivaihtoehto punainen.

Mikä on järkevin tapa PDO:lla ja PHP:llä tehdä hakukyselyjä? Aikaisemmin ole tehnyt yksinkertaisempia hakuja ja tää on uutta. Toki saa laittaa linkkejä vaikka englanninkielisiin oppaisiin.

The Alchemist [20.10.2014 13:06:14]

#

Liittyykö kysymyksesi nyt lainkaan esittämääsi ongelmaan vai ei? Nähdäkseni ei.

Sun ei myöskään kannata tehdä hausta sellaista, että yhteen tekstilootaan syötetään randomisti taginomaisia hakusanoja ja niiden perusteella yritetään arvata, millaista asiaa käyttäjä halusi hakea ja mitkä ovat muita reunaehtoja. Käytä jokaiselle tyypille kustomoituja hakulomakkeita, joilla saat suoraan atomisia arvoja. Ainakin tuo parsiminen on minusta paljon haastavampaa kuin se, miten hakuehdot työnnetään sql-kyselyyn, joka olisi antamallesi esimerkille seuraava:

SELECT *
FROM items
WHERE type = 'phone'
  AND price BETWEEN 120, 220
  AND touch_display = 1
  AND camera_mpx >= 6
  AND os = 'android'
  AND color = 0xFF0000
;

Toisaalta pelkkä tietokantasuunnittelu on jo yksi iso ongelma: työnnätkö kaikki kohteet yhteen tauluun vai tyyppinsä perusteella omiin tauluihin? Mitkä kaikki ominaisuudet tarvitsevat oman sarakkeensa, mitkä pitäisi kenties siirtää erillisiin tauluihin (ja kuinka moneen sellaiseen)?

Jos vain pupellat sarakkeita sitä mukaa, kun keksit uusia ominaisuuksia, niin sulla on kohta tuhatsarakkeinen taulu, jonka sarakkeet ovat relevantteja murto-osalle riveistä.

timoh [20.10.2014 13:48:28]

#

The Alchemist kirjoitti:

Sun ei myöskään kannata tehdä hausta sellaista, että yhteen tekstilootaan syötetään randomisti taginomaisia hakusanoja ja niiden perusteella yritetään arvata, millaista asiaa käyttäjä halusi hakea ja mitkä ovat muita reunaehtoja.

En nyt näinkään sanoisi. Esim. auto1.fi:ssä on juuri tuollainen haku, ja se toimii vallan mainiosti.

@combo Jotain osviittaa kuinka rakentaa saanet juuri auto1.fi:n hakusivulta http://www.auto1.fi/haku/volkswagen golf 1.6 bensa variant 2010 (tuolla haulla ei löydy mitään ja hakusivun ohjeistusta voit käyttää apuna).

combo [20.10.2014 14:51:00]

#

The Alchemist kirjoitti:

Toisaalta pelkkä tietokantasuunnittelu on jo yksi iso ongelma: työnnätkö kaikki kohteet yhteen tauluun vai tyyppinsä perusteella omiin tauluihin?
...
Jos vain pupellat sarakkeita sitä mukaa, kun keksit uusia ominaisuuksia, niin sulla on kohta tuhatsarakkeinen taulu, jonka sarakkeet ovat relevantteja murto-osalle riveistä.

Joo siis halusin selittää asian mahdollisimman yksinkertaisesti. Tietokantasuunnittelu on hallinnassa ja tiedän, ettei kaikkea dataa kannata iskeä yhteen tauluun.

timoh kirjoitti:

Esim. auto1.fi:ssä on juuri tuollainen haku, ja se toimii vallan mainiosti.

@combo Jotain osviittaa kuinka rakentaa saanet juuri auto1.fi:n hakusivulta http://www.auto1.fi/haku/volkswagen golf 1.6 bensa variant 2010 (tuolla haulla ei löydy mitään ja hakusivun ohjeistusta voit käyttää apuna).

Kuinka sattuikin, että juurikin auto1.fi oli mulla lähtökohtana tälle idealle.

Auto1.fi-haku toimii vaikka hakusanat laittaisikin miten päin tahansa.


En usko, että tämä olisi mahdotonta toteuttaa.

The Alchemist [20.10.2014 17:53:27]

#

Voihan se toki toimia, jos tietokanta käsittää vain yhdenlaisia asioita kuten kännykät tai autot. Jos sieltä löytyy autojen lisäksi tietokoneita, irrallisia komponentteja, lemmikkieläimiä ja avaruusluotaimia, niin silloin uskoakseni asioista tulee vaikeampia.

Toki haun voi toteuttaa niin, että jokaisen sarakkeen arvoa pidetään yhtenä tagina ja ne indeksoidaan yhteen tauluun (item_id, tag, ...) ja tulokset lajitellaan esimerkiksi tagiosumien määrän perusteella. Tässä vaiheessa miettisin itse, voisiko esimerkiksi Elasticsearch tehdä elämästä hieman helpompaa.

combo [21.10.2014 12:18:02]

#

Itse suunnittelin toteuttavani haun niin, että hakukentässä tagit erotellaan välilyönnillä. Sitten silmukassa käsitellään aina yksi tagi kerrallaan ja etsitään, löytyykö se jostakin n. 6 eri taulusta tietystä sarakkeesta (content, tag, type, cat yms.). Mikäli tagi löytyy, sitten tutkitaan ekan tagin sisältävistä tuloksista toisen hakusanan vastaavuudet. Haku pysähtyy siihen, mikäli seuraavalla hakusanalla ei löydy vastaavuutta tietokannasta.

The Alchemist [21.10.2014 17:37:10]

#

Tuollainen haku kuulostaa todella hitaalta.

groovyb [21.10.2014 18:45:41]

#

eikö olisi yksinkertaisempaa tehdä crawlille oma taustaprosessi (jota ajetaan aikavalillä n), joka kerää eri sanoista koosteen omaan tauluunsa, osoittaen alkuperäiseen lähteeseen. Näin verkossa suoritettu haku voitaisiin suorittaa suoraan yhdestä hakuindeksitaulusta.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta