我想按照以下方式对值列表进行排序:
- 4
- 5XA
- 8kdjfew454
- 9
- 10
- 999cc
- B'/ LI>
- C9
- c10cc
- C11
换句话说,有时被称为“自然排序”,其中文本按字母顺序/词典顺序排序,其中有文本,但数字上有数字,即使两者都混合在同一个字符串中。
我无法在Solr(4.0 atm)中找到这样做。有没有标准的方法来做到这一点或至少是一个可行的“食谱”?
答案 0 :(得分:0)
来自文章:
要强制数字按数字排序,我们需要左键填充任何数字 用零: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;
示例输出
标题1 =&gt; titleno000001 标题2 =&gt; titleno000002
标题10 =&gt; titleno000010
标题号100 =&gt; titleno000100