我在Eclipse上使用Java和SolrJ。如何将SolrQuery的结果按特定字段上的值的发生次序排序?例如,当我搜索特定作者的前n篇文章(docType = 0)时,我想按照字段(String类型)中的值的频率对查询结果进行排序。Solr - 如何按特定字段上的值的频率进行排序?
如果某个作者X写道:
- 2篇文章(A0,A1)在名为J0
- 3篇文章(A2,A3,A4)在名为J1杂志
- 杂志1条(A5)在名为J2
订购该杂志必须是A2,A3,A4,A0,A1,A5和我要显示在下面的方式结果
<doc>
<arr name="author">
<str>X</str>
</arr>
<str name="title">a2</str>
<str name="journal">J1</str>
</doc>
<doc>
<arr name="author">
<str>X</str>
</arr>
<str name="title">a3</str>
<str name="journal">J1</str>
</doc>
<doc>
<arr name="author">
<str>X</str>
</arr>
<str name="title">a4</str>
<str name="journal">J1</str>
</doc>
<doc>
<arr name="author">
<str>X</str>
</arr>
<str name="title">a0</str>
<str name="journal">J0</str>
</doc>
<doc>
<arr name="author">
<str>X</str>
</arr>
<str name="title">a1</str>
<str name="journal">J0</str>
</doc>
<doc>
<arr name="author">
<str>X</str>
</arr>
<str name="title">a5</str>
<str name="journal">J2</str>
</doc>
我的查询是
SolrServer solrServer = new HttpSolrServer(urlString);
SolrQuery query = new SolrQuery();
query.set("q", "docType:0);
query.set("fq", "author:X");
query.set("fl", "author, title, journal");
query.setRows(n);
...
QueryResponse response = solrServer.query(query);
SolrDocumentList results = response.getResults();
,在我的Solr schema.xml中有以下字段和类型
<types>
...
<fieldType name="text_title" class="solr.TextField"
positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory" />
<charFilter class="solr.HTMLStripCharFilterFactory" />
<filter class="solr.ASCIIFoldingFilterFactory" />
<filter class="solr.WordDelimiterFilterFactory"
generateWordParts="1" generateNumberParts="1" catenateWords="1"
catenateNumbers="1" catenateAll="1" splitOnCaseChange="1"
stemEnglishPossessive="1" preserveOriginal="1" />
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front"/>
<filter class="solr.KStemFilterFactory" />
<filter class="solr.RemoveDuplicatesTokenFilterFactory" />
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory" />
<filter class="solr.ASCIIFoldingFilterFactory" />
<filter class="solr.WordDelimiterFilterFactory"
generateWordParts="1" generateNumberParts="1" catenateWords="0"
catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"
stemEnglishPossessive="1" preserveOriginal="1" />
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.KStemFilterFactory" />
<filter class="solr.RemoveDuplicatesTokenFilterFactory" />
</analyzer>
</fieldType>
<fieldType name="text_name" class="solr.TextField"
positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory" />
<charFilter class="solr.HTMLStripCharFilterFactory" />
<filter class="solr.ASCIIFoldingFilterFactory" />
<filter class="solr.WordDelimiterFilterFactory"
generateWordParts="1" generateNumberParts="1" catenateWords="1"
catenateNumbers="1" catenateAll="1" splitOnCaseChange="1" />
<filter class="solr.LowerCaseFilterFactory" />
<!-- n-grams utile per la ricerca per prefisso" -->
<filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front"/>
<!-- <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> -->
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory" />
<filter class="solr.ASCIIFoldingFilterFactory" />
<filter class="solr.WordDelimiterFilterFactory"
generateWordParts="1" generateNumberParts="1" catenateWords="0"
catenateNumbers="0" catenateAll="0" splitOnCaseChange="1" />
<filter class="solr.LowerCaseFilterFactory" />
<!-- <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> -->
</analyzer>
</fieldType>
</types>
<fields>
<field name="docType" type="tint" indexed="true" stored="true"
multiValued="false" required="true" />
<field name="key" type="string" indexed="true" stored="true"
multiValued="false" required="true" />
<field name="mdate" type="date" indexed="true" stored="true"
multiValued="false" required="true" />
...
<field name="author" type="text_name" indexed="true" stored="true"
multiValued="true" />
...
<field name="journal" type="text_title" indexed="true" stored="true"
multiValued="false" />
<field name="title" type="text_title" indexed="true" stored="true"
multiValued="false" />
...
<field name="journal_facet" type="string" indexed="true" stored="true"
multiValued="false" />
...
<copyField dest="journal_facet" source="journal" />
...
</fields>
非常感谢你的帮助。
约排序它编写自定义功能的查询和什么 http://wiki.apache.org/solr/FunctionQuery#Sort_By_Function – Mysterion