【问题标题】:How to use n-grams approximate matching with Solr?如何使用与 Solr 的 n-gram 近似匹配?
【发布时间】:2010-11-21 11:57:55
【问题描述】:

我们有一个电影和连续剧数据库,并且由于数据来自许多不同可靠性的来源,我们希望能够对剧集的标题进行模糊字符串匹配。我们在应用程序中使用 Solr 进行搜索,但默认匹配机制在单词级别上运行,这对于短字符串(如标题)来说不够好

我过去使用过 n-gram 近似匹配,我很高兴发现 Lucene(和 Solr)支持开箱即用的东西。不幸的是,我无法正确配置它。

我认为我需要一个特殊的字段类型,所以我添加了 将字段类型添加到我的 schema.xml:

<fieldType 
   name="trigrams" 
   stored="true" 
   class="solr.StrField"> 
 <analyzer type="index"> 
   <tokenizer 
       class="solr.analysis.NGramTokenizerFactory" 
       minGramSize="3" 
       maxGramSize="5" 
       /> 
   <filter class="solr.LowerCaseFilterFactory"/> 
 </analyzer> 
</fieldType> 

并将架构中的相应字段更改为:

<field name="title" type="trigrams" 
    indexed="true" stored="true" multiValued="false" /> 

但是,这并没有像我预期的那样工作。查询分析看起来 正确,但我没有得到任何结果,这让我相信 在索引时间发生了一些事情(即标题被索引为 默认字符串字段而不是 trigram 字段)。

我正在尝试的查询类似于

title:"guy walks into a psychiatrist office"

(有一两个错字)并且应该匹配“Guy Walks into a Psychiatrist Office”。

(我不确定查询是否正确。)

此外,事实上,我希望能够做更多的事情。我想 小写字符串,删除所有标点符号和空格,删除 英语停用词,然后将字符串更改为三元组。然而, 过滤器仅在字符串被标记后应用...

提前感谢您的回答。

【问题讨论】:

  • 您可以发布您正在使用的查询吗?
  • 我编辑了问题以包含示例查询。

标签: search lucene solr approximate


【解决方案1】:

解决方案非常简单:AND 被设置为默认运算符,如果任何 ngram 不匹配,则整个查询失败。因此,添加以下内容就足够了:

<solrQueryParser defaultOperator="OR" />

在我的架构定义中。

【讨论】:

  • 您的回答使后验问题似乎与 ngram 无关。我说的对吗?
  • @RyszardSzopa OR 显然与 n-gram 分析不同。 OR 给出了很多结果,但通常结果很差。
【解决方案2】:

回答你问题的最后一部分:solr 还有一个 ngram 过滤器。所以你不应该使用 ngram 分词器(例如“WhitespaceTokenizer”),应用所有 pre-ngram 过滤器,然后添加这个:

<filter class="solr.NGramFilterFactory" minGramSize="2" maxGramSize="3" />

【讨论】:

    猜你喜欢
    • 2010-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多