Drupal 来自节点索引的词汇表类型方面 问题/动机

Drupal 来自节点索引的词汇表类型方面 问题/动机,drupal,solr,drupal-7,faceted-search,facet,Drupal,Solr,Drupal 7,Faceted Search,Facet,我正在使用搜索API与SOLR搜索API集成。目前,我有一个显示内容类型列表的节点索引和一个附加的刻面块(类别)。我的想法是创建另一个刻面块,通过列表标题的起始字母进行过滤 我想除了创建新的索引字段、将标题修剪为第一个字母,然后用它来过滤标题之外,我已经尝试了所有的方法(也许不是…)。这解决了我的问题。它将另一个字段添加到索引中,您可以从中创建方面 function wtc_glossary_search_api_alter_callback_info() { $callbacks['wtc

我正在使用搜索API与SOLR搜索API集成。目前,我有一个显示内容类型列表的节点索引和一个附加的刻面块(类别)。我的想法是创建另一个刻面块,通过列表标题的起始字母进行过滤


我想除了创建新的索引字段、将标题修剪为第一个字母,然后用它来过滤标题之外,我已经尝试了所有的方法(也许不是…)。

这解决了我的问题。它将另一个字段添加到索引中,您可以从中创建方面

function wtc_glossary_search_api_alter_callback_info() {
  $callbacks['wtc_glossary_alter_add_first_letter_title'] = array(
    'name' => t('First letter of listing title'),
    'description' => t("This module provides first letter of title for glossary view."),
    'class' => 'WtcAlterAddFirstLetter',
  );

  return $callbacks;
}

/**
 * Search API data alteration callback that adds the first letter of title  for glossary mode
 */
class WtcAlterAddFirstLetter extends SearchApiAbstractAlterCallback {

  public function alterItems(array &$items) {
    foreach ($items as $id => &$item) {
      if (!isset($item->FIELD_YOU_NEED)) {
        $item->search_api_title_first_letter = NULL;
        continue;
      }
      $item->search_api_title_first_letter = substr($item->FIELD_YOU_NEED,0,1);
    }
  }

  public function propertyInfo() {
    return array(
      'search_api_title_first_letter' => array(
        'label' => t('First Letter of FIELD_YOU_NEED'),
        'description' => t('For for listings in glossary mode.'),
        'type' => 'text',
      ),
    );
  }

}

这解决了我的问题。它将另一个字段添加到索引中,您可以从中创建方面

function wtc_glossary_search_api_alter_callback_info() {
  $callbacks['wtc_glossary_alter_add_first_letter_title'] = array(
    'name' => t('First letter of listing title'),
    'description' => t("This module provides first letter of title for glossary view."),
    'class' => 'WtcAlterAddFirstLetter',
  );

  return $callbacks;
}

/**
 * Search API data alteration callback that adds the first letter of title  for glossary mode
 */
class WtcAlterAddFirstLetter extends SearchApiAbstractAlterCallback {

  public function alterItems(array &$items) {
    foreach ($items as $id => &$item) {
      if (!isset($item->FIELD_YOU_NEED)) {
        $item->search_api_title_first_letter = NULL;
        continue;
      }
      $item->search_api_title_first_letter = substr($item->FIELD_YOU_NEED,0,1);
    }
  }

  public function propertyInfo() {
    return array(
      'search_api_title_first_letter' => array(
        'label' => t('First Letter of FIELD_YOU_NEED'),
        'description' => t('For for listings in glossary mode.'),
        'type' => 'text',
      ),
    );
  }

}

按内容类型筛选是可配置的,但如果您想按标题的第一个字母筛选,则需要进行自定义实现。似乎您的最后一种方法可以轻松完成您的目的。据我所知,该模块没有可以帮助您的钩子,因此您将不得不修改一些SearchApiFacet类。我已经做过了,但这并不漂亮,也不是很好的练习。你能举个例子吗?将有助于理解问题按内容类型筛选是可配置的,但如果您想按标题的第一个字母筛选,则需要进行自定义实现。似乎您的最后一种方法可以轻松完成您的目的。据我所知,该模块没有可以帮助您的钩子,因此您将不得不修改一些SearchApiFacet类。我已经做过了,但这并不漂亮,也不是很好的练习。你能举个例子吗?将有助于理解问题非常感谢您花时间发布您自己问题的解决方案。我能在网上找到的唯一一个例子是:)非常感谢你花时间发布你自己问题的解决方案。我在网上能找到的唯一一个例子:)