2013-07-26 34 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 

參考