Solr 深度分页,无需排序

问题描述 投票:0回答:2
solr pagination solrj
2个回答
2
投票

字段定义(带有类型等)进入您的模式,而不是更新 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
中定义的字段类型。


终于解决了, 在研究了一些关于标记器并尝试了一些事情之后......

0
投票

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);

我在 solrj 中也有参数:

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

这样就正确返回结果了。 感谢您抽出时间 MatsLindh。
    

© www.soinside.com 2019 - 2024. All rights reserved.