Search 如何使用Solr的n-grams近似匹配?

Search 如何使用Solr的n-grams近似匹配?,search,lucene,solr,approximate,Search,Lucene,Solr,Approximate,我们有一个电影和系列的数据库,由于数据来自不同可靠性的许多来源,我们希望能够对剧集的标题进行模糊字符串匹配。我们在应用程序中使用Solr进行搜索,但是默认的匹配机制在单词级别上运行,这对于短字符串(如标题)来说不够好 我过去使用过n-grams近似匹配,我很高兴发现Lucene(和Solr)支持这种开箱即用的东西。不幸的是,我无法正确配置它 我假设我需要一个特殊的字段类型,所以我添加了 my schema.xml的以下字段类型: <fieldType name="trigrams"

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

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

我假设我需要一个特殊的字段类型,所以我添加了 my 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> 
(有一两个打字错误)并且应该和“盖伊走进精神科医生办公室”匹配

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

此外,我希望能够做更多的事情。我想 降低字符串的间距,删除所有标点符号和空格,删除 用英语停止单词,然后将字符串转换成三叉戟。然而, 过滤器仅在字符串标记化后应用


提前感谢您的回答。

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

<solrQueryParser defaultOperator="OR" />


在我的模式定义中。

回答您问题的最后一部分:solr还有一个ngram过滤器。因此,您不应使用ngram标记器(但应使用类似“WhitespaceTokenizer”的标记器),应用所有预ngram过滤器,然后添加此过滤器:

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


你能发布你正在使用的查询吗?我编辑了这个问题以包含一个示例查询。你的回答让人觉得这个问题与ngrams无关。我说得对吗?@RyszardSzopa
显然不同于n-gram分析
给出了很多结果,但通常都是非常糟糕的结果。
<solrQueryParser defaultOperator="OR" />
<filter class="solr.NGramFilterFactory" minGramSize="2" maxGramSize="3" />