2

我们 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”的文档,但会丢失“2GB”(空白)。

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

例如:

搜索 +(property_Info_Memory:("320gb")) 应该返回上面的第一行,匹配“320GB”“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)并错过非空白的那些(320GB)。

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

在此先感谢您的帮助。

4

2 回答 2

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 作为标记,并在索引中显示匹配项。

于 2011-09-27T18:20:35.043 回答
0

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

  1. 有两个字段存储数据,每个都以不同的方式标记化(即使用复制字段)
  2. 拥有一个带有自定义同义词过滤器的字段

#2 是更好的解决方案,但需要编写一些 java.lang. 我建议只扩展 WordDeliminterFilter;您可以查看 SynonymTokenFilter 的来源,了解如何创建同义词。

于 2011-09-27T17:52:02.433 回答