diff --git a/modules/feature-search-didyoumean.php b/modules/feature-search-didyoumean.php index e9b4de5..02f68fb 100644 --- a/modules/feature-search-didyoumean.php +++ b/modules/feature-search-didyoumean.php @@ -40,6 +40,7 @@ register_module([ if(module_exists("feature-cli")) { cli_register("didyoumean", "Query and manipulate the didyoumean index", function(array $args) : int { + global $settings; if(count($args) < 1) { echo("didyoumean: query and manipulate the didyoumean index Usage: @@ -47,7 +48,8 @@ Usage: Subcommands: rebuild Rebuilds the didyoumean index - correct {word} Corrects {word} using the didyoumean index (careful: it's case-sensitive and operates on transliterated text *only*) + correct {word} Corrects {word} using the didyoumean index (careful: the index is case-sensitive and operates on transliterated text *only*) + lookup {word} Looks up {word} in the didyoumean index and displays all the (unsorted) results. "); return 0; } @@ -57,12 +59,25 @@ Subcommands: search::didyoumean_rebuild(); break; case "correct": - search::didyoumean_load(); if(count($args) < 2) { echo("Error: Not enough arguments\n"); return 1; } - echo("Correction: ".search::didyoumean_correct($args[1])."\n"); + $correction = search::didyoumean_correct($args[1]); + if($correction === null) $correction = "(nothing found)"; + echo("Correction: $correction\n"); + break; + case "lookup": + if(count($args) < 2) { + echo("Error: Not enough arguments\n"); + return 1; + } + search::didyoumean_load(); + $results = search::$didyoumeanindex->lookup( + $args[1], + $settings->search_didyoumean_editdistance + ); + var_dump($results); break; } @@ -324,18 +339,6 @@ class BkTree { return $stack; } - /** - * Convenience function that returns just the first result when looking up a string. - * @param string $string The string to lookup - * @param integer $distance The maximum edit distance to search. - * @return string|null The first matching string, or null if no results were found. - */ - public function lookup_one(string $string, int $distance = 1) : ?string { - $result = $this->lookup($string, $distance, 1); - if(empty($result)) return null; - return $result[0]; - } - /** * Generator that walks the BK-Tree and iteratively yields results. * Note that the returned array is *not* sorted. diff --git a/modules/lib-search-engine.php b/modules/lib-search-engine.php index c28c08d..c500b29 100644 --- a/modules/lib-search-engine.php +++ b/modules/lib-search-engine.php @@ -86,7 +86,7 @@ class search * Only populated if the feature-search-didyoumean module is present. * @var BkTree */ - private static $didyoumeanindex = null; + public static $didyoumeanindex = null; /** * The transliterator that can be used to transliterate strings. @@ -670,26 +670,26 @@ class search "exact" => $exact // If true then we shouldn't try to autocorrect it ]; } - // Correct typos, but only if that's enabled if(module_exists("feature-search-didyoumean") && $settings->search_didyoumean_enabled) { - foreach($result["terms"] as $term_data) { - if($term_data["exact"] || // Skip exact-only - $term_data["weight"] < 1 || // Skip stop & irrelevant words - self::invindex_term_exists($term_data["term"])) continue; + $terms_count = count($result["terms"]); + for($i = 0; $i < $terms_count; $i++) { + if($result["terms"][$i]["exact"] || // Skip exact-only + $result["terms"][$i]["weight"] < 1 || // Skip stop & irrelevant words + self::invindex_term_exists($result["terms"][$i]["term"])) continue; // It's not a stop word or in the index, try and correct it // self::didyoumean_correct auto-loads the didyoumean index on-demand - $correction = self::didyoumean_correct($term_data["term"]); + $correction = self::didyoumean_correct($result["terms"][$i]["term"]); // Make a note if we fail to correct a term if(!is_string($correction)) { - $term_data["corrected"] = false; + $result["terms"][$i]["corrected"] = false; continue; } - $term_data["term_before"] = $term_data["term"]; - $term_data["term"] = $correction; - $term_data["corrected"] = true; + $result["terms"][$i]["term_before"] = $result["terms"][$i]["term"]; + $result["terms"][$i]["term"] = $correction; + $result["terms"][$i]["corrected"] = true; } }