Een lege waarde genereren voor een boolean search

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Wim de Ridder

Wim de Ridder

11/09/2013 13:13:00
Quote Anchor link
M.b.v. onderstaande query kan ik perfect booleaanse zoekwaarden maken in twee verschillende velden.
Het werkt precies zoals ik het wil hebben.
Het probleem is echter wanneer ik in één veld geen waarde invoer dan wordt er niets gevonden. Lijkt mij ook logisch als je de AND operator gebruikt. Gebruik ik inplaats van de AND operator de OR operator dan krijg ik een zoekresultaat waarbij de twee waarden niet alleen beide in een row staan maar ook waar één van de waarden in een row staan, dit wil ik dus niet.
Wat ik zoek is wanneer een zoekveld geen waarde krijgt dat de lege waarde wordt vervangen door een teken/operator of e.d. waardoor het mogelijk is om ook met 1 veld te kunnen zoeken.

Ik zit zelf te denken aan 'if $keywords heeft geen waarde dan $keywords=???' Bij de vraagtekens weet ik niet wat daar in te vullen.
Ik hoop dat ik een beetje duidelijk ben. Zo niet vraag rustig door.
Iemand misschien een idee hoe dit op te lossen. B.v.d.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php
$keywords
= ???? ;

mysql_select_db($database_museum, $museum);
$query_Recordset1 = sprintf("SELECT  rapporten.rapnaam, rapporten.omschrijving, rapporten.vliegtuig_type, rapporten.auteur, rapporten.datum, rapporten.bestellen FROM `rapporten` WHERE MATCH (`omschrijving`)\n"
    . "AGAINST ('$keywords' IN BOOLEAN MODE) AND MATCH (`vliegtuig_type`)\n"
    . "AGAINST ('$keywordsvl' IN BOOLEAN MODE) ", GetSQLValueString($colname_Recordset1, "text"));
$Recordset1 = mysql_query($query_Recordset1, $museum) or die(mysql_error());
$row_Recordset1 = mysql_fetch_assoc($Recordset1);
$totalRows_Recordset1 = mysql_num_rows($Recordset1);
?>
 
PHP hulp

PHP hulp

20/05/2024 02:01:12
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

11/09/2013 13:40:27
Quote Anchor link
Niet met MATCH AGAINST, tenzij je $keywords a* t/m z* wilt gaan maken.
De beste oplossing is denk ik om de query op te bouwen afhankelijk van welke waardes gevuld zijn.
Gewijzigd op 11/09/2013 13:40:49 door Ger van Steenderen
 
Ward van der Put
Moderator

Ward van der Put

11/09/2013 13:40:43
Quote Anchor link
Je kunt beter drie query's opstellen in PHP: een voor MATCH x, een voor MATCH y en een voor MATCH x AND MATCH y.
 
Wim de Ridder

Wim de Ridder

12/09/2013 03:13:03
Quote Anchor link
Dank voor jullie antwoorden.
Ik begrijp dat dat de oplossing erop neerkomt dat; indien geen waarde in veld1 dan alleen zoeken in veld2 etc..
De uiteindelijke versie zal vijf zoekvelden hebben dus om alle zoekvarianten te beschrijven zal een hele klus zijn.
Mijn PHP/MYSQL kennis is van een beginner daarom mijn vraag of het mogelijk is om een kleine voorbeeld query te schrijven om mij in de goede richting te duwen. B.v.d.
 
Ward van der Put
Moderator

Ward van der Put

12/09/2013 07:41:14
Quote Anchor link
Misschien moet je eerst nog eens naar de structuur van je index kijken. Je zoek nu namelijk steeds in maar één kolom:

MATCH (omschrijving) AGAINST ('$keywords' IN BOOLEAN MODE)

en/of

MATCH (vliegtuig_type) AGAINST ('$keywordsvl' IN BOOLEAN MODE)

Hierdoor benut je de mogelijkheden van de fulltext search van MySQL niet optimaal. Stel dat 'Boeing 747' voorkomt in de drie kolommen rapporten.rapnaam, rapporten.omschrijving én rapporten.vliegtuig_type. Dan zou dát record hoger moeten worden getoond dan andere records waarbij 'Boeing 747' alleen voorkomt in de kolom rapporten.vliegtuig_type.

Een full-text search doet dat automatisch, zolang je maar de fulltext index goed zet. De query krijgt dan de volgende structuur:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
SELECT a, b, c, d, e
  FROM t
  WHERE
    MATCH (a, b, c)
    AGAINST ('zoekwoord')
 



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.