我们从事代理业务,对于我们的客户,要满足某些业务需求,我们会更改一些字段信息并将其发送给Solr(版本5.5.4)。下面是Solr端特定字段的Solr schema.xml配置。
<fieldType name="text_general_no_norm" class="solr.TextField" positionIncrementGap="100" omitNorms="true">
<analyzer type="index">
<filter class="solr.ASCIIFoldingFilterFactory"/>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<filter class="solr.ASCIIFoldingFilterFactory"/>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
如上所述,在某些特殊情况下,我们会遇到以下情况:这些字段(field1,field2等)的值可以采用CJK模式。这意味着field1,field2存储纯英语文本或 CJK文本。因此,在选择StandardTokenizer的情况下,在索引/查询时它必须处理纯英文文本时可以很好地工作,而在CJK文本中则不能正常工作。
当使用当前配置索引CJK文本时,它将中断每个字符(有时也将多个字符配对)并对其进行索引。举个例子 如果我们将文本编入索引
field1:“맯뭕禅玸킆諘叜葸”,根据 StandardTokenizer 逻辑, 玸禅禅玸葸并在其中索引。
稍后,当我们在具有相似文字的相同字段中进行搜索时- q:field1:“맯뭕禅玸킆諘叜葸”,它给出的结果也与它无关。我们的假设是,当Lucene中断并构建多个令牌进行查询时,它将对所有令牌执行“或”运算。因此,来自(맯或뭕或禅玸或叜或葸或葸)的任何单个令牌都将显示任何记录,它将作为结果返回该记录。
我们还尝试了 LetterTokenizer ,但在许多情况下,它的行为与 StandardTokenizer 不同。我们还尝试了复制字段选项,但是由于应用程序层确定CJK令牌并在运行时更改查询不够灵活,因此也不可行。
请提出任何索引或查询的方法,以便我们可以过滤不相关的结果。
谢谢。