我有一个包含类似单词列表的数据库。我需要得到类似的单词,我正在尝试这种方法来获得每个相似的词:
例如,为了找到像" EL"这样的类似单词,我正在使用此查询:
SELECT * FROM `words` WHERE word LIKE 'el' OR word LIKE '%el' OR word LIKE '%el%' OR word LIKE '%e%l%'
它只返回一个结果,这不是我想要的结果。但是,如果我使用multi_query和多个查询,如:
SELECT * FROM `words` WHERE word LIKE 'el';
SELECT * FROM `words` WHERE word LIKE '%el';
SELECT * FROM `words` WHERE word LIKE '%el%';
SELECT * FROM `words` WHERE word LIKE '%e%l%';
要获取这些,我使用:
if ($con->multi_query($query)) {
do {
/* almacenar primer juego de resultados */
if ($result = $con->store_result()) {
while ($row = $result->fetch_row()) {
printf("%s\n", $row[0]);
}
$result->free();
}
/* mostrar divisor */
if ($con->more_results()) {
printf("-----------------\n");
}
} while ($con->next_result());
}
/* cerrar conexión */
$con->close();
这些是我得到的(示例/类似)结果:
EL,埃斯皮内尔,EL,车轮,埃斯皮内尔,轮子
它会得到所有可能的结果。当然我需要过滤重复项,但我会得到它们。
对于单个查询,我使用:
$result = $con->query($query);
$row = mysqli_fetch_row($result);
但是我认为多次查询和过滤会比单次查询花费更多时间,因此我正在寻找一种方法来获取单个查询的所有结果,甚至更好,而不会创建所有可能的字符串变体。
答案 0 :(得分:0)
如上所述,您只需要运行最后一个查询。为了获得所需的结果顺序(相关性),您需要通过php实现该逻辑。
$keyword = 'Your search term';
function getRelevance($value,$keyword){
$value = strtolower($value);
$keyword = strtolower($keyword);
$index = strpos($value, $keyword);
$word_index = strpos($value, ' '.$keyword);
if($index==0) // first word starts with keyword
return 3;
else if($word_index!==false) // any word starts with keyword
return 2;
else if($index!==false) // keyword matches anywhere
return 1;
else
return 0;
}
$keyword = mysqli_real_escape_string($con, $keyword); // prevent SQL injection
$res = $con->query("SELECT * FROM words WHERE `word` LIKE '%$keyword%'");
$words = array();
while($line = $res->fetch_assoc()){
$line['relevance'] = getRelevance($line['word'],$keyword); // assign relevance value based on the "el" query and the elements word
$words[] = $line;
}
function compareRelevance($a,$b){
return $b['relevance'] - $a['relevance'];
}
usort($words,'compareRelevance');
这将从'单词'中获取所有匹配的条目。表并根据搜索词对它们进行排序。