Internationalization Xapian-搜索波兰字符(遇到问题?)

Internationalization Xapian-搜索波兰字符(遇到问题?),internationalization,xapian,Internationalization,Xapian,我使用xapian作为我网站的搜索引擎 最近我发现它不会搜索包含波兰特有字符的单词,如ś、ą、ć、ę 每当我试图搜索包含这些语言特定字符之一的单词时,它都不会返回任何结果。xapian中有任何编码设置吗 这些是我的索引和搜索功能($document有content、id和route字段) protectedfunction\u索引文档($document、$indexer、$database) { $doc=新文档(); $content=Zend_Json::encode($document)

我使用xapian作为我网站的搜索引擎

最近我发现它不会搜索包含波兰特有字符的单词,如ś、ą、ć、ę

每当我试图搜索包含这些语言特定字符之一的单词时,它都不会返回任何结果。xapian中有任何编码设置吗

这些是我的索引和搜索功能($document有content、id和route字段)

protectedfunction\u索引文档($document、$indexer、$database)
{
$doc=新文档();
$content=Zend_Json::encode($document);
$doc->set_data($content);
$indexer->set_文档($doc);
$indexer->index\u text($content);
$term=(字符串)md5($document['id']);
$doc->add_boolean_term($term);
$database->replace_文档($term,$doc);
返回true;
}
公共函数搜索文档($PHASE,$page=0,$limit=10)
{
$page=(int)$page;
$limit=(int)$limit;
$database=new-XapianDatabase($this->getDatabasePath());
$inquire=新Xapianinquire($database);
$qp=新的XapianQueryParser();
$stemmer=新XapianStem(“英语”);
$qp->set_stemmer($stemmer);
$qp->set_数据库($database);
$qp->set_steming_策略(XapianQueryParser::STEM_SOME);
$query=$qp->parse_query($phrase);
$inquire->set\u query($query);
$matches=$inquire->get_mset(($page-1)*$limit,$limit);
$documentCount=$matches->get_matches_estimated();
$i=$matches->begin();
$documents=array();
$rawDocuments=array();
而(!$i->equals($matches->end()){
$n=$i->get_rank()+1;
$data=$i->get_document()->get_data();
$documents[]=$this->_prepareDocument(Zend_Json::decode($data),$phrase);
$rawDocuments[]=Zend_Json::decode($data);
$i->next();
}
$pageCount=ceil($documentCount/$limit);
如果($page>0){
$prevPage=($page-1)*$limit;
}否则{
$prevPage=0;
}
如果($page<$pageCount){
$nextPage=($page+1)*$limit;
}否则{
$nextPage=$pageCount;
}
$result=array('results'=>$documents,'results raw'=>$rawDocuments,'paginator'=>array(
'page'=>$page',limit'=>$limit',pageCount'=>$pageCount,
“prevPage”=>$prevPage,“nextPage”=>$nextPage,
“documentCount”=>$documentCount));
返回$result;
}

Xapian本质上是一个二进制系统,所以它并不真正关心您在其中输入了什么。QueryParser(&TermGenerator)可以,但它们完全可以处理Unicode字符。如果您可以将其打包为一个更简单的代码示例,那么邮件列表将能够帮助您了解正在发生的事情。(将您在Python中所做的工作汇总成一个非常简短的版本对我来说效果很好,因此它不太可能与Xapian有任何关系。顺便问一句,您使用
$page-1
有什么原因吗?在您的代码中,默认情况下这是否定的。)该$page始终用0初始化。我的默认参数不好,但这并不重要。我的问题是使用json。我已经用serialize替换了json,现在它工作得很好。
protected function _indexDocument($document, $indexer, $database)
{
    $doc = new XapianDocument();
    $content = Zend_Json::encode($document);
    $doc->set_data($content);

    $indexer->set_document($doc);
    $indexer->index_text($content);
    $term = (string) md5($document['id']);
    $doc->add_boolean_term($term);
    $database->replace_document($term, $doc);
    return true;
}


public function searchDocuments($phrase, $page = 0, $limit = 10)
{
    $page = (int) $page;
    $limit = (int) $limit;

    $database = new XapianDatabase($this->getDatabasePath());
    $enquire = new XapianEnquire($database);
    $qp = new XapianQueryParser();
    $stemmer = new XapianStem("english");
    $qp->set_stemmer($stemmer);
    $qp->set_database($database);
    $qp->set_stemming_strategy(XapianQueryParser::STEM_SOME);
    $query = $qp->parse_query($phrase);

    $enquire->set_query($query);
    $matches = $enquire->get_mset(($page-1) * $limit, $limit);

    $documentCount = $matches->get_matches_estimated();

    $i = $matches->begin();
    $documents = array();
    $rawDocuments = array();
    while (!$i->equals($matches->end())) {
        $n = $i->get_rank() + 1;
        $data = $i->get_document()->get_data();
        $documents[] = $this->_prepareDocument( Zend_Json::decode($data), $phrase );
        $rawDocuments[]= Zend_Json::decode($data);
        $i->next();
    }

    $pageCount = ceil($documentCount / $limit);
    if ($page > 0) {
        $prevPage = ($page - 1) * $limit;
    } else {
        $prevPage = 0;
    }
    if ($page < $pageCount) {
        $nextPage = ($page + 1) * $limit;
    } else {
        $nextPage = $pageCount;
    }
    $result = array('results' => $documents, 'results-raw' => $rawDocuments, 'paginator' => array(
            'page' => $page, 'limit' => $limit, 'pageCount' => $pageCount,
            'prevPage' => $prevPage, 'nextPage' => $nextPage,
            'documentCount' => $documentCount));
    return $result;

}