sql >> Database >  >> RDS >> Mysql

hoe Fuzzy opzoeken te gebruiken om de zin in SQL te vinden?

Dit is geen eenvoudige vraag. Je kunt het beste een soort fulltext-search gebruiken een> . Zoeken in volledige tekst kan worden geconfigureerd om stopwoorden te hebben (woorden die zijn weggelaten uit de zoekopdracht - zoals het woord the ) en kan ook een minimale woordlengte hebben (woorden met minder dan bepaalde tekens lang worden ook weggelaten uit de zoekopdracht.

Als u echter gewoon

SELECT * FROM testtable
WHERE MATCH (sentence)
AGAINST ('ISBN number on site');

Dan retourneert MySQL niet alleen het record met de waarde waarnaar u op zoek was, maar ook de records die slechts enkele van de woorden bevatten, en in een andere volgorde. Degene die je hebt laten zien, zal waarschijnlijk een van de hoogst gerangschikte zijn, maar er is geen garantie dat het de hoogst gerangschikte zal zijn.

Misschien wilt u Boolean fulltext search gebruiken en voeg + toe naar elk zoekwoord om MySQL te dwingen alleen die records terug te geven waarin alle zoekwoorden aanwezig zijn:

SELECT * FROM testtable
WHERE MATCH (sentence)
AGAINST ('+ISBN +number +on +site' IN BOOLEAN MODE);

Maar, on moet ofwel een stopwoord zijn (het staat op de standaard stipwoordenlijsten) of moet korter zijn dan de minimale woordlengte, dus moet worden weggelaten uit de zoekexpressie (u krijgt geen resultaten terug):

SELECT * FROM testtable
WHERE MATCH (sentence)
AGAINST ('+ISBN +number +site' IN BOOLEAN MODE);

Ik weet dat dit een wijziging van de zoekexpressie vereist, maar dit zal u de beste resultaten opleveren met de ingebouwde functionaliteit van MySQL.

Het alternatief is om andere fulltext-zoekmachines te gebruiken, zoals sfinx om de zoekopdracht voor u uit te voeren.



  1. Voorkomen dat wijzigingen worden opgeslagen waarvoor de tabel opnieuw moet worden gemaakt, negatieve effecten

  2. Converteer tekenreeks naar Datetime-object in SQL

  3. sql-maven-plug-in met meerdere scheidingstekens

  4. mysql:selecteer gewoon iets gebeuren in het weekend