我们有一个电影和连续剧的数据库,由于数据来自不同可靠性的来源,我们希望能够对剧集的标题进行模糊字符串匹配。我们在我们的应用程序中使用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”匹配。
(我不确定查询是否正确。)
此外,我希望能够做更多事情。我想 lowercace字符串,删除所有标点符号和空格,删除 英语停用词然后将字符串改为三字组。然而, 仅在字符串被标记化后才应用过滤器...
提前感谢您的回答。
答案 0 :(得分:9)
要回答问题的最后部分:solr还有一个ngram过滤器。所以你不应该使用ngram tokenizer(例如像“WhitespaceTokenizer”那样),应用所有pre-ngram过滤器然后添加这个:
<filter class="solr.NGramFilterFactory" minGramSize="2" maxGramSize="3" />
答案 1 :(得分:3)
解决方案结果非常简单:AND被设置为默认运算符,如果任何ngrams不匹配,则整个查询失败。所以,添加就足够了:
<solrQueryParser defaultOperator="OR" />
在我的架构定义中。