Mysql 是否在数据库中保留首字母缩略词中的句点?

Mysql 是否在数据库中保留首字母缩略词中的句点?,mysql,regex,Mysql,Regex,首字母缩略词是我数据库中的一个难题,尤其是在进行搜索时。我还没有决定在搜索查询期间是否接受句点。以下是我在搜索时面临的问题: “IRQ”将找不到“I.R.Q.” “I.R.Q”将找不到“IRQ” “IRQ.”或“IR.Q”将找不到“IRQ”或“I.R.Q.” 等等 同样的问题也适用于椭圆。。。或三个系列的周期 我只想知道在这个问题上我应该采取什么方向: 将字符串插入数据库时删除所有句点是否更好? 如果是这样的话,我可以用什么正则表达式来标识周期,而不是用椭圆或三个周期序列来标识需要删除的内容?

首字母缩略词是我数据库中的一个难题,尤其是在进行搜索时。我还没有决定在搜索查询期间是否接受句点。以下是我在搜索时面临的问题:

“IRQ”将找不到“I.R.Q.” “I.R.Q”将找不到“IRQ” “IRQ.”或“IR.Q”将找不到“IRQ”或“I.R.Q.” 等等

同样的问题也适用于椭圆。。。或三个系列的周期

我只想知道在这个问题上我应该采取什么方向:

将字符串插入数据库时删除所有句点是否更好? 如果是这样的话,我可以用什么正则表达式来标识周期,而不是用椭圆或三个周期序列来标识需要删除的内容? 如果可以将句点保留为首字母缩略词,那么如果我在搜索字段中输入“IRQ”,通过使用正则表达式的MySQL或我不知道的MySQL函数,如何在查询中编写脚本来查找“I.R.Q”?
你需要考虑你的投入的神圣性。如果它不是你可以改变的,那么就不要改变它。相反,您应该有一个单独的系统来允许文本搜索,并且可以根据需要修改文本,以便能够处理这些类型的问题


阅读Lucene,特别是Lucene的标准分析器,查看通常用来进行复杂文本搜索的变化类型。

你需要考虑输入的神圣性。如果它不是你可以改变的,那么就不要改变它。相反,您应该有一个单独的系统来允许文本搜索,并且可以根据需要修改文本,以便能够处理这些类型的问题

阅读Lucene,特别是Lucene的标准analyzer,查看为成功搜索复杂文本而通常进行的更改类型。

我认为您可以使用MySQL的REGEXP函数发送首字母缩写:

SELECT col1, col2...coln FROM yourTable WHERE colWithAcronym REGEXP "#I\.?R\.?Q\.?#"
如果使用PHP,可以通过以下简单循环构建regexp:

$result = "#";
foreach($yourAcronym as $char){
    $result.=$char."\\.?";
}
$result.="#";
我想您可以使用MySQL的REGEXP函数发送一个缩写:

SELECT col1, col2...coln FROM yourTable WHERE colWithAcronym REGEXP "#I\.?R\.?Q\.?#"
如果使用PHP,可以通过以下简单循环构建regexp:

$result = "#";
foreach($yourAcronym as $char){
    $result.=$char."\\.?";
}
$result.="#";

您正在搜索的功能是全文搜索。Mysql支持myisam表,但不支持innodb


或者,您可以选择提供该功能性的外部框架。Lucene是一种流行的开源软件

您正在搜索的功能是全文搜索。Mysql支持myisam表,但不支持innodb


或者,您可以选择提供该功能性的外部框架。Lucene是一种流行的开源软件

我对每个问题的回答:

将字符串插入数据库时删除所有句点是否更好? 是和否。您希望数据库具有原始文本。如果需要,请创建一个单独的字段,该字段将被清理以进行搜索。在这里,您可以删除句点,使所有内容都小写,等等

如果是这样的话,我可以用什么正则表达式来标识周期,而不是用椭圆或三个周期序列来标识需要删除的内容

