java - Solr:带空格和不带空格的匹配结果

标签 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>

该字段是动态的(“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/

相关文章:

java - Android 真的需要多 Activity 吗?

java - Cassandra 中的无效请求异常

replace - 如何替换Logstash中的字段

filter - 在方案 (SCM) 中的 Define Filter 函数的结果末尾获取 #f 或 False

javascript - 如何以 Angular 访问过滤数组的属性

java - 如何在 Lucene 中将 FS 目录索引文件加载为 RAM 目录?

java - 具有嵌套在不同实体类中的 Id 的实体类

java - Resilience4j 和 @timeLimiter 注释用于超时和取消线程 - CompletableFuture

lucene - 在 Solr/Lucene 中删除低于某个分数阈值的结果?

elasticsearch - Kibana脚本字段中的Groovy脚本