我正在尝试搜索我的集合,查找body
属性包含所有搜索关键字的所有事件。
示例字符串 - "The black cat is definitely purple."
关键字"black", "purple"
将返回字符串。
关键字"black", "dog"
会不返回该字符串。
我一直在搜索一些主题和谷歌搜索,但似乎找不到合适的语法来做到这一点。
目前,我正在使用逗号分隔的一串关键字,将其展开为数组,然后将其放入MongoRegex Object
。我知道我的语法是关闭的,因为当我只发送一个关键字时它可以工作,但是当有多个关键字时,我没有得到任何我期望得到的结果。
当前方法:
<?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);
}
}
?>
因此,如果我在black
中发送字符串$array['search']
,我的对象就会形成/black/i
并返回该字符串。
如果我在black,cat
中发送字符串$array['search']
,我的对象就会形成/black/cat/i
并返回null
。
有人能用这种正则表达式语法指向我正确的方向吗?
提前感谢您的帮助!
森
答案 0 :(得分:3)
我建议你不要使用正则表达式来代替MongoDB的文本搜索功能,它专门用于这样的情况:http://docs.mongodb.org/manual/core/text-search/
您可以像这样使用它(在MongoDB shell上):
use admin
db.runCommand( { setParameter: 1, 'textSearchEnabled' : 1 } );
use test
db.so.ensureIndex( { string: 'text' } );
db.so.insert( { string: "The black cat is definitely purple." } );
db.so.runCommand( 'text', { search: '"cat" AND "dog"' } )
db.so.runCommand( 'text', { search: '"cat" AND "purple"' } )
命令不返回游标,而是返回包含results
字段中所有查询结果的一个文档。对于最后一个搜索命令,结果为:
{
"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"'
) );