在这种情况下,我是否需要实施全文搜索?备择方案?

时间:2017-02-07 14:54:42

标签: sql postgresql symfony doctrine-orm full-text-search

我在表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)。

我问你的建议,你的平常帮助总是受到赞赏。感谢

1 个答案:

答案 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}来使所有内容不区分大小写适当的。