Ik wil graag even een oplossing tegen het licht van wat meer experts houden, omdat ik betwijfel of het wel de meest optimale en juiste is. Het gaat om een searchindex die ik zelf heb aangelegd, omdat de fulltext searchindex van mysql zelf me niet bevalt.
Hier is een zwaar versimpeld voorbeeld van een te indexeren tabel:
documents
de index ziet er dan zo uit:
Hoe maak je nu een generieke query om op meerdere velden tegelijk te matchen? Bijvoorbeeld: de query is "a b"; hoe ziet de query eruit die lijdt tot de juiste antwoorden: 1 + 2? Met andere woorden: wat zijn de d_id's die zowel een field "a" als een field "b" in de index hebben?
Wat ik nu heb gedaan is dit:
met daarachter steeds een JOIN:
wat voor 2 delen (a EN b) resulteert in de volgende query:
Dit werkt goed, en doordat je per zoek-deel je ook 1 deel aan de query toe kunt voegen, is dit makkelijk in je programmatuur te plaatsen. Ik heb behoorlijk wat af gegoogled, maar heb nergens kunnen vinden of dit nou de ideale manier is om een dergelijke query op te pakken. Als je een OR wil in de query wordt het trouwens een stuk eenvoudiger om een query te maken (gewoon met een WHERE field IN (<query parts>)) maar dat is nu even niet aan de orde. Dus mijn vraag; is dit een goede manier, of zijn er betere manieren om dit te doen?
Hier is een zwaar versimpeld voorbeeld van een te indexeren tabel:
documents
d_id | text |
---|---|
1 | a b c |
2 | a b |
3 | a |
de index ziet er dan zo uit:
field | d_id |
---|---|
1 | a |
1 | b |
1 | c |
2 | a |
2 | b |
3 | a |
Hoe maak je nu een generieke query om op meerdere velden tegelijk te matchen? Bijvoorbeeld: de query is "a b"; hoe ziet de query eruit die lijdt tot de juiste antwoorden: 1 + 2? Met andere woorden: wat zijn de d_id's die zowel een field "a" als een field "b" in de index hebben?
Wat ik nu heb gedaan is dit:
code:
1
| SELECT * FROM documents d |
met daarachter steeds een JOIN:
code:
1
| JOIN document_index as di ON d.d_id=di.d_id AND di.field='<query part>' |
wat voor 2 delen (a EN b) resulteert in de volgende query:
code:
1
2
3
| SELECT * FROM documents d JOIN document_index as di1 ON d.d_id=di1.d_id AND di1.field='a' JOIN document_index as di2 ON d.d_id=di2.d_id AND di2.field='b' |
Dit werkt goed, en doordat je per zoek-deel je ook 1 deel aan de query toe kunt voegen, is dit makkelijk in je programmatuur te plaatsen. Ik heb behoorlijk wat af gegoogled, maar heb nergens kunnen vinden of dit nou de ideale manier is om een dergelijke query op te pakken. Als je een OR wil in de query wordt het trouwens een stuk eenvoudiger om een query te maken (gewoon met een WHERE field IN (<query parts>)) maar dat is nu even niet aan de orde. Dus mijn vraag; is dit een goede manier, of zijn er betere manieren om dit te doen?