如何使用正克近似匹配使用Solr?(How to use n-grams approximate m

2019-08-02 00:35发布

我们有电影和电视剧的数据库,并作为数据来自不同的可靠性的来源很多,我们希望能够做到对事件的标题模糊字符串匹配。 我们使用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" /> 

但是,这是行不通的,因为我的预期。 查询分析看起来正确,但我没有得到任何结果,这使我相信,事情发生在索引时间(即标题被索引像一个默认字符串场,而不是卦场)。

我想查询是一样的东西

title:"guy walks into a psychiatrist office"

(有一个错字或两个),并应符合“人走入精神病医生办公室”。

(我真的不知道,如果查询是正确的。)

此外,我希望能够做更多的事情,其实。 我想lowercace字符串,删除所有标点符号和空格,删除停用词的英语,然后更改串入卦。 然而,过滤器应用于字符串已经被符号化后,才...

在此先感谢您的回答。

Answer 1:

要回答你的问题的最后一部分:Solr中也有一个NGRAM过滤器。 所以,你不应该使用NGRAM分词器(但一个像“WhitespaceTokenizer”为例),适用于所有NGRAM前置过滤器,然后添加这一项:

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


Answer 2:

该解决方案被证明是非常简单的:并设置为默认操作,如果任何n元语法的不匹配,整个查询失败。 所以,这足以补充:

<solrQueryParser defaultOperator="OR" />

在我的模式定义。



文章来源: How to use n-grams approximate matching with Solr?