使用MongoDB正则表达式和PHP搜索字符串中的多个参数
我正在尝试搜索我的集合,查找使用MongoDB正则表达式和PHP搜索字符串中的多个参数,php,regex,mongodb,Php,Regex,Mongodb,我正在尝试搜索我的集合,查找body属性包含所有搜索关键字的所有事件 示例字符串-“黑猫绝对是紫色的。” 关键词“黑色”、“紫色”将返回字符串 关键词“black”,“dog”将不返回该字符串 我一直在浏览一些主题和谷歌搜索,但似乎找不到合适的语法来实现这一点 目前,我正在获取一个由逗号分隔的关键字字符串,将其分解为一个数组,然后将其放入一个MongoRegex对象。我知道我的语法是关闭的,因为当我只发送一个关键字时,它就工作了,但当有多个关键字时,我不会得到任何我期望得到的结果 目前的做法:
body
属性包含所有搜索关键字的所有事件
示例字符串-“黑猫绝对是紫色的。”
关键词“黑色”、“紫色”
将返回字符串
关键词“black”,“dog”
将不返回该字符串
我一直在浏览一些主题和谷歌搜索,但似乎找不到合适的语法来实现这一点
目前,我正在获取一个由逗号分隔的关键字字符串,将其分解为一个数组,然后将其放入一个MongoRegex对象
。我知道我的语法是关闭的,因为当我只发送一个关键字时,它就工作了,但当有多个关键字时,我不会得到任何我期望得到的结果
目前的做法:
<?php
function search_topics($array)
{
include_once('config.php');
$collection = get_connection($array['flag']);
$x = 0;
$string = null;
$search_results = null;
$keywords = explode(',', $array['search']);
$end_of_list = count($keywords);
while ($x < $end_of_list)
{
$string = $string."/".$keywords[$x];
$x++;
if($x >= $end_of_list)
{
$string = $string."/i";
}
}
if ($string != null)
{
try
{
$regex_obj = new MongoRegex($string);
$cursor = $collection->find(array('body' => $regex_obj));
}
catch (MongoCursorException $e)
{
return array('error' => true, 'msg' => $e->getCode());
}
foreach($cursor as $post)
{
$search_results[] = $post;
}
if ($search_results != null && count($search_results) > 1)
{
usort($search_results, 'sort_trending');
}
return array('error' => false, 'results' => $search_results);
}
else
{
return array('error' => false, 'results' => null);
}
}
?>
因此,如果我在$array['search']
中发送字符串black
,我的对象将由/black/I
组成,并返回该字符串
如果我在$array['search']
中发送字符串black,cat
,则我的对象由/black/cat/I
组成,并返回null
有人能用这个正则表达式语法给我指出正确的方向吗
提前感谢您的帮助
Nathan我建议您使用MongoDB的文本搜索功能,而不是正则表达式,它专门针对以下情况: 您可以这样使用(在MongoDB shell上): 命令不会返回光标,而是返回一个文档,其中包含
结果
字段中的所有查询结果。对于最后一个搜索命令,结果为:
{
"queryDebugString" : "cat|purpl||||cat|purple||",
"language" : "english",
"results" : [
{
"score" : 2.25,
"obj" : {
"_id" : ObjectId("51f8db63c0913ecf728ff4d2"),
"string" : "The black cat is definitely purple."
}
}
],
"stats" : {
"nscanned" : 2,
"nscannedObjects" : 0,
"n" : 1,
"nfound" : 1,
"timeMicros" : 135
},
"ok" : 1
}
在PHP中,要使runCommand
打开文本搜索,您需要使用:
$client->database->command( array(
'setParameter' => 1,
'textSearchEnabled' => 1
) );
文本搜索本身为:
$client->database->command( array(
'text' => 'collectionName',
'search' => '"cat" AND "purple"'
) );
这里有一些关于匹配所有单词的问题:大多数情况下,这将用于返回多个文档。那么,既然您说它返回一个文档而不是光标,那么这种方法会起作用吗?当然,它返回一个文档,但是如果搜索查询找到这些结果,
results
字段当然会返回多个结果。也许您可以帮我提供最新的尝试和答案-
$client->database->command( array(
'text' => 'collectionName',
'search' => '"cat" AND "purple"'
) );