没有排序的Solr深度分页

Solr deep paging without sort

我在 solr 中索引了以下 xml:

<doc>
<field name="title" type="text_general" class="solr.TextField" indexed="true" stored="true" required="true" multiValued="false" >Sharknado 3</field>
<field name="author">moriarti</field>
<field name="price">20.5</field>
</doc>

<doc>
<field name="title" type="text_general" class="solr.TextField" indexed="true" stored="true" required="true" multiValued="false" >Sharknado</field>
<field name="author">moriarti</field>
<field name="price">18</field>
</doc>

<doc>
<field name="title" type="text_general" class="solr.TextField" indexed="true" stored="true" required="true" multiValued="false" >Sharknado 2</field>
<field name="author">moriarti</field>
<field name="price">19.5</field>
</doc>

我遇到的下一个问题是,当我进行深度分页时,它会强制我按 id asc 或 id desc 排序,然后我无法按 "title" 排序。 我尝试使用默认搜索字段(df),但结果仍然错误。 你知道我如何解决它,以便我可以按标题订购吗?

谢谢。

字段定义(带有类型等)进入您的架构,而不是更新 XML。

按已分析的 TextField 排序也不是一个好主意,因为您不会得到想要的结果。如果您想按文本字段搜索,请按 string 字段或带有 KeywordTokenizer 和小写过滤器的字段排序(如果您想让排序不区分大小写)。

规则只是 id 字段(或更具体 - 可以命名为 id 以外的其他名称的 uniqueKey 字段,但通常只是 id) - 具有在排序顺序中存在。它不一定是第一个,它必须在那里所以排序是稳定的。

sort=title asc, id asc

.. 完全适用于使用 cursorMarks 进行深度分页。

评论后进一步解释

A Tokenizer is what tells Solr how to split the input text变成所谓的"Tokens"。令牌是匹配的对象。 Whitespace Tokenizer 会将 "this is a text" 拆分为四个标记,thisisatext。当您仅搜索 textthis text 时,会发生相同的过程,然后比较输入和存储的标记以查看是否匹配。

还会对标记执行排序,因此如果您尝试对文本 "c b a" 进行排序,它将被标记为 cba - 这对于排序并不是很有用,因为您希望以 c 开头的任何内容都排在 b 之后,但您现在有三个指示其实际值的文档标记。此过程通常会给您带来奇怪且不直观的结果。

相反,请使用 string 字段,因为这会将输入保留为单个标记。如果您存储 a b c,整个文本将存储为单个标记 - a b c,而不是分解成更小的部分。这也意味着只有当输入和存储的文本完全匹配时你才会获得匹配,因为它是一个单一的大标记(标记是决定匹配的因素)。

但由于字符串字段不执行任何操作,您可能希望将 aA 排序为相同的字符,而不是排序大写字母在前。这样做的方法是在链上有一个名为 KeywordTokenizer - the KeywordTokenizer doesn't split the input text into tokens, but keeps everything as a single token. This seems useless since it's the same as what a string field does, but a TextField with a Tokenizer allows you to attach filters to the analysis chain - which a string field doesn't. So you can add a LowercaseFilter 的 Tokenizer,因此,为 aA 生成的令牌将是相同的 - a 在这两种情况下。

configure field types and their associated processing in schema.xml or through the Schema API。您可以使用 copyField 告诉 Solr "anything that goes into this field, should also be added to this other field" - 这样您就可以让您的内容出现在多个字段中并以不同的方式处理 - 一种搜索方式(例如在空格上标记)和一种搜索方式(根本没有标记化)。

您在文档 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中定义的字段类型。

终于解决了, 在对标记器进行了一些调查并尝试了几件事之后...

首先:我修改了solrconfig.xml可以手动编辑。 我补充说:

<schemaFactory class="ManagedIndexSchemaFactory">
    <bool name="mutable">true</bool>
    <str name="managedSchemaResourceName">managed-schema</str>
</schemaFactory>

如上所示here

第二个:我在 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);

我在solrj中也有作为参数:

query.setParam ("df", "title");

这样,returns结果就正确了。 感谢您的时间 MatsLindh。