2014-05-22 75 views
0

如果我排序場稱爲代碼我得到以下resutls:排序字符串字段不排序正確

{code:ABC-120GB} 
    {code:ABC-120GBY} 
    {code:ABC-120GY} 
    {code:ABC-120G} 
    {code:ABC-120GB} 
    {code:ABC-120GBY} 
    {code:ABC-120GY} 

這些是從schema.xml文件中提到的字段中的配置:

<fields 
    <field name="code" type="string" indexed="true" stored="true" required="true"/> 
</fields> 

<types> 
    <fieldType name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true"/> 
</types> 

回答

3

它看起來像code_length上的第一級排序正在工作。 code上的排序是否是唯一指定的排序?我的懷疑是,如果它是您用於排序的唯一字段,您會在code字段中看到與排序相同的問題。

您看到的問題似乎很有可能是由於您未包含真實數據而導致我們無法看到的數據變化。看看您是否可以用您實際發佈的數據或其他非敏感數據重新創建此問題會很有趣。首先,我會懷疑字符編碼中看不見的變化。如果是這種情況,您可以嘗試將code字段修改爲單個令牌文本字段,而不是未修改的字符串字段。然後,您可以選擇各種過濾器來添加到可以規範化編碼變體的fieldType。良好的過濾考慮是管理大量的正常化,並可以添加到您的fieldType定義這一行的ICU Folding Filter

<filter class="solr.ICUFoldingFilterFactory"/> 

你可以考慮這個定義一個名爲「精確」可能會爲你工作fieldType 。通過將該值「標記化」爲一個大標記,它將保留與code字段具有type="string"的精確匹配搜索,並且通過在排序字段上僅有一個標記也可以使Solr開心。

<fieldType name="exact" class="solr.TextField" sortMissingLast="true" omitNorms="true"> 
    <analyzer> 
    <!-- KeywordTokenizer does no actual tokenizing, so the entire 
     input string is preserved as a single token 
     --> 
    <tokenizer class="solr.KeywordTokenizerFactory"/> 
    <filter class="solr.ICUFoldingFilterFactory"/>   
    <filter class="solr.TrimFilterFactory" /> 
    </analyzer> 
</fieldType> 

那麼你還是你code字段定義更改爲:

<field name="code" type="exact" indexed="true" stored="true" required="true" multiValued="false"/> 

當然,這有點投機的,因爲我不知道,我沒有看到的數據可能會告訴我, ICU摺疊式過濾器無法調整所有可能導致麻煩的事情。但我希望這有助於。

  • 注:因爲排序不會對多值下地幹活,我建議明確指定multiValued="false"你打算使用排序的任何字段。它將不那麼模糊。
+0

謝謝,'multiValued =「false」'修改釘住了它 –

+1

在所有這些猜測之後,它是回答這個問題的腳註。至少現在工作。 – frances

+0

我希望有人會發現它也很有用。 –