【问题标题】:"protected phrase" in SolrSolr 中的“保护短语”
【发布时间】:2011-06-30 07:53:17
【问题描述】:

我的一个客户是一家专门从事新闻摄影(以及八卦)的摄影机构,因此他们的许多客户的搜索都围绕特定的人。

我们索引了大约 150 万份文档,对标题和标题进行全文搜索;和全文搜索,而无需基于标签。我们有一个不错的停用词列表,它们提供了一个他们认为没有正确词干的受保护词列表。 我们正在使用 Dismax 搜索标题、标题和标签,并有不同的提升) 这一切都很好。

但是,事实证明,有些人很难做到正确。例如,阿尔·戈尔。在意大利语中,“al”是一个停用词,因此对“al gore”(不带引号)的简单查询变为:

+((DisjunctionMaxQuery((caption_text:gor | tags_text:gore^100.0 | headline_text:gor)))~1) ()

这确实为前副总裁带来了成功,当然也为“Lesley Gore”和“Tipper Gore”带来了回报;而且,由于词干,“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>

【问题讨论】:

    标签: solr stop-words dismax


    【解决方案1】:

    你看过CommonGramsFilterFactory 它将:

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

    【讨论】:

    • 我确实尝试了一种使用 CommonGramsFilterFactory 的方法;它确实有效,尽管我并不完全相信这是最好的方法。这也是我暂时保持开放的原因——部分是希望得到一些“最佳实践”的答案来回答我忽略的一些问题,部分是等待拿出关于 CommonGrams 结果的硬数据。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-12
    • 1970-01-01
    • 2019-07-09
    • 2013-06-27
    • 2013-09-09
    • 1970-01-01
    相关资源
    最近更新 更多