Solr tokenizer基于字典

时间:2014-07-03 01:53:54

标签: solr lucene

我想使用 WhitespaceTokenizer 和自定义用户词典对Solr上的字段进行标记。例如:

输入:纽约是美国人口最多的城市。

分析结果:"纽约","人口稠密","城市","美国"

鉴于自定义词典包含"纽约"和#34;美国"所以这些术语不会像其他术语一样解析为令牌。

我搜索了提供的标记器库,但仍然没有找到完美的匹配。

2 个答案:

答案 0 :(得分:1)

首先,虽然我不了解您的要求,但仅使用phrase query(如content:"New York")似乎很有可能在此处达到您的目的。在这种情况下,适当的查询构造绝对是更容易的解决方案。


除此之外,您可以在分析链中使用CommonGramsFilter

CommonGramsFilter会将公共克分割为单独的标记,并适当设置位置增量以允许正确的短语搜索,允许您根据查询中的内容搜索单个标记或克。您需要传递Set或以这种方式处理的条款。有关如何使用一组自定义过滤器定义分析仪,请参阅example in the Analyzer documentation

要将其合并到StandardAnalyzer,我可能会将其放在StopAnalyzer之前(即:StandardTokenizer - > StandardFilter - > {{ 1}} - > LowercaseFilter - > CommonGramsFilter)。

请记住,使用此过滤器时,必须使用其他分析器来解析查询。确保在建立索引时使用StopFilter,并在使用queryparser查询时使用CommonGramsFilter

所以,最后,你可能会有:

CommonGramsQueryFilter

答案 1 :(得分:0)

其中一个可能的选择是使用WordDelimiterFilterFactory进行实际的标记化,并提供一个带有受保护单词列表的文本文件,并将其传递给受保护的参数。

受保护单词列表中显示的单词列表不会被拆分为子标记。

要使其正常工作,您可能需要使用KeywordTokenizerFactory作为标记器。

示例:

  <fieldType name="prottext" class="solr.TextField" indexed="true" stored="true" positionIncrementGap="100">
        <analyzer>
              <tokenizer class="solr.KeywordTokenizerFactory"/>
              <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="0" catenateWords="0" catenateNumbers="0" catenateAll="0" preserveOriginal="0" protected="protwords.txt"/>
              <filter class="solr.LowerCaseFilterFactory"/>
        </analyzer>
  </fieldType>

有关详细信息,请参阅:https://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.WordDelimiterFilterFactory

查看受保护参数的用法。