如何使用自然排序顺序对solr中的文本/字符串进行排序?

时间:2013-03-01 18:21:43

标签: sorting solr natural-sort

我想按照以下方式对值列表进行排序:

  
      
  • 4
  •   
  • 5XA
  •   
  • 8kdjfew454
  •   
  • 9
  •   
  • 10
  •   
  • 999cc
  •   
  • B'/ LI>   
  • C9
  •   
  • c10cc
  •   
  • C11
  •   

换句话说,有时被称为“自然排序”,其中文本按字母顺序/词典顺序排序,其中有文本,但数字上有数字,即使两者都混合在同一个字符串中。

我无法在Solr(4.0 atm)中找到这样做。有没有标准的方法来做到这一点或至少是一个可行的“食谱”?

1 个答案:

答案 0 :(得分:0)

this article

中描述了您可以实现的最接近的事情

来自文章:

  

要强制数字按数字排序,我们需要左键填充任何数字   用零:2变为0002,10变为0010,100变为0100,等等   等等。然后即使是词法排序也会安排这样的值:

     

第1号标题第2号标题第10号标题第100号

     

字段类型

     

此字母数字排序字段类型会将找到的任何数字转换为6   数字,用零填充。 (如果您预计数字大于6   在您的字段值中的数字,您将需要增加数字   填充时为零。)

     

字段类型还删除了英文和法文的主要文章,   小写,并清除任何不是字母数字的字符。它是   以英语为中心,并假设变音符号被折叠成   ASCII字符。



<fieldType name="alphaNumericSort" class="solr.TextField" sortMissingLast="false" omitNorms="true">
  <analyzer>
    <!-- KeywordTokenizer does no actual tokenizing, so the entire
         input string is preserved as a single token
      -->
    <tokenizer class="solr.KeywordTokenizerFactory"/>
    <!-- The LowerCase TokenFilter does what you expect, which can be
         when you want your sorting to be case insensitive
      -->
    <filter class="solr.LowerCaseFilterFactory" />
    <!-- The TrimFilter removes any leading or trailing whitespace -->
    <filter class="solr.TrimFilterFactory" />
    <!-- Remove leading articles -->
    <filter class="solr.PatternReplaceFilterFactory"
            pattern="^(a |the |les |la |le |l'|de la |du |des )" replacement="" replace="all"
    />
    <!-- Left-pad numbers with zeroes -->
    <filter class="solr.PatternReplaceFilterFactory"
            pattern="(\d+)" replacement="00000$1" replace="all"
    />
    <!-- Left-trim zeroes to produce 6 digit numbers -->
    <filter class="solr.PatternReplaceFilterFactory"
            pattern="0*([0-9]{6,})" replacement="$1" replace="all"
    />
    <!-- Remove all but alphanumeric characters -->
    <filter class="solr.PatternReplaceFilterFactory"
            pattern="([^a-z0-9])" replacement="" replace="all"
    />
  </analyzer>
</fieldType>
&#13;
&#13;
&#13;

  

示例输出

     

标题1 =&gt; titleno000001   标题2 =&gt; titleno000002
  标题10 =&gt; titleno000010
  标题号100 =&gt; titleno000100