Fulltext search

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

Shamrock Modelbouw

Shamrock Modelbouw

20/07/2013 09:09:10
Quote Anchor link
Hallo,

Voor het zoeken naar producten op mijn site gebruik ik fulltext search.

Daarbij heb ik 1 probleempje.
Ik heb deze code: +ZOEKVELD*

Als deze waarde in de database staat: abcdefghij

en ik zoek op abcd dan wordt het resultaat gevonden
als ik zoek op bcdef dan vindt hij niets. Hoe kan ik ervoor zorgen dat ik ook het eerste deel van het woord kan weglaten en het toch vindt?

Ik heb dit geprobeerd +*ZOEKVELD* maar ook dat werkt niet

Bedankt alvast!
 
PHP hulp

PHP hulp

17/11/2024 18:46:03
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

20/07/2013 10:10:02
Quote Anchor link
Dan zal je like moeten gebruiken, met match against kan je alleen zoeken op woorden of woorden beginnende met.
 
Shamrock Modelbouw

Shamrock Modelbouw

20/07/2013 10:14:07
Quote Anchor link
Hmja, het probleem is dat ik dat voorheen gebruikte maar ook maar weinig resultaten gaf.

Ik heb bijvoorbeeld 2 kolommen: Merk & Type

Merk is bijvoorbeeld Tamiya
Type is: King hauler full option

Als ik nu zoek naar Tamiya hauler, dan heb ik resultaat
Met Like niet...

Fulltext werkt precies naar behoren, alleen jammer als ik amiya intype dat hij dan niets vindt.
Is er geen omweg om dit wel voor elkaar te krijgen?
Gewijzigd op 20/07/2013 10:14:52 door Shamrock Modelbouw
 
Erwin H

Erwin H

20/07/2013 10:25:00
Quote Anchor link
Eigen indexen opbouwen. Dus de belangrijke woorden uit elk product in een aparte tabel plaatsen met een link tabel naar de producten. Dan zoek je met like in die woordentabel en haalt zo de producten op die aan die woorden zijn gelinked (kan je nog sorteren op hoeveel woorden zijn gevonden).

Overigens, dit lijkt erg omslachtig, maar bedenk dat een fulltext dit in feite ook doet, alleen dan wel naar zo'n beetje alle woorden kijkt. Jij kan zelf de belangrijkste woorden selecteren, waardoor je woordentabel veel kleiner kan worden en dus veel sneller.
 
Shamrock Modelbouw

Shamrock Modelbouw

20/07/2013 10:31:59
Quote Anchor link
Ok maar dan heb ik nog het probleem dat hij een compleet deel van de woorden moet vinden.

Als dit in de tabel staat:

Tamiya King Hauler Full Option

en ik zoek op Tamiya hauler option full dan vindt hij niets, dat is nu wel met fulltext search
 
Eddy E

Eddy E

20/07/2013 12:05:28
Quote Anchor link
Ik gebruik gewoon 'LIKE %zoekwoord%'.

Mijn eerste stukje:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?php

    // kijk eerst even of alles binnen gekomen is
    if(isset($_POST['q']) AND !empty($_POST['q']))
    {

        // eerst makkelijk maken
        $q = strtolower($_POST['q']);
    }

    else
    {
        $q = '';
        $html[] = 'Er is geen zoekopdracht ontvangen';
        $html[] = zoekformulier();
    }


    // bewerk zoekwoorden
    $verwijder = explode(',', "zundapp,de,aan,af,al,als,bij,dan,dat,die,dit,een,en,er,had,heb,hem,het,hij,hoe,hun,ik,in,is,je,kan,me,men,met,mij,nog,nu,of,ons,ook,te,tot,uit,van,was,wat,we,wel,wij,zal,ze,zei,zij,zo,zou");
    $q = str_replace(' '.$verwijder.' ', ' ', $q);


    // de zoekfunctie in woorden hakken en direct in een array zetten
    $q_array = explode(" ", $q);
    $sql_against = array();

    // voor elk woord het volgende maken
    foreach($q_array as $woord)
    {

        $woord = mysqli_real_escape_string($mysqli, strtolower($woord));
        $sql_against[] = " titel LIKE '%" . $woord . "%'
                                OR korte_omschrijving LIKE '%"
. $woord . "%'
                                OR inhoud LIKE '%"
. $woord . "%'";
    }


    $res = sql("
                SELECT id, titel, korte_omschrijving
                FROM artikelen
                WHERE "
. implode(" OR ", $sql_against) . "
                ORDER BY id DESC "
);

?>
Gewijzigd op 20/07/2013 12:06:45 door Eddy E
 
Shamrock Modelbouw

Shamrock Modelbouw

20/07/2013 12:39:22
Quote Anchor link
Bedankt, hier zat ik inderdaad zelf ook al aan te denken, zal dit idee eens toepassen in het zoekscript!
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

