Solr:匹配带有和没有空格的结果

时间:2011-09-27 17:38:55

标签: java filter lucene solr analyzer

我们的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>

该字段是动态的(&#34;属性_ *&#34;),因此两种情况都使用相同的分析器。

目前,在搜索&#34; 2gb&#34;时,它返回的文件为&#34; 2GB&#34;但未命中&#34; 2 GB&#34; (空白)。

问题是:如何在架构中设置此字段类型,以便匹配带有和没有空格的结果

例如:

搜索+(property_Info_Memory:(&#34; 320gb&#34;))应返回上面的第一行,匹配&#34; 320GB&#34; AND &#34; 320 GB&#34;。

这是字段类型的设置方式:

<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)的结果匹配并且错过非空白空间(320GB)。

大多数文档都有没有空格的数据,这就是当前设置的原因。

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

使用分析工具。你可能想尝试一下: -

<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 令牌 - 2gb,2 gb

在分析中生成2 gb作为标记,它在索引中显示匹配。

答案 1 :(得分:0)

我知道有两种方法可以做到这一点:

  1. 有两个字段存储数据,每个字段以不同方式标记(即使用复制字段)
  2. 让一个字段带有自定义同义词过滤器
  3. #2是更好的解决方案,但需要编写一些java。我建议只扩展WordDeliminterFilter;你可以看到SynonymTokenFilter的来源,了解如何创建同义词。