【问题标题】:Can't ignore punctuation in titles - Solr 5 and Drupal不能忽略标题中的标点符号 - Solr 5 和 Drupal
【发布时间】:2016-04-22 16:19:37
【问题描述】:

前一周我发布了一个关于从 Drupal 的 solr 搜索中删除标点符号的问题。那是使用 Solr 4。但是,从那时起,我正在做的开发已经从 solr 4 更改为 solr 5,现在我遇到了同样的问题,但 Can't remove punctuation in Solr 的修复不再有效。这会导致在按标题排序时出现问题,因为很多内容标题都带有引号。

<field name="label" type="text" indexed="true" stored="true" termVectors="true" omitNorms="true"/>
<fieldType name="text" class="solr.TextField" positionIncrementGap="100">
  <analyzer>
    <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.StopFilterFactory"
            ignoreCase="true"
            words="stopwords.txt"
            />
    <filter class="solr.WordDelimiterFilterFactory"
            protected="protwords.txt"
            generateWordParts="1"
            generateNumberParts="1"
            catenateWords="1"
            catenateNumbers="1"
            catenateAll="0"
            splitOnCaseChange="0"
            preserveOriginal="1"/>
    <filter class="solr.LengthFilterFactory" min="2" max="100" />
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/>
    <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
  </analyzer>
</fieldType>

我尝试添加以下规则,但撇号和引号会顽固地留在那里,并且在按标题排序时会干扰,将开头带引号的任何内容放在列表的最前面。

    <charFilter class="solr.HTMLStripCharFilterFactory" />
    <filter class="solr.ApostropheFilterFactory"/>
    <filter class="solr.PatternReplaceFilterFactory"
        pattern="^\p{Punct}*(.*?)\p{Punct}*$"
        replacement="$1"/>

【问题讨论】:

  • 您是否尝试过相同的字段类型...?或者尝试删除 char 过滤器...
  • 我刚刚尝试删除 char 过滤器,但没有成功。你能解释一下你对相同字段类型的含义吗?

标签: drupal solr solr5


【解决方案1】:

不幸的是,我尝试的所有 Solr 解决方案都无效,所以我从 Drupal 方面解决了它,结果证明它要简单得多。下面的代码替换所有特殊字符和数字,将字符串转换为小写,然后将其添加到 solr 文档中。第二个函数将它添加到可用的排序方法中。

function my_module_apachesolr_index_document_build(ApacheSolrDocument $document, $entity, $entity_type, $env_id) {

      # to keep letters only
      $title = trim($entity->title);
      $title = str_replace(' ', '_', $title);
      $title = preg_replace('/[^a-z]+/i', '', $title);
      $title = strtolower($title);
      $document->addField('ss_new_sort',$title);

}

function my_module_apachesolr_query_prepare(DrupalSolrQueryInterface $query) {
      $query->setAvailableSort('ss_new_sort', array('title' => t('Title'), 'default' => 'asc'));
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-08
    • 2017-05-05
    • 1970-01-01
    • 1970-01-01
    • 2012-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多