Toon posts:

[search] twee keyword strings met relevantie

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

Verwijderd

Topicstarter
Okay, ik heb even wat rond gezocht op het forum maar mijn vraag is niet beantwoord. Ik wil een zo snel mogelijke manier hebben om het volgende te doen:

Ik heb een mysql db met daarin een veld keywords. Dit is een varchar veld met bijvoorbeeld de inhoud:

inkoop, verkoop, advies

Een persoon heeft in een persoonlijk profiel staan:

inkoop, advies, administratie.

ik wil nu bij de persoon alle records selecteren die relevant zijn voor hem. Dwz meer dan 50 % match. bovenstaand persoon heeft een match van 66% (2 van de 3).

Ik heb het geprobeerd met fulltext, en dan de match against clausule in mysql, maar dat werkt niet, of ik weet niet precies hoe deze werkt.

iemand een idee

Verwijderd

Topicstarter
Even een voorbeeld. Ik gebruik de volgende query :

SELECT * , MATCH ( knowledgeprofile ) AGAINST ( 'WORD' ) FROM master_questions

De inhoud van de column knowledgeprofile:

PHP, MYSQL, WORD

Toch krijg ik als result voor de match 0 :?

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

is het niet handiger de keywords in aparte records op te slaan en dan bij je 'document' bij te houden hoeveel keywords erin stonden.

Bij je select hoef je dan alleen maar te tellen hoeveel matches er op je document waren (kan evt met count( * )) en dat te delen door het totaal aantal keywords.

Dat zou in 1 sql-statement kunnen ala:
SQL:
1
2
3
4
5
6
7
8
9
10
SELECT 
   documents.docid,
   round(count( * ) / documents.keywordcount * 100, 0)  as percentage
 FROM
   documents, keywords
WHERE
  document.docid = keywords.docid
  AND
  keywords.key IN ('inkoop', 'verkoop', 'advies')
GROUP BY documents.docid ORDER BY percentage DESC

Verwijderd

Topicstarter
Dat had ik ook al bedacht. Echter zijn er teveel onderdelen in het systeem die deze keywords gebruiken. Dat zouden heel veel records worden. Als er geen andere oplossing is dan dat, dan zal ik het wel zo maken, maar ik denk dat het ook anders moet kunnen.

Verwijderd

Dit is mijns inziens niet echt de manier om dat te bereiken. Veel beter kun je een keywords tabel maken, een n-op-m relatie tot persoon, en tevens een n-op-m relatie met die andere tabel waarop je wil matchen. In dat geval kan je met wat JOINS en GROUP BY magie het probleem oplossen.

Edit:
/me boogies as the Spuit 11 he is, and falls off stage

[ Voor 11% gewijzigd door Verwijderd op 05-06-2003 12:55 ]


Verwijderd

Topicstarter
Zoals ik al zei, met die fulltext search moet het toch ook kunnen. Dan krijg ik niet al die overhead van andere tabellen.

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

er is maar 1 extra tabel hoor en die geeft je net zoveel overhead als de fulltext-index zelf, magoed in principe moet het met de ft-index ook kunnen ja.

MrX: dat is 3 :+

Verwijderd

Topicstarter
In het systeem zitten de volgende modules:
Vragen
Artikelen
Nieuws
Projecten
Personen

Elk van deze modules heeft twee eigenschappen. Een voor keywords en een voor competenties. Het zijn dus 5 x 2 tabellen (of x1 als ik de competenties en keywords in een table stop). Later komen er nog minimaal 5 modules bij. Om de toevoeging van een module eenvoudig te maken wil ik dat de keywords en de competenties in hetzelfde record worden opgeslagen als bijvoorbeeld de vraag.

Verwijderd

Topicstarter
Okay, ik doe het met meerdere tabellen. Ik heb het nu gemaakt, maar ik krijg die query niet voor elkaar (in een query althans). Ik heb twee tabellen en die join ik aan elkaar. De values in de ene zijn

1 - excel
2 - word
3 - powerpoint

de andere

excel
word

Als ik ze nu join krijg ik

1 - excel - excel
2 - word - word
3 - powerpoint - null

Hoe moet ik nu mijn count en group by neerzetten zodat ik direct in een query kan zien dat hij 2 van de drie matcht?

  • robjanssen
  • Registratie: September 2001
  • Laatst online: 02-08 16:10

robjanssen

Software Developer

Op welke velden doe je een JOIN dan?
En wat voor een JOIN gebruik je dan?
Gebruik eens een INNER JOIN

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Verwijderd schreef op 05 June 2003 @ 12:49:
(...)
Toch krijg ik als result voor de match 0 :?
Dat komt voor als je zoekt op 'stopwoorden' (die in meer dan de helft van de rows voorkomen of als je te weinig rows hebt (dan zit een woord al snel in de helft van de rows ;) )

Verwijderd

Topicstarter
ik join de bovenstaande tabel beschrijving op de keywords zelf. Ik moet weten hoeveel NULL values ik heb en hoeveel NOT NULL values.

  • reddog33hummer
  • Registratie: Oktober 2001
  • Laatst online: 18-07 17:33

reddog33hummer

Dat schept mogelijkheden

Moet je eens kijken op www.wcc.nl die hebben op de site een introductie van dit princiepe staan. Dit zal denk ik wel helpen

Backup not found (R)etry (A)bort (P)anic<br\>AMD 3400+ 64, 2 GB DDR, 1,5 TB Raid5


Verwijderd

Topicstarter
Das leuk, maar dat is niet iets wat ik nu beschikbaar heb in php en mysql.

Verwijderd

heb je wel een fulltext index aangemaakt? heb ook al eens een paar gezien dat mensen fulltext gaan zoeken maar niet de index hadden gemaakt, en dan heb je al gauw 0 records :)

Verwijderd

Topicstarter
jawel, die index bestaat

Verwijderd

Topicstarter
SELECT q.questions_id, sum( IF ( isnull( q.knowledgeprofile ) , 0, 1 ) ) AS aantal1, sum(if(isnull(u.knowledgeprofile),0,1)) as aantal2 FROM master_questions_knowledgeprofile AS q LEFT JOIN master_users_knowledgeprofile AS u ON q.knowledgeprofile = u.knowledgeprofile
GROUP BY q.questions_id
Pagina: 1