/\+/

在给定的点上找到一个或多个周期的。但是你会想把它和你的搜索公式结合起来

注意:数据库上的正则表达式没有高性能。对此要谨慎

其他注意事项:您可能希望在MySQL中使用全文搜索。而且,对于超过1000个条目的数据集,这也不具有高性能。如果您有大数据并且需要全文搜索,请使用Sphinx作为MySQL插件和基于RAM的索引系统

如果可以将句点保留为首字母缩略词,那么如果我在搜索字段中输入“IRQ”,通过使用正则表达式的MySQL或我不知道的MySQL函数,如何在查询中编写脚本来查找“I.R.Q”?
是的,通过使用我在第一个项目答案中描述的两个字段

我对每个问题的回答:

将字符串插入数据库时删除所有句点是否更好? 是和否。您希望数据库具有原始文本。如果需要,请创建一个单独的字段,该字段将被清理以进行搜索。在这里,您可以删除句点,使所有内容都小写,等等

如果是这样的话,我可以用什么正则表达式来标识周期,而不是用椭圆或三个周期序列来标识需要删除的内容

/\+/

在给定的点上找到一个或多个周期的。但是你会想把它和你的搜索公式结合起来

注意:数据库上的正则表达式没有高性能。对此要谨慎

其他注意事项:您可能希望在MySQL中使用全文搜索。而且,对于超过1000个条目的数据集,这也不具有高性能。如果您有大数据并且需要全文搜索,请使用Sphinx作为MySQL插件和基于RAM的索引系统

如果可以将句点保留为首字母缩略词,那么如果我在搜索字段中输入“IRQ”,如何在查询中编写脚本以查找“I.R.Q”,通过使用regex的MySQL或可能是MySQL fu的MySQL 什么我不知道?
是的,通过使用我在第一个项目答案中描述的两个字段

有两种方法

1. save data -removing symbols from text and match accordingly,
2. you can make a regex ,like this for eg.

select * from table where acronym regexp '^[A-Z]+[.]?[A-Z]+[.]?[A-Z]+[.]?$';

但是,请注意,这要求首字母缩略词以大写形式存储。如果你不想让情况变得重要,只需将[A-Z]改为[A-Za-Z]。

有两种方法

1. save data -removing symbols from text and match accordingly,
2. you can make a regex ,like this for eg.

select * from table where acronym regexp '^[A-Z]+[.]?[A-Z]+[.]?[A-Z]+[.]?$';

但是,请注意,这要求首字母缩略词以大写形式存储。如果你不想让这个案子变得重要,就把[A-Z]改为[A-Za-Z]。

我认为这是一个好问题,不知道人们为什么投票关闭它。我认为这是一个好问题,也不知道人们为什么投票关闭它。我想把“数据库上的正则表达式不知道有高性能”扩展到更强“众所周知,数据库上的正则表达式性能低下”,这是因为它们在复杂的查询中强制执行线性表扫描或更糟的扫描。理论上有一些可优化的情况,但它们是可以在没有正则表达式的情况下处理的。但是有一个单独的“清理文本”列是一个很好的建议。现在想想,对于超过3000条记录,正则表达式肯定会影响性能。创建另一个列作为“cleaned”字符串是最好的方法。clean列将输入所有小写字母并删除重音符号和符号。我会扩展“数据库上的正则表达式不知道有高性能”对于更强大的“已知数据库上的正则表达式的性能较低”,这是因为它们强制执行线性表扫描或更糟糕的情况,并带有复杂的查询。理论上有一些可优化的情况,但它们是可以在没有正则表达式的情况下处理的。但是有一个单独的“清理文本”列是一个很好的建议。现在想想,对于超过3000条记录,正则表达式肯定会影响性能。创建另一个列作为“cleaned”字符串是最好的方法。clean列将输入所有小写字母并删除重音符号和符号。