【问题标题】:SOLR WordDelimiterFilterFactorySOLR WordDelimiterFilterFactory
【发布时间】:2015-08-25 08:32:41
【问题描述】:

我使用 WordDelimiterFilterFactory 将具有数字的单词拆分为 solr 标记。例如单词 Php5 被拆分为两个标记 "PHP""5"。搜索时 SOLR 执行的请求是 q="php" 和 q =“5”。但是这个请求只找到带有 "5" 的偶数结果。我想要的是仅查找带有 "PHP5""PHP 5" 的文档。

如果有人有任何想法来解决这个问题,请。

希望清楚。

谢谢。

【问题讨论】:

  • 标记 generateNumberParts="0"。这不会拆分单词..
  • 好的,我要试试这个配置。谢谢你:)

标签: search solr numeric


【解决方案1】:

除了索引“php5”之外,您还需要获取 solr 以将“php 5”索引为单个标记。例如,这样搜索“php 5”将匹配,但搜索“blah 5”将不匹配。

我能够让它正常工作的唯一方法是使用Auto Phrasing filter by lucid works。

    <analyzer type="index">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.StopFilterFactory"
            ignoreCase="true"
            words="lang/stopwords_en.txt"
        />
        <filter class="com.lucidworks.analysis.AutoPhrasingTokenFilterFactory" phrases="autophrases.txt" includeTokens="true" replaceWhitespaceWith="_" />  
        <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
        <filter class="solr.WordDelimiterFilterFactory" splitOnNumerics="1" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1" preserveOriginal="1" />
        <filter class="solr.PorterStemFilterFactory"/>
        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
        <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
    </analyzer>
    <analyzer type="query">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.StopFilterFactory"
            ignoreCase="true"
            words="lang/stopwords_en.txt"
        />
        <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
        <filter class="solr.WordDelimiterFilterFactory" splitOnNumerics="1" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1" preserveOriginal="1"/>
        <filter class="solr.PorterStemFilterFactory"/>
        <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
    </analyzer>

同义词.txt

php5,php_5

protwords.txt(所以分隔符不会破坏它)

php5,php_5

您还必须更改查询解析器以使用 Lucid 解析器。

solrconfig.xml

<queryParser name="autophrasingParser" class="com.lucidworks.analysis.AutoPhrasingQParserPlugin" >
  <str name="phrases">autophrases.txt</str>
  <str name="replaceWhitespaceWith">_</str>
  <str name="ignoreCase">false</str>
</queryParser> 
<requestHandler name="/searchp" class="solr.SearchHandler">
    <lst name="defaults">
         <str name="echoParams">explicit</str>
         <int name="rows">10</int>
         <str name="df">Keywords</str>
         <str name="defType">autophrasingParser</str>
    </lst>
</requestHandler>  

autophrases.txt

php 5

过滤器可以在这里找到:https://github.com/LucidWorks/auto-phrase-tokenfilter

这篇文章也很有帮助:http://lucidworks.com/2014/07/02/automatic-phrase-tokenization-improving-lucene-search-precision-by-more-precise-linguistic-analysis/

【讨论】:

    【解决方案2】:

    此过滤器在单词分隔符处拆分标记。

    在您的情况下,您可以选择splitOnNumerics="0",这样就不会溢出数字。

    splitOnNumerics:

    (integer, default 1) 如果为0,则不拆分单词 从字母到数字的转换:"FemBot3000" -> "Fem", "Bot3000"

    确定分隔符的规则在下面的链接中确定

    https://cwiki.apache.org/confluence/display/solr/Filter+Descriptions#FilterDescriptions-WordDelimiterFilter

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-06
      • 2016-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-06
      相关资源
      最近更新 更多