我在表first_name和last_name(PostgreSQL)中有两列。
在前端,我有一个输入,允许用户搜索人。它是一个自动完成的字段,它调用Web服务以按姓氏和/或姓氏搜索人员。
目前,我已经进行了查询(使用我的查询构建器):
$searches = preg_split('/\s+/', $search);
if (!empty($search)) {
$orX = $query->expr()->orX();
$i = 0;
foreach ($searches as $value) {
$orX->add($query->expr()->eq('c.firstName', ':name'.$i));
$orX->add($query->expr()->eq('c.lastName', ':name'.$i));
$query->setParameter('name'.$i, $value);
$i++;
}
$query->andWhere($orX);
}
但是这个查询并不像它所要求的那么精确,它对每个单词使用OR,所以如果我正在寻找“Rasmus Lerdorf”,它也会给我“Rasmus Adams”和“Adel Lerdorf”。它仅在我输入单个单词(例如“Rasmus”)时才有效,在这种情况下,它为所有人提供了“Rasmus”作为first_name或last_name。
我读到了MATCH AGAINST,但我正在使用PostgreSQL。我也听说过PostgreSQL中的全文搜索功能相当于MATCH AGAINST,但我想知道实现全文搜索对于这样的目标是否有点过分(特别是两列中的最大字数不会超过4)。
我问你的建议,你的平常帮助总是受到赞赏。感谢
答案 0 :(得分:0)
您不需要全文搜索。
只需使用AND而不是OR添加不同的搜索字词:
$i = 0;
foreach ($searches as $value) {
$orX = $query->expr()->orX();
$orX->add($query->expr()->eq('c.firstName', ':name'.$i));
$orX->add($query->expr()->eq('c.lastName', ':name'.$i));
$query->setParameter('name'.$i, $value);
$i++;
$query->andWhere($orX);
}
我还建议使用LIKE而不是相等比较(将'%'添加到用户搜索词的开头和结尾),并且可能还会通过添加{{1}来使所有内容不区分大小写适当的。