[MySQL] Fulltext search

Pagina: 1
Acties:

  • nemesis_
  • Registratie: Mei 2003
  • Laatst online: 15-05-2024

nemesis_

I'm your enemy!

Topicstarter
Met de search kon ik nog niks (nuttigs) vinden.

MySQL 4.1.* trouwens.

Ik heb een query die zo zou kunnen zijn:
SQL:
1
SELECT model.name FROM model, activity, user_role, model_activity, model_user_role WHERE model.model_id = model_activity.model_id AND activity.activity_id = model_activity.activity_id AND model.model_id = model_user_role.model_id AND user_role.user_role_id = model_user_role.user_role_id AND activity.name IN ('design', 'plan', 'testing') AND user_role.name IN ('coach', 'trainer', 'management consultant')

Ik neem even aan dat er hier 3 modellen uitkomen, met elk een verschillende activity en/of user_role. Deze worden niet gesorteerd of hooguit op model_id.

Nu wil ik dat er een relevantie in komt. Ik weet dat dit kan via een fulltext search en had al wat bedacht voor de query:
SQL:
1
SELECT model.name, MATCH(activity.name) AGAINST ('design, plan, testing') AS activity_score, MATCH(user_role.name) AGAINST ('coach, trainer, management consultant') AS user_role_score FROM model, activity, user_role, model_activity, model_user_role WHERE model.model_id = model_activity.model_id AND activity.activity_id = model_activity.activity_id AND model.model_id = model_user_role.model_id AND user_role.user_role_id = model_user_role.user_role_id AND MATCH(activity.name) AGAINST ('design, plan, testing') AS activity_score AND MATCH(user_role.name) AGAINST ('coach, trainer, management consultant')

Ook hier komen die drie modellen wel uit, maar hebben alle dezelfde score. Moet ik deze zoekactie in stukken hakken ofzo? Dus niet AGAINST ('design, plan, testing') maar per activity: AGAINST ('design') en AGAINST ('plan'). Dus in losse queries?

[ Voor 6% gewijzigd door nemesis_ op 02-09-2005 23:05 ]

Ook een cookie?


  • ripexx
  • Registratie: Juli 2002
  • Laatst online: 28-04 22:08

ripexx

bibs

Ten eerste is het handig als je de queries eens goed uitlijnt.

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT model.name, 
     MATCH(activity.name) AGAINST ('design, plan, testing') AS activity_score, 
     MATCH(user_role.name) AGAINST ('coach, trainer, management consultant') AS user_role_score 
FROM model, 
     activity, 
     user_role,
     model_activity, 
     model_user_role 
WHERE model.model_id = model_activity.model_id 
     AND activity.activity_id = model_activity.activity_id 
     AND model.model_id = model_user_role.model_id 
     AND user_role.user_role_id = model_user_role.user_role_id 
     AND MATCH(activity.name) AGAINST ('design, plan, testing') AS activity_score 
     AND MATCH(user_role.name) AGAINST ('coach, trainer, management consultant')

Ik zien niet in wat je hiermee wil bereiken. Je maakt nu een join naar 5 tabellen waarbij je op 2 tabellen met een fulltextsearch wil zoeken. Waarom versimpel je niet je query eerst, kijk wat de resultaten zijn en maak het dan pas complex.

[ Voor 6% gewijzigd door ripexx op 02-09-2005 22:36 ]

buit is binnen sukkel


  • nemesis_
  • Registratie: Mei 2003
  • Laatst online: 15-05-2024

nemesis_

I'm your enemy!

Topicstarter
Ik gebruik een aantal koppeltabellen (model_activity en model_user_role). Ik zou eigenlijk een join willen doen, maar daar ben ik niet heel erg in thuis.
Een model kan meerdere activities en user_roles hebben.
Hoe kan ik mijn query zo krijgen dat ik een join kan gebruiken (en de koppeltabellen dus niet nodig heb)? Ik heb het geprobeerd, maar kreeg van MySQL te horen (foutmelding) dat ik een niet-unieke alias gebruikte.
Query was iets als dit:
SQL:
1
2
3
4
5
6
7
8
SELECT model.name 
FROM model, 
     activity, 
     user_role,
     LEFT JOIN model ON model.activity_id = activity.activity_id
     LEFT JOIN model ON model.user_role_id = user_role.user_role_id
