【发布时间】:2021-02-27 23:53:07
【问题描述】:
我需要在弹性搜索中实现一个搜索功能,它的工作方式与 MySQL 'LIKE' 查询相同。
我在 PHP 中有以下代码
public function setUp($reference)
{
$parameter = DqlPartial::uniqueParameterName('reference');
$partial = $this->getBaseDqlPartial();
$partial->where("IFNULL(Asset.supplierReference, '') LIKE :$parameter");
$partial->setParameter($parameter, '%' . $reference . '%');
$this->addJoins($partial, $partial->getWhere());
$this->setDqlPartial($partial);
if (strpos($reference, "*") !== false) {
$termQuery = new SimpleQueryString($reference, ["supplierReference"]);
} else {
$termQuery = new MatchPhrase();
$termQuery->setField('supplierReference', $reference);
}
$eqPartial = new EqPartial();
$eqPartial->setQuery($termQuery);
$this->setEqPartial($eqPartial);
return $this;
}
您可以看到,如果搜索字符串在任何位置包含“*”,我正在执行 MatchPhrase 函数而不是简单查询。
问题是 MatchPhrase 是区分大小写的,我需要传递什么参数给这个函数才能让它表现得像 MySQL 中的一个简单的 LIKE 查询,像这样:
SELECT asset_id, asset_supplier_reference
FROM assets
WHERE asset_supplier_reference LIKE 'Opale%'
返回如下结果:Opale123、OPALE33、opaletest、opale_ 等。
我发现唯一接近的是fuzziness,我不喜欢它,因为它不精确,我需要与字符串开头完全匹配的东西(无论字母大小写如何)。
P.S 我正在改进一个已经存在的系统,我不知道为什么这行不通,因为我有这条线
$partial->setParameter($parameter, '%' . $reference . '%');
【问题讨论】:
标签: php mysql elasticsearch