索尔的“受保护的短语”

时间:2011-02-19 10:22:01

标签: solr stop-words dismax

我的一位客户是一家专门从事新闻摄影(好吧和八卦)的摄影机构,所以他们的许多客户的搜索都围绕着特定的人。

我们索引约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>

1 个答案:

答案 0 :(得分:1)

您是否查看了CommonGramsFilterFactory 它会:

  • 将多个令牌合并为一个 令牌
  • 通常在搜索包含停用词的短语时使用