PHP Zend Lucene进行搜索;“不区分重音”;如「;不区分大小写“;

PHP Zend Lucene进行搜索;“不区分重音”;如「;不区分大小写“;,php,zend-framework,lucene,diacritics,Php,Zend Framework,Lucene,Diacritics,所以我用Zend_search_Lucene为一个网站做了一个搜索引擎 我目前正在使用Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8_Casefensitive,它可以很好地区分重音字符和非重音字符 在谷歌(和其他搜索引擎)中,当你搜索“χιονι”时,它将返回它的所有变体的结果,比如“χιόνι”,这是希腊语的正确重音版本(χιόνι=snow btw)。在lucene中(一般来说,不仅仅是Zend_Search_lucene),这并不是我所看

所以我用Zend_search_Lucene为一个网站做了一个搜索引擎

我目前正在使用Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8_Casefensitive,它可以很好地区分重音字符和非重音字符

在谷歌(和其他搜索引擎)中,当你搜索“χιονι”时,它将返回它的所有变体的结果,比如“χιόνι”,这是希腊语的正确重音版本(χιόνι=snow btw)。在lucene中(一般来说,不仅仅是Zend_Search_lucene),这并不是我所看到的默认行为,甚至不是捆绑行为

我对解决方案的第一次尝试是像lucene对不区分大小写的搜索分析器所做的那样,从字母中删除重音,就像不区分大小写的分析器在索引和搜索过程中简单地将所有内容都小写一样(即$str=strtrtrtr($str,'972;,'959;'))

失败的唯一原因是php没有mb_strtr,strtr不能处理这样的多字节字符,preg_replace也不能工作

有没有一种方法可以让lucene在“不区分重音”模式下搜索(可能是一个分析器?),或者有一种方法可以在php中搜索不相关的多字节字符(我也搜索过,但没有结果)


请注意,我要搜索的不是西欧口音的字符,web上有一些不适用于php的解决方案

您是否尝试过normalizer\u normalize从文本中删除变音符号:

您还可以使用
$str=iconv('UTF-8','ASCII//TRANSLIT//IGNORE',$str)

然后,您可以创建一个令牌过滤器(通过扩展Zend_Search_Lucene_Analysis_TokenFilter)来规范化关键字


我不知道它是否适用于您的编码。

这个精确的解决方案不起作用,因为它将每个“特殊”字符转换为问号(?),但转换为“UTF-7//Translatit//IGNORE”看起来可以,我将尽快执行一些测试。normalizer\u normalize和normalizer::normalize都不能在我的系统上工作,因为某些原因,我找不到任何安装它的软件包,ubuntu 11.10,仅出于这个原因,我不会研究它,即使它看起来可以工作。iconv的结果因平台而异。在Windows上,它使用libiconv,在Unix上使用glibc。还有: