如何使用n-gram与Solr近似匹配?

Rys*_*opa 9 lucene search solr approximate

我们有一个电影和连续剧数据库,由于数据来自不同可靠性的来源,我们希望能够对剧集的标题进行模糊字符串匹配.我们在我们的应用程序中使用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> 
Run Code Online (Sandbox Code Playgroud)

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

<field name="title" type="trigrams" 
    indexed="true" stored="true" multiValued="false" /> 
Run Code Online (Sandbox Code Playgroud)

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

我正在尝试的查询是类似的

title:"guy walks into a psychiatrist office"
Run Code Online (Sandbox Code Playgroud)

(有一两个错字)它应该与"Guy Walks into a Psychiatrist Office"匹配.

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

而且,我希望能够做更多事情.我想降低字符串,删除所有标点符号和空格,删除英语停用词,然后将字符串更改为三字符串.但是,只有在字符串被标记化后才应用过滤器...

提前感谢您的回答.

小智 9

要回答问题的最后部分:solr还有一个ngram过滤器.所以你不应该使用ngram tokenizer(例如像"WhitespaceTokenizer"之类的那个),应用所有pre-ngram过滤器,然后添加这个:

<filter class="solr.NGramFilterFactory" minGramSize="2" maxGramSize="3" />
Run Code Online (Sandbox Code Playgroud)


Rys*_*opa 4

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

<solrQueryParser defaultOperator="OR" />
Run Code Online (Sandbox Code Playgroud)

在我的架构定义中。

  • 你的回答看起来这个问题与 ngram 无关。我对吗? (5认同)
  • @RyszardSzopa ‘OR’ 与 n-gram 分析完全不同。“OR”给出了很多结果,但通常结果很糟糕。 (2认同)