我想使用 WhitespaceTokenizer 和自定义用户词典对Solr上的字段进行标记。例如:
输入:纽约是美国人口最多的城市。
分析结果:"纽约","人口稠密","城市","美国"
鉴于自定义词典包含"纽约"和#34;美国"所以这些术语不会像其他术语一样解析为令牌。
我搜索了提供的标记器库,但仍然没有找到完美的匹配。
答案 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
查看受保护参数的用法。