Php 在Apache Solr中处理德国UMLAUT
我对ApacheSolr是新手。我正在使用SolrPHP客户端在Solr和我的PHP web应用程序之间进行交互 我面临的问题是德国乌姆劳特人。每当我尝试搜索包含umlaut字符的字符串时,Solr都会抛出一个异常,如下所示:Php 在Apache Solr中处理德国UMLAUT,php,apache,solr,Php,Apache,Solr,我对ApacheSolr是新手。我正在使用SolrPHP客户端在Solr和我的PHP web应用程序之间进行交互 我面临的问题是德国乌姆劳特人。每当我尝试搜索包含umlaut字符的字符串时,Solr都会抛出一个异常,如下所示: exception 'Apache_Solr_HttpTransportException' with message ''400' Status: Bad Request' in C:\SolrPhpClient\Apache\Solr\Service.php:338
exception 'Apache_Solr_HttpTransportException' with message ''400' Status: Bad Request'
in C:\SolrPhpClient\Apache\Solr\Service.php:338
Stack trace: #0 C:\SolrPhpClient\Apache\Solr\Service.php(1170):
Apache_Solr_Service->_sendRawGet('http://localhost...') #1 C:\Apache24\htdocs\MyProject\results.php(42):
Apache_Solr_Service->search('f?r', 0, 10) #2 {main}
如您所见,德语für显示为f?r
我试图用iconv和htmlentities来隐藏它,但它们返回false或empty
这是我的代码:
$query = "für"; //string with German umlaut
try {
//instantiate a Solr object
$solr = new Apache_Solr_Service(SOLRHOST, SOLRPORT, SOLRNAME);
// Check if Solr is running
if (!$solr->ping()) {
echo 'Solr service not responding!';
exit;
}
// I have tried these functions
// $query = iconv("UTF-8", "ISO-8859-15//TRANSLIT",$query);
// $query = htmlentities($query,ENT_QUOTES,'UTF-8');
//run the query
$results = $solr->search($query, 0, 10); // exception occurs here
$numDocs = $results->response->numFound;
$docs = $results->response->docs;
// Check if there are any results
if (empty($numDocs) || $numDocs <= 0) {
print_r($docs);
echo "No records found!!";
} else {
echo ("No. of docs:".$numDocs."<br/>");
print_r($docs);
echo "records found!!";
}
} catch (Exception $e) {
$log->error($e->getMessage());
echo($e->__toString());
}
如果您收到消息400,那么日志中的Solr端应该有一条真正的错误消息。看看上面说的,它应该为你指明正确的方向
另外,比较直接从管理UI搜索文本和从PHP代码搜索文本时生成的查询。您可以看到差异并确定故障所在。是否可以添加完整的错误消息?在C中的错误请求之后,您可能已经切断了一个有趣的部分。嗨,切夫,我已经更新了上面的错误消息。嗨,亚历克斯,是的,我检查了,但是Solr没有显示任何错误。另外,在Solr管理中,我尝试查询相同的文本für,并得到了期望的结果。我只是在php端查询时出错。您在Solr端是否有任何信息表明您从php到Solr的整个过程中都得到了错误?如果不是的话,也许你是在打不同的东西。如果所有其他操作都失败,您可以运行Wireshark之类的程序,查看PHP在线路上实际写了什么,并将其与工作请求进行比较。但您需要指向与localhost不同的主机。例如example.com。或者使用Runscope.com,它会返回一个错误,但至少您会看到查询。