Gus*_*Gus 5 sorting solr natural-sort
我想按照以下方式对值列表进行排序:
- 4
- 5xa
- 8kdjfew454
- 9
- 10
- 999cc
- 乙
- c9
- c10cc
- c11
换句话说,有时被称为“自然排序”,即文本在有文本的地方按字母/字典顺序排序,但在有数字的地方按数字排序,即使两者混合在同一个字符串中。
无论如何,我找不到在 Solr (4.0 atm) 中执行此操作。是否有标准方法可以做到这一点或至少有一个可行的“食谱”?
本文描述了您可以实现的最接近的目标
\n来自文章:
\n\n\n为了强制数字按数字排序,我们需要在所有数字的左侧填充零:2 变为 0002,10 变为 0010,100 变为 0100,等等。那么即使是词法排序也会像这样排列值:
\n标题 1 标题 2 标题 10 标题 100
\n字段类型
\n此字母数字排序字段类型将找到的任何数字转换为 6\n位数字,并用零填充。(如果您预计字段值中的数字大于 6\n位数,则在填充时需要增加\n零的数量。)
\n该字段类型还会删除英文和法文的主条目、小写字母,并清除任何非字母数字字符。它以英语为中心,并假定变音符号已被折叠成 ASCII 字符。
\n
<fieldType name="alphaNumericSort" class="solr.TextField" sortMissingLast="false" omitNorms="true">\n <analyzer>\n <!-- KeywordTokenizer does no actual tokenizing, so the entire\n input string is preserved as a single token\n -->\n <tokenizer class="solr.KeywordTokenizerFactory"/>\n <!-- The LowerCase TokenFilter does what you expect, which can be\n when you want your sorting to be case insensitive\n -->\n <filter class="solr.LowerCaseFilterFactory" />\n <!-- The TrimFilter removes any leading or trailing whitespace -->\n <filter class="solr.TrimFilterFactory" />\n <!-- Remove leading articles -->\n <filter class="solr.PatternReplaceFilterFactory"\n pattern="^(a |the |les |la |le |l\'|de la |du |des )" replacement="" replace="all"\n />\n <!-- Left-pad numbers with zeroes -->\n <filter class="solr.PatternReplaceFilterFactory"\n pattern="(\\d+)" replacement="00000$1" replace="all"\n />\n <!-- Left-trim zeroes to produce 6 digit numbers -->\n <filter class="solr.PatternReplaceFilterFactory"\n pattern="0*([0-9]{6,})" replacement="$1" replace="all"\n />\n <!-- Remove all but alphanumeric characters -->\n <filter class="solr.PatternReplaceFilterFactory"\n pattern="([^a-z0-9])" replacement="" replace="all"\n />\n </analyzer>\n</fieldType>Run Code Online (Sandbox Code Playgroud)\r\n\n\n样本输出
\n标题编号 1 => titleno000001\n标题编号 2 => titleno000002
\n
\n标题编号 10 => titleno000010
\n标题编号 100 => titleno000100