SOLR不区分大小写搜索

问题描述:

我在SOLR搜索中遇到了问题。
我有这样一个数据:
enter image description hereSOLR不区分大小写搜索

我使用Solr管理使用这样的查询找到这样的数据:

address_s:*Nadi* 

,发现这些数据。但是当我使用这个查询时:

address_s:*nadi* 

它没有发现任何东西。
我google搜索,我找到了答案,以创建一个字段使用以下脚本:

<fieldType name="c_text" class="solr.TextField"> 
    <analyzer type="index"> 
     <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 

    <analyzer type="query"> 
     <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
</fieldType> 

我已经复制这些脚本粘贴到schema.xml中,但它仍然无法正常工作。我该怎么办?谁能帮我?

的address_s场应定义为 -

<field name="address_s" type="c_text" indexed="true" stored="true"/> 

如果您使用的是默认schema.xml中,这个认定中应来之前 -

<dynamicField name="*_s" type="string" indexed="true" stored="true"/> 

将其定义为一个字符串字段类型没有进行分析。

通配符查询不经过分析。
因此,如果您在索引时间应用小写字母过滤器,查询address_s:*nadi*将起作用。
但是,查询address_s:*Nadi *不会,因为Nadi在索引中不会与nadi匹配,所以您需要小写客户端的查询。

+1

我按照你的指示,但它仍然无法工作。我复制粘贴''到schema.xml,然后重新运行java -jar start.jar并尝试查询。对不起,我想先问一下,我在.. \ solr_302 \ example \ solr \ conf下使用了schema.xml,是吗? – Praditha

+0

嘿,这是工作,我需要先重新插入文件。谢谢,。你知道如何通过PHP定义这些字段吗?所以我不需要手动在schema.xml中定义它。 – Praditha

+5

'但是,查询address_s:* Nadi *不会,因为Nadi不会在索引中匹配nadi - 但是这并不是说在中具有'LowerCaseFilterFactory',所以*查询*是自动小写的? – Madbreaks

您的address_s字段是否在您的schema.xml中使用这个c_text字段类型?

如果您的索引是使用先前的配置创建的,则需要重新索引所有内容以考虑更改。

+0

如何做到这一点?因为我使用PHP制作所有字段。我将所有字段输入到数组中,如下所示:$ data = array(...,'address_s'=>'value','city_name_s'=>'value',...);并使用addDocument($ data)函数。任何想法。,? – Praditha

+3

然后,您需要为已添加到索引的所有文档重新运行这些命令。数据在索引中的表示取决于已使用的分析仪。因此,如果更新用于建立索引的分析器,则需要重新索引所有文档。 – jpountz

+0

对不起,我还是不明白我该怎么做,你可以一步一步来描述它:D,当我应该使用'c_text'字段类型到所有索引,当我重新运行我的php命令时,。 – Praditha

我用这个作为字段类型:

<fieldType name="string" class="solr.TextField"> 
    <analyzer type="index"> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
    <analyzer type="query"> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
</fieldType> 

而且使用定义我的领域:

<field name="address" type="string" indexed="true" stored="true"/> 

结果:我的文档返回正确的情况下的字段(如插入),我可以搜索不区分大小写(使用大写和小写字母)...

版本:Solr 3.6

+0

这会给你一个错误 –

我用过这样的东西... 在架构中。XML我已经投入了新的字段类型

<fieldType name="newType" class="solr.TextField" positionIncrementGap="100"> 
     <analyzer type="index"> 
     <tokenizer class="solr.KeywordTokenizerFactory"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.ReversedWildcardFilterFactory" /> 
     </analyzer> 
     <analyzer type="query"> 
     <tokenizer class="solr.KeywordTokenizerFactory"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.ReversedWildcardFilterFactory" /> 
     </analyzer> 
</fieldType> 

指定新类型的字段,要让它情况下&空白不敏感 然后,你必须构造形式Solr的查询:fieldName:(*fieldValue\ *)

而不是type="string"定义字段type="text_general"(如在缺省schema.xml中定义的)。其财产是ignore case=true

如何使大小写不敏感的集合使用动态模式(或数据驱动模式)?收藏品的创建方法如下: su - solr -c "/opt/solr/bin/solr create -c Mock2 -n data_driven_schema_configs"