Solr深度分页无需排序

时间:2018-11-13 09:48:14

标签: solr paging solrj

我在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排序,然后我无法按“标题”排序。 我尝试使用默认搜索字段(df),但结果仍然错误。 您知道如何解决它,以便可以按标题订购吗?

谢谢。

2 个答案:

答案 0 :(得分:2)

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

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

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

sort=title asc, id asc

..对于使用curserMarks进行深度分页非常有效。

发表评论后进一步解释

A Tokenizer is what tells Solr how to split the input text插入所谓的“令牌”。令牌是与之进行匹配的对象。空白令牌生成器会将“这是一个文本”拆分为四个令牌thisisatext。当您仅搜索textthis text时,会发生相同的过程,然后将输入的令牌和存储的令牌进行比较,以查看是否存在匹配项。

还会对令牌进行排序,因此,如果您尝试对文本“ cba”进行排序,则会将其标记为cba-和排序实际上并没有什么用,因为您希望以c开头的所有内容都在b之后进行排序,但是现在您有3个用于指示文档实际值的标记。这个过程通常会给您带来奇怪和不直观的结果。

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

但是,由于字符串字段不执行任何操作,因此您可能希望将aA排序为同一字符,而不是首先对大写字母进行排序。执行此操作的方法是使用名为KeywordTokenizer-the KeywordTokenizer的令牌生成器,不将输入文本拆分为令牌,而是将所有内容都保留为单个令牌。这似乎没有用,因为它与string字段的作用相同,但是带有Tokenizer的TextField允许您将过滤器附加到分析链上,而字符串字段则不行。因此,您可以add a LowercaseFilter到链上,因此,为aA生成的令牌将是相同的-在两种情况下都是a

您在schema.xml中或通过configure field types and their associated processing 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中定义的字段类型。

答案 1 :(得分:0)

终于我解决了 在研究了关于分词器的一些知识之后,尝试了几件事...

首先:我修改了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");

通过这种方式,它可以正确返回结果。 感谢您的宝贵时间MatsLindh。