我在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),但结果仍然错误。 您知道如何解决它,以便可以按标题订购吗?
谢谢。
答案 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插入所谓的“令牌”。令牌是与之进行匹配的对象。空白令牌生成器会将“这是一个文本”拆分为四个令牌this
,is
,a
和text
。当您仅搜索text
或this text
时,会发生相同的过程,然后将输入的令牌和存储的令牌进行比较,以查看是否存在匹配项。
还会对令牌进行排序,因此,如果您尝试对文本“ cba”进行排序,则会将其标记为c
,b
和a
-和排序实际上并没有什么用,因为您希望以c
开头的所有内容都在b
之后进行排序,但是现在您有3个用于指示文档实际值的标记。这个过程通常会给您带来奇怪和不直观的结果。
请使用string
字段,因为这会将输入保留为单个标记。如果存储a b c
,则整个文本将存储为单个标记-a b c
,而不是分成较小的部分。这也意味着,只有输入和存储的文本完全匹配时,您才会获得匹配,因为它是一个单个的大令牌(令牌是确定匹配项的原因)。
但是,由于字符串字段不执行任何操作,因此您可能希望将a
和A
排序为同一字符,而不是首先对大写字母进行排序。执行此操作的方法是使用名为KeywordTokenizer
-the KeywordTokenizer的令牌生成器,不将输入文本拆分为令牌,而是将所有内容都保留为单个令牌。这似乎没有用,因为它与string
字段的作用相同,但是带有Tokenizer的TextField允许您将过滤器附加到分析链上,而字符串字段则不行。因此,您可以add a LowercaseFilter到链上,因此,为a
和A
生成的令牌将是相同的-在两种情况下都是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。