【问题标题】:Will SOLR perform matching on the street name?SOLR 会在街道名称上执行匹配吗?
【发布时间】:2018-10-02 03:09:22
【问题描述】:

我有一个关于在 SOLR 中匹配街道名称的查询。

要匹配的实际街道名称是 POTTS ROAD EVANSFIELD VIC。我将数据存储在三个字段中:

street_name_clean : POTTSROADEVANSFIELDVIC
street_name_space : POTTS ROAD EVANSFIELD VIC
street_name : POTTS, ROAD, EVANSFIELD, VIC

这样存储数据的原因是我可以执行精确搜索、模糊搜索、ngram 搜索、近似匹配等。

我看到用户输入 POTTROAD(实际街道名称中缺少 S)并且我的所有搜索都失败的情况。

有没有一种技术可以将 POTTROAD 与上述数据相匹配?任何帮助表示赞赏。

【问题讨论】:

  • 一个词干分析器(或一个占有式过滤器或一个删除词尾s-es的模式替换过滤器)+一个ShingleFilter可能吗?词干分析器将删除 S,而 ShingleFilter 会将多个标记组合为一个标记 - 为您提供 POTTPOTTROADPOTTROADEVANSFIELD 等。根据用户的身份,您是否还有其他匹配失败的示例打字?结合模糊搜索的 ShingleFilter 可能也可以工作;如果您已将 POTTSROAD 编入索引,POTTROAD~1 应该会获得成功。
  • SingleFilter 看起来是个不错的选择。即使生成的令牌是 POTTS、POTTSROAD、POTTSROADEVANSFIELD 等(最后不删除 s'es),将其与模糊搜索结合起来可能会奏效。现在的问题是如何实现 ShingleFilter 来生成上面的令牌。

标签: search solr lucene


【解决方案1】:

感谢@MatsLindh 的建议,我实现了 ShingleFilter 如下:

<fieldType name="text_general_shingle" class="solr.TextField">
    <analyzer>
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.ShingleFilterFactory" maxShingleSize="4" outputUnigrams="false"/>
        <filter class="solr.PatternReplaceFilterFactory" pattern="(\s+)" replacement="" replace="all" />
    </analyzer>
</fieldType>

【讨论】:

    猜你喜欢
    • 2022-08-23
    • 2013-08-15
    • 2019-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    相关资源
    最近更新 更多