Apache Solr

 

solrのElevation機能で意図的なランクアップをする

solrのElevation Componentで意図的なランクアップをします。solrjからelavation機能を利用する部分まで解説します。スポンサーのデータを優先表示したい場合等で使いましょう。

新サイト、tree-mapsを公開しました!!

tree-maps: 地図のWEB TOOLの事ならtree-mapsにお任せ!

地図に関するWEB TOOL専門サイトです!!

大画面で大量の緯度経度を一気にプロット、ジオコーディング、DMS<->DEGの相互変換等ができます!

◯ 広告

通常solrのクエリを実行すると、検索条件+ソート条件によって検索結果が返ります。

しかし、スポンサーの商品等、意図的に上位表示したい要件があったりしますね。

その場合、このElevation機能が使えます。

Elevation機能は特定のクエリの時に特定のデータを、検索条件・ソートを無視して意図的に上位表示する事ができます。

または、特定の検索条件の時、特定の商品を除外したいという事も可能です。

では早速環境を整備して使ってみましょう。

以下は今回使うファイルを抽出したフォルダ構成です。

solr/
├── address
│   ├── conf
│   │   ├── elevate.xml
│   │   ├── schema.xml
│   │   └── solrconfig.xml
└── solr.xml

elevationの設定は以下のデフォルト設定のままで動きます。

  <searchComponent name="elevator" class="solr.QueryElevationComponent" >
    <!-- pick a fieldType to analyze queries -->
    <str name="queryFieldType">string</str>
    <str name="config-file">elevate.xml</str>
  </searchComponent>

  <!-- A request handler for demonstrating the elevator component -->
  <requestHandler name="/elevate" class="solr.SearchHandler" startup="lazy">
    <lst name="defaults">
      <str name="echoParams">explicit</str>
      <str name="df">text</str>
    </lst>
    <arr name="last-components">
      <str>elevator</str>
    </arr>
  </requestHandler>

Elevation機能でschema.xmlに設定する項目はありません。

このファイルに意図的なランク設定を記述していきます。

elevate.xmlは、solrの起動時に1回だけ読み込まれます。

<?xml version="1.0" encoding="UTF-8" ?>
<elevate>
 <query text="pref_name_str:青森県">
  <doc id="1313101131010002000" />
 </query>
</elevate>

この例では、「青森県で検索した場合、特定の東京都のデータを最上位表示する」という設定です。

ソースを見ると理解が早いかと思うので、早速サンプルです。

public SolrSearchResult<AddressDocument> getElevater() {
    SolrQuery solrQuery = new SolrQuery();
    solrQuery.setQuery(AddressDocumentNames.PREF_NAME + ":青森県");
    solrQuery.setFields(AddressDocumentNames.ID, AddressDocumentNames.PREF_NAME, "[elevated]");
    // elevateの設定
    solrQuery.setParam(CommonParams.QT, "/elevate");
    solrQuery.setParam(QueryElevationParams.ENABLE, true);
    return getResultList(solrQuery, AddressDocument.class);
}

まず、Elevationを利用するにはURLが「/elevate」から始まっていないといけません。

デフォルトでは「/select」なので、solrQuery.setParam(CommonParams.QT, "/elevate")で変更します。

もう一点重要な点があります。それは、elevateされかどうかを判定するフィールドです。

そのフィールド名は「[elevated]」となっています。半角小括弧で囲まれています。

このフィールド名を変更する事もでき、solrconfig.xmlに以下のように設定すると変更できます。

  <searchComponent name="elevator" class="solr.QueryElevationComponent" >
    <str name="queryFieldType">string</str>
    <str name="config-file">elevate.xml</str>
    <str name="editorialMarkerFieldName">ここに任意のフィールド名を設定します</str>
  </searchComponent>

では検索してランクアップを確認してみます。

@Test
public void getElevate() {
    SolrSearchResult<AddressDocument> result = addressSearcher.getElevater();
    List<AddressDocument> results = result.getResultList();
    assertThat(results.size(), is(not(0)));
    for (AddressDocument doc : results) {
        LOGGER.info("{} / {} / {}", doc.id, doc.prefName, doc.elevated);
    }
}

↓↓↓↓

2013/03/11 02:27:12:574 INFO - AddressSearcherTest.getElevate 1313101131010002000 / 東京都 / true
2013/03/11 02:27:12:575 INFO - AddressSearcherTest.getElevate 0202201022010002001 / 青森県 / false
2013/03/11 02:27:12:575 INFO - AddressSearcherTest.getElevate 0202201022010003002 / 青森県 / false
2013/03/11 02:27:12:575 INFO - AddressSearcherTest.getElevate 0202201022010004002 / 青森県 / false
2013/03/11 02:27:12:575 INFO - AddressSearcherTest.getElevate 0202201022010006001 / 青森県 / false
2013/03/11 02:27:12:575 INFO - AddressSearcherTest.getElevate 0202201022010006004 / 青森県 / false
2013/03/11 02:27:12:575 INFO - AddressSearcherTest.getElevate 0202201022010007003 / 青森県 / false
2013/03/11 02:27:12:575 INFO - AddressSearcherTest.getElevate 0202201022010008003 / 青森県 / false
2013/03/11 02:27:12:576 INFO - AddressSearcherTest.getElevate 0202201022010009000 / 青森県 / false
2013/03/11 02:27:12:576 INFO - AddressSearcherTest.getElevate 0202201022010011001 / 青森県 / false

青森県で検索したのに id=1313101131010002000 の東京都が1件目に来ましたね

これが意図的なランクアップです。

続いて、意図的な除外をしてみましょう。

<?xml version="1.0" encoding="UTF-8" ?>
<elevate>
 <query text="pref_name_str:青森県">
  <doc id="1313101131010002000" />
  <!-- 除外設定 -->
  <doc id="0202201022010002001" exclude="true" />
 </query>
</elevate>

先ほどのelevate.xmlの設定に上記のように1行追加します。このidが検索結果から除外されます。

なお、elevate.xmlを更新したらsolrを再起動する必要があります。

再起動後、再度JUnitのテストケースを実行してみます。

2013/03/11 02:35:56:964 INFO - AddressSearcherTest.getElevate 1313101131010002000 / 東京都 / true
2013/03/11 02:35:56:964 INFO - AddressSearcherTest.getElevate 0202201022010003002 / 青森県 / false
2013/03/11 02:35:56:964 INFO - AddressSearcherTest.getElevate 0202201022010004002 / 青森県 / false
2013/03/11 02:35:56:964 INFO - AddressSearcherTest.getElevate 0202201022010006001 / 青森県 / false
2013/03/11 02:35:56:964 INFO - AddressSearcherTest.getElevate 0202201022010006004 / 青森県 / false
2013/03/11 02:35:56:965 INFO - AddressSearcherTest.getElevate 0202201022010007003 / 青森県 / false
2013/03/11 02:35:56:965 INFO - AddressSearcherTest.getElevate 0202201022010008003 / 青森県 / false
2013/03/11 02:35:56:965 INFO - AddressSearcherTest.getElevate 0202201022010009000 / 青森県 / false
2013/03/11 02:35:56:965 INFO - AddressSearcherTest.getElevate 0202201022010011001 / 青森県 / false
2013/03/11 02:35:56:965 INFO - AddressSearcherTest.getElevate 0202201022010011004 / 青森県 / false

先ほどまで2件目にあった id=0202201022010002001 が無くなりましたね。

このように、特定のクエリから特定のidを除外する事ができます。

◯ 広告