4

私は Eclipse で Java と SolrJ を使用しています。SolrQuery の結果を特定のフィールドの値の出現頻度で並べ替えるにはどうすればよいですか? たとえば、特定の著者の上位 n 件の記事 ( docType=0 ) を検索する場合、クエリ結果をjournal_facetフィールド (文字列型)の値の頻度で並べ替えたいと考えています。

特定の著者 X が書いた場合:

  • J0という名前のジャーナルの2つの記事(a0、a1)
  • J1という名前のジャーナルの3つの記事(a2、a3、a4)
  • J2という名前のジャーナルの1つの記事(a5)

順序は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>

どうもありがとうございました。

4

2 に答える 2