2011-11-23 166 views
15

我在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中,但它仍然無法正常工作。我該怎麼辦?誰能幫我?

回答

11

的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

5

您的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

5

我用這個作爲字段類型:

<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

這會給你一個錯誤 –

1

我用過這樣的東西... 在架構中。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\ *)

1

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

-2

如何使大小寫不敏感的集合使用動態模式(或數據驅動模式)?收藏品的創建方法如下: su - solr -c "/opt/solr/bin/solr create -c Mock2 -n data_driven_schema_configs"