Ik heb in m'n classlibrary 2 zoek-classes, 1 die gebruik maakt van MySQL fulltext en 1 gebasseerd op good-old LIKE. Aangezien fulltext automatisch een relevantie aan de resultaten toekent, wil ik dat in m'n 'LikeSearch' ook. Ik vond met Google de volgende 2 links:
http://groups.google.com/...e&rnum=1#39b6d97aada7db15
http://www.alegsa.com.ar/...%20scores%20by%20hand.php
Die laatste is een PHP script van iemand die het geprobeerd heeft na te bouwen op basis van hetgene wat in de eerste link wordt verteld. Maar ik geloof niet dattie het helemaal goed heeft gedaan. Dus ik heb het zelf ook in elkeaar gezet op deze manier:
$objects zijn alle zoekresultaten
$object is 1 zoekresultaat
Ik heb e.e.a. voorlopig ff versimpeld door maar op 1 woord te zoeken dus qcount is altijd 1. Die harrie die zelf ook een PHP implementatie had gemaakt, had van qcount hetzelfde gemaakt als sumw1, dus daar klopte sowieso geen hout van.
Werkt allemaal wel en de resultaten lijken ok. Maar wanneer ik dan m'n 'FullTextSearch' gebruik, krijg ik totaal verschillende waarden. Dat is me verder niet zo'n zorg, maar als je de resulaten nou zou gaan sorteren op m'n zelfberekende score, is de volgorde compleet anders dan met de echte fulltext search
Ik vraag me af of er hier nog mensen zijn die zelf ook met dit soort algoritmes aan het stoeien zijn geweest of zien waarom mijn algoritme andere resultaten oplevert...
http://groups.google.com/...e&rnum=1#39b6d97aada7db15
http://www.alegsa.com.ar/...%20scores%20by%20hand.php
Die laatste is een PHP script van iemand die het geprobeerd heeft na te bouwen op basis van hetgene wat in de eerste link wordt verteld. Maar ik geloof niet dattie het helemaal goed heeft gedaan. Dus ik heb het zelf ook in elkeaar gezet op deze manier:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
| function setupRelevancy(& $objects, & $params, $keyword) { $sumw1 = 0; for($n = 0; $n < count($objects); $n++) { $plainText = ""; foreach ($params["columns"] as $field) { $contents = str_replace("-", " ", strtolower(strip_tags($objects[$n]->$field))); $contents = preg_replace("/[^a-z0-9\s]/", "", $contents); $plainText.= $contents." "; } $dcount = substr_count($plainText, $keyword); $objects[$n]->w1 = log((float)$dcount) + 1; $objects[$n]->uniq = sizeof(array_flip(str_word_count($plainText, 1))); $sumw1 += $objects[$n]->w1; } $params["sumw1"] = $sumw1; $params["found"] = count($objects); $params["qcount"] = 1; $tableName = $params["table"]; $r = mysql_query("SELECT count(*) AS rows FROM ".$tableName." LIMIT 1"); $rowCountResult = mysql_fetch_object($r); $params["rows"] = $rowCountResult->rows; } function calculateRelevancy($object, $params) { /*------------------------------------------------------------------------------------------------------------------------ Explanation of integer variables: 1) $w1 = intermediate weight 2) $dcount = number of times word is present in document (or query row) 3) $sumw1 = sum of all values of $w1 found 4) $uniq = number of unique words in the document (or query row) 5) $rows = total number of rows in the table 6) $found = number of rows in the table that contain the word in question (@sizeof($result)) 7) $qcount = number of times this word is present in the query ------------------------------------------------------------------------------------------------------------------------*/ $w1 = $object->w1; $uniq = $object->uniq; $sumw1 = $params["sumw1"]; $found = $params["found"]; $rows = $params["rows"]; $qcount = $params["qcount"]; $score = (float)($w1 / $sumw1 * $uniq / (1 + 0.0115 * $uniq) * log((float)(($rows - $found) / $found)) * $qcount); return $score; } |
$objects zijn alle zoekresultaten
$object is 1 zoekresultaat
Ik heb e.e.a. voorlopig ff versimpeld door maar op 1 woord te zoeken dus qcount is altijd 1. Die harrie die zelf ook een PHP implementatie had gemaakt, had van qcount hetzelfde gemaakt als sumw1, dus daar klopte sowieso geen hout van.
Werkt allemaal wel en de resultaten lijken ok. Maar wanneer ik dan m'n 'FullTextSearch' gebruik, krijg ik totaal verschillende waarden. Dat is me verder niet zo'n zorg, maar als je de resulaten nou zou gaan sorteren op m'n zelfberekende score, is de volgorde compleet anders dan met de echte fulltext search

Ik vraag me af of er hier nog mensen zijn die zelf ook met dit soort algoritmes aan het stoeien zijn geweest of zien waarom mijn algoritme andere resultaten oplevert...