20/07/2013 12:54:14
Quote Anchor link
Alleen hoop ik voor jou (en ook voor Eddy), dat de tabel waarin je zoekt niet al te veel records bevat, want LIKE '%woord%' kan een query ontzettend traag maken.
 
Shamrock Modelbouw

Shamrock Modelbouw

20/07/2013 13:20:56
Quote Anchor link
wat is te veel records?

Gaat nu om ongeveer 10000 records
 
Erwin H

Erwin H

20/07/2013 13:33:33
Quote Anchor link
Waarschijnlijk krijg je dan al problemen. Niet alleen vanwege de LIKE, maar meer omdat je per keywoord een LIKE filter gebruikt op 3 kolommen (of in elk geval meerdere) en omdat je een wildcard aan het begin gebruikt. Die laatste is voornamelijk de boosdoener, omdat je daardoor geen indexen meer kunt gebruiken.

Optie 1 om te versnellen, de wildcard aan het begin weglaten (wat dus betekent dat je niet meer op 'amiya' kunt zoeken als je 'tamiya' wilt vinden).

Optie 2 om te versnellen, je keywords waarop jij denkt dat gezocht kan worden eruit halen, in een aparte tabel stoppen, producten linken en daarop zoeken (zoals ik in een eerdere post al aangaf). Dat geeft je ook de mogelijkheid om verbasterde woorden op te nemen. Bijvoorbeeld 'amiya', 'tamiy' en zelfs 'temiya' voor mensen die het verkeerd spellen. Hoef je geen LIKE te gebruiken en kan je dus volledige indexen gebruiken.
 
Bart V B

Bart V B

20/07/2013 13:37:13
Quote Anchor link
Andere optie is om sphinx te installeren.
 
Shamrock Modelbouw

Shamrock Modelbouw

20/07/2013 13:48:37
Quote Anchor link
Ok bedankt, heb bovenstaand idee nu in mijn code toegevoegd en merk nog niets van het langzaam worden. zelfs bij meer dan 7000 gevonden resultaten werkt het nog goed...

denk dat ik dit voor nu ga gebruiken...

wat houd sphinx in?
 
Erwin H

Erwin H

20/07/2013 13:49:35
Quote Anchor link
Op hoeveel woorden zoek je?
 
Shamrock Modelbouw

Shamrock Modelbouw

20/07/2013 13:57:14
Quote Anchor link
verschillend, van 1 letter tot 2 of 3 woorden
 
Bart V B

Bart V B

20/07/2013 14:04:13
Quote Anchor link
http://sphinxsearch.com/docs/current.html

Heb je ook een explain query gedaan?
Want dan weet je hoe lang hij er over doet en wat hij aanspreekt.
 
Shamrock Modelbouw

Shamrock Modelbouw

20/07/2013 14:07:26
Quote Anchor link
Bart V B op 20/07/2013 14:04:13:
http://sphinxsearch.com/docs/current.html

Heb je ook een explain query gedaan?
Want dan weet je hoe lang hij er over doet en wat hij aanspreekt.


zal eens kijken hoe dat werkt met die explain query. Dat sphinx had ik al opgezocht en lijkt interessant, hier in de toekomst eens naar kijken
 
Bart V B

Bart V B

20/07/2013 14:10:13
Quote Anchor link
Hoe het werkt is heel simpel.
Voor dat je select doet zet je er explain voor. ;-)
 
Shamrock Modelbouw

Shamrock Modelbouw

20/07/2013 14:13:44
Quote Anchor link
Was ik al achter ;)

Alleen krijg ik geen tijd te zien, dit is het resultaat

Afbeelding
 
Bart V B

Bart V B

20/07/2013 14:41:15
Quote Anchor link
Zoals je ziet heb je geen key's.
Nu is mijn sql wat stroefjes om het goed uit te leggen, maar waar het op neer komt is dat je een index moet aanmaken.
Dat is een stukje wat er voor zorgt dat hi je niet de hele database hoeft te raadplegen. Maar dat hij uit dat stukje de juiste gegevens ophaalt.

Nb let wel op dat optimaliseren gedaan dient te worden als je een probleem hebt.
Niet als je geen performance probleem hebt.
 
Shamrock Modelbouw

Shamrock Modelbouw

20/07/2013 15:03:23
Quote Anchor link
Hmm... zal eens kijken hoe dat in z'n werk gaat

bedankt voor de hulp!
 
Erwin H

Erwin H

20/07/2013 15:54:05
Quote Anchor link
Het aanmaken van een index is hier zinloos. Door het gebruik van een wildcard voor de zoekterm kan een index niet meer gebruikt worden.

En wat betreft de tijd die de query duurt zoe ik zoektermen testen die steeds langer worden, in elk geval tot zo'n 10 woorden. Dan kan je zien of het nog steeds snel genoeg is voor je.
 

Pagina: 1 2 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.