我正在搜索包含大量铭牌记录的数据库。我打算使用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,模糊或其他什么?应该使用哪些分析仪/词干库?
答案 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 ;.我不知道要避免这个问题。