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

Gus*_*Gus 5 sorting solr natural-sort

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

  • 4
  • 5xa
  • 8kdjfew454
  • 9
  • 10
  • 999cc
  • c9
  • c10cc
  • c11

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

无论如何,我找不到在 Solr (4.0 atm) 中执行此操作。是否有标准方法可以做到这一点或至少有一个可行的“食谱”?

Sha*_*run 1

本文描述了您可以实现的最接近的目标

\n

来自文章:

\n
\n

为了强制数字按数字排序,我们需要在所有数字的左侧填充零:2 变为 0002,10 变为 0010,100 变为 0100,等等。那么即使是词法排序也会像这样排列值:

\n

标题 1 标题 2 标题 10 标题 100

\n

字段类型

\n

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

\n

该字段类型还会删除英文和法文的主条目、小写字母,并清除任何非字母数字字符。它以英语为中心,并假定变音符号已被折叠成 ASCII 字符。

\n
\n

\r\n
\r\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
\r\n
\r\n

\n

\n

样本输出

\n

标题编号 1 => titleno000001\n标题编号 2 => titleno000002
\n标题编号 10 => titleno000010
\n标题编号 100 => titleno000100

\n
\n