目前,我的搜索查询仅搜索完全匹配和正确的顺序。但是我需要的话语顺序并不重要。

例如,
新闻标题:内马尔转投PSG。
我在下一次搜索中得到正确的结果


内马尔PSG
内马尔飞往PSG


但我没有结果:


PSG内马尔


这是我的代码:

// Create search tearm partial
$searchTerms = explode(' ', $this->query->getTerm());
$searchTermPartial = '';
foreach($searchTerms as $searchTerm) {
    $searchTermPartial = $searchTermPartial . '%' . $searchTerm .'%';
}

//Search part in Query
    ->andWhere(
        $queryBuilder->expr()->orX(
            $queryBuilder->expr()->like(
                $queryBuilder->expr()->concat('translation.title', $queryBuilder->expr()->concat(
                    $queryBuilder->expr()->literal(' '), 'translation.shortDescription')), ":searchTermPartial"),
            $queryBuilder->expr()->eq('o.code', ":searchTerm")
        )


如何使单词顺序不重要?

最佳答案

这是您的$ searchTermPartial的内容

//%PSG%%Neymar%


我有这样的桌子

CREATE TABLE public.rol
(
  id integer NOT NULL,
  role character varying(255) NOT NULL,
  CONSTRAINT rol_pkey PRIMARY KEY (id)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE public.rol
  OWNER TO postgres;


角色字段的值是[PSG Neymar,Neymar PSG,PSG,Neymar](4行)

当我执行以上内容的查询时,这就是结果


  查询select * from rol where role like '%PSG%%Neymar%'
  
  结果1;“ PSG Neymar”


问题是您在构建错误的参数时应采用这种方式:

    foreach ($searchTerms as $key => $term) {
//.....
                $qb->andWhere($qb->expr()->like('r.role', ':term' . $key))
                    //.....
                    ->setParameter('term' . $key, '%' . $term . '%');
//.....
            }


上面的代码将输出以下查询

select * from rol where role like '%PSG%' and role like '%Neymar%'


结果

1;“ PSG Neymar”

2;“内马尔PSG”

如果使用orWhere()选项,则可以获得四个记录。

希望能帮助到你

09-18 16:44