WHERE
     <eventueel iets>

Ook een cookie?


  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
moet dat AS activity_score op regel 13 daar wel staan?

  • ripexx
  • Registratie: Juli 2002
  • Laatst online: 28-04 22:08

ripexx

bibs

nemesis_ schreef op vrijdag 02 september 2005 @ 23:05:
Ik gebruik een aantal koppeltabellen (model_activity en model_user_role). Ik zou eigenlijk een join willen doen, maar daar ben ik niet heel erg in thuis.
Een model kan meerdere activities en user_roles hebben.
Hoe kan ik mijn query zo krijgen dat ik een join kan gebruiken (en de koppeltabellen dus niet nodig heb)? Ik heb het geprobeerd, maar kreeg van MySQL te horen (foutmelding) dat ik een niet-unieke alias gebruikte.
Query was iets als dit:
SQL:
1
2
3
4
5
6
7
8
SELECT model.name 
FROM model, 
     activity, 
     user_role,
     LEFT JOIN model ON model.activity_id = activity.activity_id
     LEFT JOIN model ON model.user_role_id = user_role.user_role_id
WHERE
     <eventueel iets>
Dit gaat fout omdat de tabel model twee maal gejoined wordt Een tabel meerdere malen gebruiken kanje doen door een alias te gebruiken.
SQL:
1
2
3
4
5
6
7
8
SELECT model.name 
FROM model, 
     activity, 
     user_role,
     LEFT JOIN model m1 ON m1.activity_id = activity.activity_id
     LEFT JOIN model m2 ON m2.user_role_id = user_role.user_role_id
WHERE
     <eventueel iets>

Maar deze query gaat niet werken, je join syntax is fout. Geef eens wat duidleijkere voorbeeldenmet wat voorbeeld data beschrijf dan eens goed wat je wil hebben en dan kanje verder kijken naar extra zaken als fulltext searches.
Genoil schreef op vrijdag 02 september 2005 @ 23:32:
moet dat AS activity_score op regel 13 daar wel staan?
Klopt, ik heb zijn orginele query alleen even wat handiger opgeschreven en er niet aan gedaan, in de where gebruikje geen alias voor een veld, dat doe je in het select deel.

[ Voor 8% gewijzigd door ripexx op 02-09-2005 23:53 ]

buit is binnen sukkel


  • nemesis_
  • Registratie: Mei 2003
  • Laatst online: 15-05-2024

nemesis_

I'm your enemy!

Topicstarter
Tabellen:
tabel models:
model_id (int auto_increment) primary key
title (varchar)

tabel consulting_activities:
consulting_activity_id (int auto_increment) primary key
name (varchar)

tabel user_roles:
user_role_id (int auto_increment) primary key
name (varchar)

table models_consulting_activities (koppeltabel):
model_id (int) primary key
consulting_activity_id (int) primary key

table models_user_roles (koppeltabel):
model_id (int) primary key
user_role_id (int) primary key

Voorbeelddata:
models:
model_id   title
1          Five Forces
2          Database model
3          Nine Marketing P's

consulting_activities:
consulting_acitvity_id     name
1                          analyse
2                          design
3                          plan
4                          implement
5                          coach

user_roles:
user_role_id    name
1               management consultant
2               process consultant
3               coach
4               interim manager
5               programme & project manager
6               trainer

models_consulting_activities (koppeltabel):
model_id        consulting_acitivity_id
1               1
1               2
2               4
3               1
3               3
3               5

models_user_roles (koppeltabel):
model_id        user_role_id
1               3
1               4
1               5
2               1
2               5
3               6


Eén model kan meerdere consulting_acitivities en user_roles hebben. Deze heb ik via de koppeltabellen proberen aan te geven.
De gebruiker krijgt een scherm voor zich waar er gekozen kan worden uit de verschillende consulting_activities en user_roles. Een gebruiker kan dus alleen kiezen, niets zelf invoeren.
Op de keuze-invoer van de gebruiker moet gezocht worden.
De gevonden modellen moeten op relevantie gerangschikt worden. (hoog -> laag)
Als er dus meer consulting_activities en user_roles gekozen worden, komen er steeds meer zoekresultaten. Het model dat het beste past bij de zoekcriteria moet dus bovenaan komen te staan.

Ik hoop dat je hier iets mee kan.

Ook een cookie?

Pagina: 1