本文概述
- 实现
- 用法
- 了解soundex的工作原理
为了即使输入拼写错误也能匹配结果, 我们也可以使用SOUNDEX本机MySQL函数来捕获它们。在本文中, 你将学习如何在Symfony项目中实现Soundex在理论上的用法。
注意:本教程适用于Symfony 2.x和Symfony3.x。
实现首先, 请在捆绑包的根文件夹中找到自己, 并创建一个名为Extensions的文件夹(或根目录/ src), 然后在名为Doctrine的内部创建一个文件夹。在doctrine文件夹中创建一个名为SoundexFunction.php的新类, 并将以下代码保存在其中。
不要忘记根据项目中的位置更改名称空间。
<
?php/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */namespace ourcodeworld\Extensions\Doctrine;
use Doctrine\ORM\Query\AST\Functions\FunctionNode;
use Doctrine\ORM\Query\Lexer;
/** * SoundexFunction ::= "SOUNDEX" "(" StringPrimary ")" */class SoundexFunction extends FunctionNode{public $stringExpression = null;
public function parse(\Doctrine\ORM\Query\Parser $parser){$parser->
match(Lexer::T_IDENTIFIER);
$parser->
match(Lexer::T_OPEN_PARENTHESIS);
$this->
stringExpression = $parser->
StringPrimary();
$parser->
match(Lexer::T_CLOSE_PARENTHESIS);
}public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker){return 'SOUNDEX(' .$this->
stringExpression->
dispatch($sqlWalker) .')';
}}
该类将允许你在查询中使用SOUNDEX语句, 而不会引发任何错误, 例如:
[语法错误]错误:预期的已知功能, 得到了’ SOUNDEX’
现在, 该类已存在于我们的项目中, 但尚未注册。为了使用它, 我们需要在我们的项目的config.yml文件中注册该函数, 只需进入主义区域, 然后将SOUNDEX属性和类路径保存在ORM的dql属性中即可。
# app/config/config.yml # Doctrine Configurationdoctrine:# Search for the ORM propertyorm:# Those values should be already in your file and this doesn't matterauto_generate_proxy_classes: "%kernel.debug%"naming_strategy: doctrine.orm.naming_strategy.underscoreauto_mapping: true# We need this the dql property to register the custom doctrine functions :dql:string_functions:# Match agains should have the path to the SOUNDEX class created in the previous stepSOUNDEX: myBundle\Extensions\Doctrine\SoundexFunction
你已经准备好出发了!如果你在产品环境中工作, 请清除缓存, 让我们创建一些查询。
用法SOUNDEX子句可供使用, 你可以在查询生成器或纯DQL中使用它。
<
?php class LandingController extends Controller{public function indexAction(Request $request){$em = $this->
getDoctrine()->
getManager();
$repository = $em->
getRepository('myBundle:Entity');
$results = $repository->
createQueryBuilder('a')->
where("SOUNDEX(a.table_field) LIKE SOUNDEX(:search)")// To use SOUNDEX with another methods like MATCH_AGAINST// You can use the orWhere('SOUN....') clause instead of where// In case that you don't want to use parameter, you can set directly the string into the query//->
where("SOUNDEX(a.table_field) LIKE SOUNDEX('%Title to search mispillid%')")->
setParameter('search', '%Title to search mispillid%')->
getQuery()->
getResult();
dump($results);
}}
请注意, 我们使用%text%来匹配包含该文本的所有记录。如果需要, 你不需要使用通配符。
了解soundex的工作原理给定数据库中的下表(带有实体Breed):
ID | 名称 |
---|---|
1 | 阿芬平彻 |
2 | 阿拉斯加雪橇犬 |
3 | 大狗梗 |
4 | 秋田 |
5 | 澳大利亚牧羊犬 |
用户输入 | 预期结果 |
---|---|
阿芬平 | 1-阿芬平彻 |
阿拉斯加雪橇犬 | 2-阿拉斯加雪橇犬 |
Airdale梗 | 3-大狗梗 |
阿基塔 | 4-秋田 |
澳大利亚牧羊犬 | 5-澳大利亚牧羊犬 |
select 'text', soundex('text');
结果将得到下表:
文本 | SOUNDEX(“ 文字” ) |
文本 | T230 |
文本 | SOUNDEX(“ 文字” ) |
文本 | T230 |
【如何使用Doctrine和Symfony 3实现Soundex搜索(在MySql中)】玩得开心 !
推荐阅读
- 如何使用LFTP脚本使用LFTP(sftp)下载远程目录
- 如何解决Ubuntu 16.04中的Plesk安装/升级错误(系统中没有/etc/localtime文件)
- 如何在AWS Ubuntu 16.04实例上以root身份允许SSH和SFTP访问
- 在Plesk中创建MySQL Server数据库的非增量(逻辑备份)自动备份外壳脚本(sh)
- logstash|使用Logstash将MySQL数据导入Elasticsearch
- 如何在Mac上找到Android SDK Manager路径
- Android向后兼容性
- 虽然不建议安装Android Studio SDK组件()
- Android SDK下载作为Gradle Build的一部分