2013-07-26 33 views
4

我在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> 

非常感谢你的帮助。

+0

约排序它编写自定义功能的查询和什么 http://wiki.apache.org/solr/FunctionQuery#Sort_By_Function – Mysterion

回答

0

有关编写自定义功能的查询,并通过它排序什么:

http://localhost:8983/solr/select?q=*:*&sort=dist(2, point1, point2) desc 

参考