我们的 solr 字段中的数据如下所示:
<str name="property_Info_Hd">320 GB SATA 7200RPM</str>
<str name="property_Info_Hd">320GB SATA</str>
<str name="property_Info_Memory">4 GB of DDR2</str>
<str name="property_Info_Memory">2GB of DDR3</str>
该字段是动态的(“property_*”),因此两种情况都使用相同的分析器。
目前,当搜索“2GB”时,它会返回包含“2GB”的文档,但会丢失“2 GB”(空格)。
问题是:如何在架构中设置此字段类型,以便它匹配带空格和不带空格的结果?
例如:
搜索 +(property_Info_Memory:("320gb")) 应返回上面的两行,匹配“320GB”AND“320 GB”。
这是设置字段类型的方式:
<fieldType name="textFilter" class="solr.TextField"
positionIncrementGap="100">
<analyzer>
<tokenizer class="solr.KeywordTokenizerFactory" />
<filter class="solr.WordDelimiterFilterFactory"
splitOnCaseChange="0"
splitOnNumerics="0"
stemEnglishPossessive="0"
catenateWords="1"
catenateNumbers="1"
catenateAll="1"
preserveOriginal="1"
generateWordParts="1"
generateNumberParts="1"/>
<filter class="solr.TrimFilterFactory" />
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.ISOLatin1AccentFilterFactory" />
</analyzer>
</fieldType>
我尝试过使用 splitOnCase 和 splitOnNumerics 变体,但没有成功。然后,结果将匹配带有空格的结果 (320 GB),并错过非空格的结果 (320 GB)。
大多数文档的数据都没有空格,这就是当前设置的原因。
预先感谢您的帮助。
最佳答案
使用分析工具进行工作。你可能想尝试一下:-
<fieldType name="textFilter" class="solr.TextField"
positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.KeywordTokenizerFactory" />
<filter class="solr.WordDelimiterFilterFactory"
catenateWords="1"
catenateNumbers="1"
catenateAll="1"
preserveOriginal="1"
generateWordParts="1"
generateNumberParts="1"/>
<filter class="solr.TrimFilterFactory" />
<filter class="solr.LowerCaseFilterFactory" />
</analyzer>
<analyzer type="query">
<tokenizer class="solr.KeywordTokenizerFactory" />
<filter class="solr.WordDelimiterFilterFactory"
splitOnNumerics="1"
preserveOriginal="1"/>
<filter class="solr.TrimFilterFactory" />
<filter class="solr.LowerCaseFilterFactory" />
</analyzer>
</fieldType>
分析 -
索引时间 - 2GB 数据
查询时间 - 2GB token - 2GB、2GB
在分析中生成 2 GB 作为 token ,并在索引中显示匹配项。
关于java - Solr:带空格和不带空格的匹配结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7573385/