Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Solr &引用;“受保护的短语”;在索尔_Solr_Stop Words_Dismax - Fatal编程技术网

Solr &引用;“受保护的短语”;在索尔

Solr &引用;“受保护的短语”;在索尔,solr,stop-words,dismax,Solr,Stop Words,Dismax,我的一个客户是一家专门从事新闻摄影(嗯,还有八卦)的摄影社,所以他们的许多客户的搜索都围绕着特定的人 我们索引了大约150万份文档,对标题和标题进行全文搜索;和全文搜索,而不在标签上添加词干。我们有一个合适的停止词列表,它们提供了一个受保护的词列表,它们认为词干不正确。 我们使用Demax搜索标题、标题和标签,有不同的增强功能) 这一切都很顺利 然而,事实证明,有些人很难做到正确。例如,阿尔·戈尔。在意大利语中,“al”是一个停止词,因此对“al gore”(不带引号)的简单查询变成: 这确实给

我的一个客户是一家专门从事新闻摄影(嗯,还有八卦)的摄影社,所以他们的许多客户的搜索都围绕着特定的人

我们索引了大约150万份文档,对标题和标题进行全文搜索;和全文搜索,而不在标签上添加词干。我们有一个合适的停止词列表,它们提供了一个受保护的词列表,它们认为词干不正确。 我们使用Demax搜索标题、标题和标签,有不同的增强功能) 这一切都很顺利

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

这确实给前副总裁带来了回响,当然还有“莱斯利·戈尔”和“蒂珀·戈尔”;而且,由于词干的缘故,对“Gori”的点击率更高。 撇开排序不谈,它确实会把结果弄得乱七八糟,我想做得更好

把搜索词用引号括起来也没用,“al”也会被去掉。 将“戈尔”标记为一个受保护的词让我走了一半,限制了误报的数量。 我也尝试过使用SynonymFilterFactory,但没有走得太远——我将SynonymFilterFactory作为第一个过滤器,所以“al”无论如何都会被删除

我认为我真正需要的是一种将“阿尔·戈尔”标记为单一标记的方式。对于一组可配置的“短语”,是否有任何东西允许我这样做? 有没有其他我忽略的方法?也许是solr.CommonGramsFilterFactory

更多背景信息:我们正在使用Solr1.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>

您查看过 它将:

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

我尝试了一种使用CommonGramsFilterFactory的方法;虽然我不完全相信这是最好的方法,但它确实有效。这也是为什么我暂时对此保持开放的原因——一方面希望得到一些我忽略的“最佳实践”答案,另一方面等待提出关于公共计划结果的硬数据。:)
<!-- 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>