[SQL] selecteren van een woord uit een zin [maar wel index]

Pagina: 1
Acties:
  • 938 views sinds 30-01-2008
  • Reageer

  • willyb
  • Registratie: November 2002
  • Laatst online: 30-11 12:17
Zit eigenlijk al een tijdje te zoeken naar een goede methode om uit een database vol met lange reekse texten woorden te kunnen selecteren. Niet dat het opzich zo moeilijk is, maar het moet allemaal ook nog een beetje snel gebeuren.

Fulltext kan ik eigenlijk niet gebruiken omdat die standaard op iedere mysql server op 4 staat ingesteld als minimale lengte (en ik ook 'ik' wil kunnen vinden).

select ... where %...% kan ook niet, want dan maak je geen gebruik van indexen.

Maar hoe kun je dan eigenlijk wel een woord uit een lange reeks selecteren, zonder dat het traag gaat worden.

bv;
De kip legt een ei.

Concreet:
Ik wil 'kip' vinden, en kan dus fulltext en %...% niet gebruiken.

  • BovenHond
  • Registratie: Februari 2002
  • Laatst online: 12:57
Ik ben niet zo bekend met SQL maar ik gebruik in MS-access altijd de functie
code:
1
Instr(1;"Kip";[Tekstveld])


volgens mij is die in SQL precies het zelfde.

Deze functie geeft het beginkaracter (numeriek) waar het woordt Kip begint.

Verwijderd

Als het snel moet worden, en je kunt geen fulltext gebruiken, zit er volgens mij weinig anders op dan uit alle teksten de woorden te extraheren, en in een tabel op te slaan, en met een koppeltabel aan te geven welke woorden in welke records voorkomen. Zelf indexeren dus.

  • MrQcue
  • Registratie: Januari 2005
  • Laatst online: 24-11 15:41
Volgens mij gaat dat niet.

Bekijk deze http://video.google.nl/videoplay?docid=2524524540025172110
video eens vanaf minuut 29.

Daarin wordt iets moois uitgelegd maar dat voldoet niet aan jou wensen helaas. Ik denk dat database-technische gezien niet kan.

Verder is het wel een leerzame video! ;)

  • whoami
  • Registratie: December 2000
  • Laatst online: 18:04
-> PRG

https://fgheysels.github.io/


Verwijderd

Er is een goede reden waarom MySQL bij fulltext search 't minimum aantal karakters op 4 zet: bij ieder karakter minder wordt de index exponentioneel groter. 4 Karakters vind ik al een belachelijk lage grens.
En zoeken op LIKE '%...%' kan inderdaad op geen enkele mogelijkheid een index gebruiken.

Cheatah's optie zou kunnen, maar vergt nogal wat processing op 't moment dat de tekst wordt geinsert/geupdate (dan moet die koppeltabel worden aangemaakt/bijgewerkt, incl. z'n index).
En dan nog kun je niet zoeken op "kip legt", want dat zijn 2 woorden...

Oftewel, tenzij je kunt beschikken over een leuk serverpark met bijbehorende opslag, en goede search software (zoals bij search engines) zul je je moeten behelpen met een lage performance.
Met keywords kun je daar overigens wel een hoop winnen: eerst de gedefinieerde keywords checken, en wanneer je daar hits krijgt die in eerste instantie tonen en eventueel op de achtergrond wat dieper graven in die teksten.

Verwijderd

Zoals Cheatah zegt, eigen functie schrijven voor het zoeken in teksten, mocht je interesse hebben, ik heb vandaag een applicatie afgemaakt die zoeken in bestandan (plain txt) mogelijk maakt, en je de bestanden waarin de gezochte woorden in voorkomen teruggeeft. Met een beetje creativiteit kan je dit heus wel toepasbaar maken op database niveau (en in het ergste geval kan je alle data uit je database naar één of meerdere tekstbestanden exporteren om dan vervolgens dit tooltje eroverheen te gooien).

Mocht je interesse hebben, laat het me maar weten.

  • Icelus
  • Registratie: Januari 2004
  • Niet online
Heb zelf een variatie op deze tip gebruikt:
Posted by Dave M on September 12 2004 3:44pm

Those looking to simply match a search phrase in a large group of words, try this:
SQL:
1
2
3
4
SELECT *
  FROM data
 WHERE haystack LIKE ('%needle%')
   AND haystack RLIKE '[[:<:]]needle[[:>:]]'
This query will produce the same result as the following query, but is roughly 20× faster.
SQL:
1
2
3
SELECT *
  FROM data
 WHERE haystack RLIKE '[[:<:]]needle[[:>:]]'
For more than one word use:
SQL:
1
2
    haystack LIKE ('%word1%word2%')
AND haystack RLIKE '[[:<:]]word1[[:>:]].*[[:<:]]word2[[:>:]]'
Bron: MySQL Full Text

Developer Accused Of Unreadable Code Refuses To Comment

Pagina: 1