字段定义(带有类型等)进入您的模式,而不是更新 XML 中。
按分析的 TextField 排序也不是一个好主意,因为您不会得到您正在寻找的结果。如果您想按文本字段搜索,请按
string
字段排序,或按带有 KeywordTokenizer 和小写过滤器的字段排序(如果您想让排序不区分大小写)。
规则只是
id
字段(或更具体 - uniqueKey 字段可以命名为 id
之外的其他名称,但通常只是 id
) - 必须在排序顺序中为 present。它不一定是第一个,它只需要在那里,这样排序就稳定了。
sort=title asc, id asc
..对于使用cursorMarks进行深度分页来说是完全有效的。
评论后进一步解释
Tokenizer 告诉 Solr 如何将输入文本 拆分为所谓的“Tokens”。令牌是正在执行匹配的对象。空白标记生成器会将“这是一个文本”拆分为四个标记:
this
、is
、a
和 text
。当您仅搜索 text
或 this text
时,会发生相同的过程,然后比较输入的和存储的标记以查看是否存在匹配。
还会对标记执行排序,因此如果您尝试对文本“c b a”进行排序,它将被标记为
c
、b
和 a
- 这对于排序来说并不是很有用,因为您希望以 c
开头的任何内容都在 b
之后进行排序,但现在文档拥有三个标记,指示其实际值。这个过程通常会给你带来奇怪和不直观的结果。
相反,请使用
string
字段,因为这会将输入保留为单个标记。如果您存储 a b c
,则整个文本将存储为单个标记 - a b c
,并且不会分解为更小的片段。这也意味着,只有输入和存储的文本完全匹配时,您才会获得命中,因为它是单个大令牌(而令牌决定匹配)。
但是由于字符串字段不执行任何操作,因此您可能希望将 a
和
A
作为同一字符进行排序,而不是首先对大写字母进行排序。实现此目的的方法是使用一个名为 KeywordTokenizer
的 Tokenizer - KeywordTokenizer不会将输入文本拆分为标记,而是将所有内容保留为单个标记。这看起来没什么用,因为它与
string
字段的作用相同,但是带有 Tokenizer 的 TextField 允许您将过滤器附加到分析链 - 而字符串字段则不然。因此,您可以 将 LowercaseFilter添加到链中,因此,为
a
和 A
生成的代币将是相同的 - 在这两种情况下都是 a
。您可以在
schema.xml
中或通过 Schema API
配置字段类型及其关联处理。您可以使用
copyField
告诉 Solr“进入此字段的任何内容也应该添加到另一个字段” - 这样您就可以让您的内容出现在多个字段中并以不同的方式处理 - 一种搜索方式(标记化)例如空格)和一种搜索方式(根本没有标记化)。
您在文档 XML 中的字段之一使用的语法并不适合在该上下文中使用 - 但在 schema.xml 中定义字段时:
<field name="title" type="text_general" class="solr.TextField" indexed="true" stored="true" required="true" multiValued="false" />
在您的文档中应该是:
<field name="title">value</field>
处理和参数将基于
schema.xml
中定义的字段类型。终于解决了, 在研究了一些关于标记器并尝试了一些事情之后......
First
:我修改了 solrconfig.xml 以便能够手动编辑它。 我补充道:
<schemaFactory class="ManagedIndexSchemaFactory">
<bool name="mutable">true</bool>
<str name="managedSchemaResourceName">managed-schema</str>
</schemaFactory>
此处所示。:我在manage-schema.xml中为我的字段更改了以下内容:
<field name="title" type="text_general" multiValued="false" indexed="true" stored="true"/>
第三: 我在 solrj 中按照以下方式按分数和标题排序:
query.addSort("score", ORDER.desc);
query.addSort("title", ORDER.asc);
query.addSort("id", ORDER.desc);
query.setParam ("df", "title");
这样就正确返回结果了。 感谢您抽出时间 MatsLindh。