我使用版本为6.4.1的Solr服务器。
我需要搜索可能包含-_.
等规范符号的字段。但与此同时,我需要有机会找到没有这些符号的实体。
例如,值为G2-5SG
。我应该在接下来的查询中找到它:G2 5SG
,G2-5SG
,G25SG
。
我有以下类型的配置:
<analyzer type="index">
<charFilter class="solr.PatternReplaceCharFilterFactory" pattern="(\w+)([-_.\s])" replacement="$1"/>
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="16"/>
</analyzer>
<analyzer type="query">
<charFilter class="solr.PatternReplaceCharFilterFactory" pattern="(\w+)([-_.\s])" replacement="$1"/>
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
使用规范符号搜索工作正常。但是当我尝试在没有符号的情况下搜索单词时,服务器返回一个空集。
对于索引G2 5SG
和查询G25SG
,分析器中的值被标记为令人满意。
答案 0 :(得分:1)
有一件事可行:
答案 1 :(得分:0)
您可以使用
<tokenizer class="solr.StandardTokenizerFactory"/>
此标记生成器将文本字段拆分为标记,将空格和标点符号视为分隔符。
而不是
<tokenizer class="solr.KeywordTokenizerFactory"/>
此标记生成器将整个文本字段视为单个标记。
您可以尝试下面的内容。
<fieldtype name="subword" class="solr.TextField">
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.WordDelimiterFilterFactory"/>
<filter class="solr.FlattenGraphFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.KeywordTokenizerFactory"/>
</analyzer>
</fieldtype>
有关详细信息,请参阅标记程序页面Tokenizers