1

先週、Drupal の solr 検索から句読点を削除することについて質問を投稿しました。それはSolr 4を使用していました。しかし、それ以来、私が行っている開発はsolr 4からsolr 5に変更され、現在は同じ問題を抱えていますが、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"/>
4

1 に答える 1

0

私が試した Solr ソリューションはどれも残念ながら効果がなかったので、Drupal 側から解決したところ、はるかに簡単であることがわかりました。以下のコードは、すべての特殊文字と数字を置き換え、文字列を小文字に変換してから、solr ドキュメントに追加します。2 番目の関数は、それを利用可能な並べ替え方法に追加します。

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'));
}
于 2016-06-01T14:20:47.990 に答える