以前の記事で、Apache Solrをインストールして構成し、Drupalで検索を整理する方法について説明しました。 さらに、フィールドと検索インデックスの設定を追加することを学びました。 この記事では、標準のフィールドと設定では不十分な場合に、独自のフィールドと設定を追加する方法について説明します。
前のパートを読んでいない人には、資料をよく理解するために読むことをお勧めします。
- Apache Solrパート1でのDrupal 7検索-基本設定
- Apache SolrでのDrupal 7 Searchパート2-インデックスの調整方法の学習
- Apache SolrでDrupal 7を検索するパート3-カスタムフィールドとオプションをインデックスに追加する方法を学ぶ
- Apache Solrパート4-ファセットフィルターでDrupal 7を検索する
- Apache SolrによるDrupal 7の検索パート5-ファセットフィルターウィジェット
- Apache Solrパート6を使用してDrupal 7で検索する-Apache Solr + Tomcatを構成する
- Apache SolrによるDrupal 7検索パート7-ロシア語の全文検索
フィールド
それでは、フィールドを追加することから始めましょう。 インデックスを作成するノードに、位置情報データを含む辞書への参照があるとしましょう。 その構造は次のようになります。
タスクは、最初のレベルの値のみにインデックスを付けることです。 ノードが属するエリア。 対応するフィールドをインデックスに追加すると、レベルに関係なく、すべての用語にインデックスが付けられます。 したがって、独自のフィールドを追加する必要があります。 このためには、2つの関数が必要です。 最初はentity_property_info_alterフックです。 このフックでは、エンティティに新しいフィールドを追加できます。 そのため、ノードに新しいフィールドを追加します。
/** * Implements hook_entity_property_info_alter. */ function test_search_entity_property_info_alter(&$info) { $info['node']['properties']['geo_first_level'] = array( 'type' => 'text', 'label' => t('Geo 1 level'), 'getter callback' => 'test_search_geo_first_level_getter_callback', ); }
2番目の関数はゲッターコールバック、この場合はtest_search_geo_first_level_getter_callbackです。 ノードのインデックス作成時に、フィールドの値を返す必要があります。 この値はインデックスに保存されます。
/** * Getter callback. */ function test_search_geo_first_level_getter_callback($item) { if ($geo = field_get_items('node', $item, 'field_geo')) { $parents = taxonomy_get_parents($geo[0]['tid']); if (empty($parents)) { if ($term = taxonomy_term_load($geo[0]['tid'])) { return $term->name; } } } return NULL; }
インデックス付きエンティティは、$アイテムとして渡されます。この例では、ノードオブジェクトです。 このノードに第1レベルの用語が含まれているかどうかを簡単に確認し、用語の名前をインデックス値として返します。
次に、インデックス設定に移動して、[フィールド]タブを選択します。
私たちの新しいフィールドはすでにインデックス作成に利用可能です。 ビュー設定で検索できるフィールドのリストに追加することを忘れないでください。
フィールドの複数の値にインデックスを付ける必要がある場合があります。 これを行うには、entity_property_info_alterフックで 'type' => 'list'を指定します。ゲッターコールバックでは、値の配列を返す必要があります。
たとえば、
return array('', '-', '');
フィルター
次に、インデックスを作成するノードを選択できるフィルターを追加してみましょう。 フィルタは同様の機能を実行します-ジオ辞書からの第1レベルの用語への参照を持つインデックスノードのみ。 これを行うには、search_api_alter_callback_infoフックでフィルターを宣言します。
/** * Implements hook_search_api_alter_callback_info(). */ function test_search_search_api_alter_callback_info() { $callbacks['search_api_alter_geo_level'] = array( 'name' => t('Filter by level of geo'), 'description' => t('Index only nodes with first level of term from vocabulary geo'), 'class' => 'SearchApiAlterGeoLevelFilter', // Filters should be executed first. 'weight' => -10, ); return $callbacks; }
test_searchモジュールのincludeフォルダーにフィルタークラスを含むファイルを配置しました。 モジュールの.infoファイルに含めることを忘れないでください。 たとえば、次のようになり
files[] = includes/callback_geo_level.inc
以下は、フィルター自体のコードです
<?php /** * Search API data alteration callback that adds an URL field for all items. */ class SearchApiAlterGeoLevelFilter extends SearchApiAbstractAlterCallback { public function alterItems(array &$items) { foreach ($items as $id => $item) { if ($geo = field_get_items('node', $item, 'field_geo')) { $parents = taxonomy_get_parents($geo[0]['tid']); // If term has parents. if (!empty($parents)) { unset($items[$id]); } } } } public function supportsIndex(SearchApiIndex $index) { return $index->item_type === 'node'; } }
alterItems関数では、第1レベル以外の用語を持つ要素を単に除外します。 これらのアイテムは索引付けされません。
フィルターを有効にするには、キャッシュを消去し、インデックス設定のワークフロータブに移動する必要があります。
フィルターを有効にした後、コンテンツのインデックスを再度作成する必要があります。 これで、第1レベルの辞書用語を持つノードのみがインデックスに分類されます。