我有这段代码搜索广告系列名称:
function test_search() {
$mySforceConnection = new SforceEnterpriseClient();
$mySoapClient = $mySforceConnection->createConnection( 'soapclient/wsdl_dev.jsp.xml' );
$mylogin = $mySforceConnection->login( USERNAME_TEST, PASSWORD_TEST . SECURITY_TOKEN_TEST );
$campaign_name = 'A \& B Campaign';
$search = 'FIND {' . $campaign_name . '} IN NAME FIELDS RETURNING CAMPAIGN(ID)';
$searchResult = $mySforceConnection->search( $search );
$campaign_id = $searchResult->searchRecords[0]->Id;
echo '<pre dir="ltr">';
var_dump( $searchResult );
var_dump( $campaign_id );
echo '</pre>';
error_log( '$searchResult: ' . print_r( $searchResult, true ) );
}
test_search();
我得到的输出是一个广告系列ID,当我转到显示广告系列一切正常的页面时,它会显示我正在寻找的内容。
现在,如果我改变了这个:
$campaign_name = 'A \& B Campaign';
进入这个:
$campaign_name = 'A \- B Campaign';
并运行函数test_search()
,我仍然获得相同的广告系列ID,我希望搜索查询能够做出区分!
知道为什么会这样,以及如何解决?
谢谢, 乌迪德
答案 0 :(得分:2)
SOSL是一个全文搜索引擎(我已经在某处使用Apache Solr在后台阅读)。它会从您的短语中搜索单词,但您没有指定完全匹配(将该术语包含在引号中,FIND {"A \- B Campaign"}
)。它试图变得聪明,跳过太短的单词,在英语语法中考虑不同的后缀等等......它是一个模糊的匹配引擎。
或许您需要的是普通的旧SELECT语句? SELECT Id FROM Campaign WHERE Name LIKE '%A & B Campaign%'
?如果您只需要1个对象而且只有名称字段...(它将是我记忆中的查询()方法,而不是搜索())
如果您有权访问您的SF组织,那么只需直接在其开发者控制台中进行实验 - &gt;查询编辑器例如