繁体   English   中英

如何制作一个不区分大小写的部分文本搜索引擎,它使用带有 MongoDB 和 PHP 的正则表达式?

[英]How do I make a Case Insensitive, Partial Text Search Engine that uses Regex with MongoDB and PHP?

我正在尝试改进我的应用程序中的搜索栏。 如果用户现在在搜索栏中输入“泰坦”,应用程序将在每次我使用以下正则表达式 function 时从 MongoDB 检索电影“泰坦尼克号”:

require 'dbconnection.php';
if ($_SERVER["REQUEST_METHOD"] == "POST") {
   $input= $_REQUEST['input'];
$query=$collection->find(['movie' => new MongoDB\BSON\Regex($input)]);
}

我还可以通过在 Mongo shell 中创建以下索引来使 collections 不区分大小写,因此如果用户在搜索栏中键入“tiTAnIc”,应用程序将从 Z206E37108AF092FDAC771D12F 检索电影“泰坦尼克号”:

db.createCollection("c1", { collation: { locale: 'en_US', strength: 2 } } )
db.c1.createIndex( { movie: 1 } )

但是,我无法同时结合这两个功能。 当我将查询更改为此时,上面的索引只会删除区分大小写:

$query=$collection->find( [ 'movie' => $input] );

如果我将顶部的正则表达式查询与整理索引一起使用,它将忽略正则表达式部分,因此如果我输入“Titan”,它不会检索任何内容; 但是,如果我输入“泰坦尼克号”,它将成功检索“泰坦尼克号”(因为“泰坦尼克号”是存储在我的数据库中的确切单词)。

有什么建议吗?

注意:索引列上的正则表达式搜索会影响性能,如$regex docs所述:

不区分大小写的正则表达式查询通常不能有效地使用索引。 $regex 实现不支持排序规则,并且无法使用不区分大小写的索引。

您的问题是 MongoDB 在$regex上使用前缀(例如: /^acme/ )来查找索引。

对于区分大小写的正则表达式查询,如果字段存在索引,则 MongoDB 将正则表达式与索引中的值进行匹配,这可能比集合扫描更快。 如果正则表达式是“前缀表达式”,则可以进行进一步优化,这意味着所有可能的匹配都以相同的字符串开头。 这允许 MongoDB 从该前缀构造一个“范围”,并且仅匹配索引中落在该范围内的那些值。

所以需要这样改:

$query=$collection->find(['movie' => new MongoDB\BSON\Regex('^'.$input, 'i')]);

我建议你更仔细地设计你的收藏。

有关的:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM