【问题标题】:PHP Zend Lucene make search "accent-insensitive" as in "case-insensitive"PHP Zend Lucene 使搜索“不区分重音”,就像“不区分大小写”一样
【发布时间】:2012-03-06 16:17:17
【问题描述】:

所以我正在使用 Zend_Search_Lucene 为网站制作搜索引擎

我目前正在使用 Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8_CaseInsensitive,它工作正常,除了一件事:它区分重音字符和非重音字符

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

我对解决方案的第一次尝试是像 lucene 对不区分大小写的搜索所做的那样 - 分析器,从字母中删除重音符号,就像不区分大小写的分析器在索引和搜索期间简单地将所有内容变为小写一样(即 $str = strtr($ str, 'ό', 'ο'))

这失败的唯一原因是因为 php 没有 mb_strtr 并且 strtr 不适用于这样的多字节字符,而 preg_replace 也不起作用

有没有办法在“重音不敏感”模式下进行 lucene 搜索(可能是分析器?),或者在 php 中不重音多字节字符的方法(我也对此进行了搜索但没有结果)?

请注意,我要搜索的不是西欧重音字符,网上有一些针对 php 的非重音解决方案

【问题讨论】:

    标签: php zend-framework lucene diacritics


    【解决方案1】:

    您是否尝试过 normalizer_normalize 从文本中删除变音符号:How to remove diacritics from text?

    你也可以使用$str = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $str);

    然后您可以创建一个标记过滤器(通过扩展 Zend_Search_Lucene_Analysis_TokenFilter)来规范您的关键字。

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

    【讨论】:

    • 这个确切的解决方案不起作用,因为它将每个“特殊”字符转换为问号 (?) 但转换为 'UTF-7//TRANSLIT//IGNORE' 看起来它可以工作,我将尽快进行一些测试
    • ps。出于某种原因,normalizer_normalize 和 Normalizer::normalize 在我的系统上都不起作用,我找不到任何要安装它的软件包,ubuntu 11.10,仅出于这个原因,即使它看起来可以工作,我也不会研究它
    • iconv 的结果因平台而异。在 Windows 上,它使用 libiconv,在 Unix 上,使用 glibc。还有转译:derickrethans.nl/projects.html#translit
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-26
    • 2015-04-22
    • 2016-10-22
    • 2017-06-30
    • 1970-01-01
    • 2011-03-31
    • 1970-01-01
    相关资源
    最近更新 更多