我的一位客户是一家专门从事新闻摄影(好吧和八卦)的摄影机构,所以他们的许多客户的搜索都围绕着特定的人。
我们索引约150万份文件,标题和标题上有全文搜索;和全文搜索,不会出现在标签上。我们有一个很好的停用单词列表,它们提供了一个他们认为没有正确阻止的受保护单词列表。 我们正在使用Dismax来搜索标题,标题和标签,并进行不同的提升) 这一切都很好。
但是,有些人证明要做对是很棘手。例如,戈尔。在意大利语中“al”是一个停用词,因此对“al gore”(不带引号)的简单查询变为:
+((DisjunctionMaxQuery((caption_text:gor | tags_text:gore^100.0 | headline_text:gor)))~1) ()
对于前副总裁来说,这确实会回击,但当然也会为“莱斯利戈尔”和“自卸车戈尔”提供回击;而且,由于词干,点击“Gori”等等。 暂且不排序,它会使结果混乱,我想做得更好。
用引号括住搜索词无济于事,“al”无论如何都会被剥夺。 将“gore”标记为受保护的单词会让我在那里中途,限制误报的数量。 我也尝试过使用SynonymFilterFactory,但没有走得太远 - 我将SynonymFilterFactory作为第一个过滤器,所以“al”无论如何都会被删除。
我认为我真正需要的是一种将“al gore”标记为单个标记的方法。对于一组可配置的“短语”,有什么东西可以让我这样做吗? 我还有另一种方法吗? solr.CommonGramsFilterFactory也许?
更多背景信息:我们正在使用Solr 1.4.0。 schema.xml的相关部分
<!-- used for headline and caption -->
<fieldType name="text" class="solr.TextField" omitNorms="false">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.it.txt"/>
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.SnowballPorterFilterFactory" language="Italian" protected="protwords.txt"/>
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.it.txt"/>
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.SnowballPorterFilterFactory" language="Italian" protected="protwords.txt"/>
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
</fieldType>
<fieldType name="tagsText" class="solr.TextField" sortMissingLast="true" omitNorms="false">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.it.txt"/>
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.it.txt"/>
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
</fieldType>