【问题标题】:Search Number Plates using Solr使用 Solr 搜索车牌
【发布时间】:2014-05-13 11:19:05
【问题描述】:

我正在搜索一个包含大量车牌记录的数据库。我打算使用 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、模糊还是其他?应该使用哪些分析器/词干库?

【问题讨论】:

  • 当我搜索John 时,它还应该匹配什么?它还应该匹配JohnJo11n 和...吗?
  • 您可以在 UI 端修改此查询。例如。当用户输入 John - 您创建这样的查询 q=title:John OR title:Jo11n OR title:Jo11* (类似这样)。所以我的想法是,您需要在搜索端进行此操作
  • @cheffe 是的,它应该匹配 John 和 Jo11n 以及其他听起来像 John 的术语。
  • @Mysterion 你的想法很酷!但我想看看我们是否可以在尝试您的建议之前从 Solr 方面获得结果。您是否检查了我在原始描述中提供的示例站点?
  • @Krunal,是的。我已经检查了这个网站。

标签: search solr full-text-search solr4


【解决方案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>

使用这个我们可以映射

"H" => "11"
"4" => "A"
"8" => "A"

以这种方式它也映射“4”=>“8”。我不知道要避免这个问题。

【讨论】:

    【解决方案2】:

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

    <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 |
    +--+---------+----------+
    

    【讨论】:

    • 感谢您为我指明正确的方向。非常感谢您的帮助。
    【解决方案3】:

    多个PatternReplaceCharFilterFactory 用于转换数字->字母(每个转换需要覆盖一个)加上phonetic filter 以匹配发音相似的单词可以作为起点。

    您应该在索引时和查询时都这样做。这应该可行...但是您可能希望 'john' 匹配 'john' 的分数高于 'jo11n' 对吧?

    因此,您应该使用复制字段来匹配(使用不同的提升)几个字段,一个原始字段,一个应用了数字->字母转换的字段,一个应用了语音过滤器的字段,等等。您可以随心所欲地获得。

    您也可以编写自己的分析器,但我会把它留到以后,以防使用内置的分析器不够好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-28
      • 2013-05-02
      • 1970-01-01
      • 2017-03-26
      • 1970-01-01
      • 1970-01-01
      • 2011-03-24
      相关资源
      最近更新 更多