使用Solr搜索数字板

时间:2014-04-02 09:24:30

标签: search solr full-text-search solr4

我正在搜索包含大量铭牌记录的数据库。我打算使用Apache Solr来实现搜索功能。我不知道如何调用我想要实现的搜索功能。但是,让我向您解释我的要求:

当人们搜索时,我想让Solr为字母删除某些数字? 例如

12 = R

13 = B

4 = A

11 = H

等等?

因此,例如,当有人搜索“John”时,将提供搜索结果,应该从可用的车牌列表中获得以下建议。

JO11 NYJ - 搜索应该用11代替H!

例如,请查看http://www.privatenumberplates.com/list/JOHN

我不确定如何在Solr中完成这项任务,任何开始在Solr中处理此事的想法都会很棒!什么应该最适合使用?同义词,soundex,模糊或其他什么?应该使用哪些分析仪/词干库?

3 个答案:

答案 0 :(得分:2)

要转换数字>字母的PatternReplaceCharFilterFactory(每个转换需要覆盖一个)加上phonetic filter以匹配类似的发声字,可以作为起点。

您应该在索引和查询时执行此操作。这应该有用...但你可能希望'john'匹配'john'得分高于'jo11n'对吗?

因此,您应该使用复制字段来匹配(使用不同的提升)几个字段,一个原始字段,一个应用了数字 - >字母转换,一个应用了拼音过滤器,等等。您可以根据需要进行搜索。

您也可以编写自己的Analizer,但我会留待以后使用内置的Analizer不够好。

答案 1 :(得分:1)

我喜欢柿子的答案,我写的更详细一点。分析器可能如下所示:

<fieldType name="character_alias" class="solr.TextField">
    <analyzer>
        <charFilter class="solr.MappingCharFilterFactory" mapping="synonym_characters.txt" />
        <tokenizer class="solr.WhitespaceTokenizerFactory" />
        <filter class="solr.BeiderMorseFilterFactory" nameType="GENERIC" ruleType="APPROX" concat="true" languageSet="auto" />
    </analyzer>
</fieldType>

我选择了the MappingCharFilter而不是建议的PatternReplaceCharFilterFactory,因为它允许提供一个包含要替换的字符的列表。这更方便。

synonym_character.txt 可能如下所示

"11" => "H"
"12" => "R"
"4" => "A"

对于语音部分,我选择了the BeiderMorseFilter。虽然它是为姓氏而不是名字而制作的,但是当它与您链接的网站上的一小批样本一起运行时,它会提供相当好的结果:

+--+---------+----------+
|id|namePlate|score     |
+--+---------+----------+
|2 |john     |1.2513144 |
+--+---------+----------+
|3 |jo11n    |1.2513144 |
+--+---------+----------+
|4 |jon 52   |0.54745007|
+--+---------+----------+
|6 |107 jon  |0.54745007|
+--+---------+----------+
|8 |jon 52   |0.54745007|
+--+---------+----------+
|5 |40 jon   |0.4692429 |
+--+---------+----------+

答案 2 :(得分:0)

<fieldType name="character_alias" class="solr.TextField">
    <analyzer>
        <charFilter class="solr.MappingCharFilterFactory" mapping="synonym_characters.txt" />
        <tokenizer class="solr.WhitespaceTokenizerFactory" />
        <filter class="solr.BeiderMorseFilterFactory" nameType="GENERIC" ruleType="APPROX" concat="true" languageSet="auto" />
    </analyzer>
</fieldType>

使用这个我们可以映射

"H" => "11"
"4" => "A"
"8" => "A"
通过这种方式它也可以映射&#34; 4&#34; =&GT; &#34; 8&#34 ;.我不知道要避免这个问题。