【问题标题】:Solr letter transformation / umlauts supportSolr 字母转换/变音符号支持
【发布时间】:2011-12-09 09:55:08
【问题描述】:

我正在使用 Solr 3.x,专注于德语文本,效果很好。 搜索元音变音 (öäüß) 也很有效。

问题是: 我收到了一些 80 年代后期的存档文本,大多数计算机/软件不支持超过 ASCII,尤其是不支持德语变音符号。 为此使用了另一种表示法:

ae instead of ä
oe instead of ö
ue instead of ü
ss instead of ß

也就是说,名称Müller 被保存为Mueller

回到 Solr,我现在需要查找包含 ue 的文档 - 即使用户搜索了 ü

示例:如果我想搜索来自名为Müller 的人的所有短信, Solr 必须找到带有MuellerMüller 的文本

我该如何处理?

这是一个足够的功能吗? --> http://wiki.apache.org/solr/UnicodeCollation(我不确定,如果我完全理解文档)

顺便说一句,通过“搜索和替换”来更改源文本不是一个选项:all oe to ö

【问题讨论】:

    标签: solr full-text-search transformation diacritics filterfactory


    【解决方案1】:

    正如 Paige Cook 已经指出的那样,您已经找到了 the relevant documentation,但由于并非每个 Solr 用户都了解 Java,因此我决定创建自己的答案,并提供更多细节。

    第一步是将过滤器添加到您的字段定义中:

    <fieldType>
      <analyzer>
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <!-- BEGIN OF IMPORTANT PART -->
        <filter class="solr.CollationKeyFilterFactory"
            custom="customRules.dat"
            strength="primary"
        />
        <!-- END OF IMPORTANT PART -->
      </analyzer>
    </fieldType>
    

    下一步是创建必要的customRules.dat 文件:

    您必须创建一个小型 Java 程序才能遵循文档。不幸的是,对于非 Java 程序员来说,这有点困难,因为代码 sn-p 只显示了重要的部分。它还使用了未随 JDK (Apache Commons IO) 分发的第三方库

    以下是在不使用外部库的情况下编写 customRules.dat 所需的完整 Java 7 代码:

    import java.io.*;
    import java.text.*;
    import java.util.*;
    
    public class RulesWriter {
        public static void main(String[] args) throws Exception {
            RuleBasedCollator baseCollator = (RuleBasedCollator) 
                    Collator.getInstance(new Locale("de", "DE"));
    
            String DIN5007_2_tailorings =
              "& ae , a\u0308 & AE , A\u0308"+
              "& oe , o\u0308 & OE , O\u0308"+
              "& ue , u\u0308 & UE , u\u0308";
    
            RuleBasedCollator tailoredCollator = new RuleBasedCollator(
                    baseCollator.getRules() + DIN5007_2_tailorings);
            String tailoredRules = tailoredCollator.getRules();
    
            Writer fw = new OutputStreamWriter(
                    new FileOutputStream("c:/customRules.dat"), "UTF-8");
            fw.write(tailoredRules);
            fw.flush();
            fw.close();
        }
    }
    

    免责声明:以上代码编译并创建了一个customRules.dat 文件,但我并没有实际使用Solr 测试创建的文件。

    【讨论】:

    • 哦,谢谢!!我安装了jdk1.7。下一步:我将您的文本写入一个名为RulesWriter.java 的文件并运行javac -RulesWriter.java。但是出现6个编译错误,像这样:RulesWriter.java:17: error: unreported exception ParseException; must be caught or declared to be thrown RuleBasedCollator tailoredCollator = new RuleBasedCollator(...我完全不知道该怎么办。创建这个customRules.bin 对于像我这样的java-noob 来说可能不是正确的项目! :-(
    • 啊,我只复制了 main 方法的内容,没有复制整个代码。请重试,第 7 行缺少throws Exception
    • 非常感谢您在此解决方案中花费的时间。 (+1)创建customRules.bin 在运行 Java 7 的 Windows PC 上运行良好。不幸的是,(Solr-Linux-)服务器运行 Java 1.6。是否可以在只有 Java 1.6 的服务器上使用 customRules.bin(使用 Java 7 创建)?我在问这个问题,因为CollationKeyFilterFactory 接缝无法正常工作。在 SOLR 中激活 CollationKeyFilterFactory 后,analyzes.jsp 输出与预期一样(如文档中的示例),但搜索结果 SOLR 很奇怪....
    • 我认为Java版本无关紧要,但直到您提出来我才真正考虑过。以防万一您想确定我修改了代码,以便它应该使用 Java 6 进行编译。(删除了 Java 7 资源管理的使用)
    • 在一个包含 300.000 个文档的测试用例中,搜索“merkel”会找到 299521 个文档,这看起来不是一个有效的结果。一个有效的结果是大约 1000-2000 个文档。如果我搜索一个随机字符串,比如“trasgew”,我会得到 299859 次点击,搜索“dddxxxxxdddddddd”会返回 35500 次点击 - 但我敢肯定,最后一个字符串在任何 300k 文档中都不存在。所以这里出了点问题。看起来有一个非常“强”的模糊搜索?!但是我没有更改字段定义,只是添加了必要的代码,你写的。 Trotzalledem herzlichen Dank & sch[ö|oe]nes WE
    【解决方案2】:

    根据我对您提供的 Unicode 排序功能链接的解释,这是绝对功能,因为它显示了如何解决您遇到的完全相同的问题

    看起来您将编写一点 Java 来生成适当的 customRules.dat 文件。

    【讨论】:

    • +1 同意,这就是解决方案。 (与其说是 Unicode 排序规则,不如说是自定义规则)
    • @Daniel Rikowski 和 Paige Cook:重点是,我根本不懂文档。我知道,我必须将CollationKeyFilterFactory 添加到字段定义中。但是customRules.dat 的内容/语法是什么?我对 Java 代码一无所知 - 我将 Lucene 与 Solr 和 PHP 结合使用:-/
    • @The Bndr:download.oracle.com/javase/7/docs/api/java/text/… 中描述了该格式,但这对您没有帮助,因为从头开始创建完整文件将是很多容易出错的工作。我添加了一个自己的答案,包括 working 代码来自己创建文件。 (不过,您需要亲自动手使用 Java)
    猜你喜欢
    • 2012-06-13
    • 1970-01-01
    • 1970-01-01
    • 2012-06-18
    • 1970-01-01
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    • 2019-03-03
    相关资源
    最近更新 更多