索引文字列抽出についての設定

索引文字列抽出について

検索のためのインデックスを作成する際、索引として登録するために文書を切り分ける必要があります。このために使用されるのが、トークナイザーです。

基本的に、トークナイザーによって切り分けられた単位よりも小さいものは、検索を行ってもヒットしません。例えば、「東京都に住む」という文を考えます。いま、この文が「東京都」「に」「住む」というようにトークナイザーによって分割されたとします。この場合、「東京都」という語で検索を行った場合はヒットします。しかし、「京都」という語で検索を行った場合はヒットしません。そのためトークナイザーの選択は重要です。

Fess の場合デフォルトでは StandardTokenizer+CJKBigramFilter が使用されていますが、schema.xml の analyzer 部分を設定することでトークナイザーを変更することができます。

CJKBigramFilterについて

StandardTokenizer+CJKBigramFilter は日本語のようなマルチバイトの文字列に対しては bi-gram 、つまり二文字ずつインデックスを作成します。この場合、1文字の語を検索することはできません。

StandardTokenizerについて

StandardTokenizer は日本語のようなマルチバイトの文字列に対しては uni-gram 、つまり一文字ずつインデックスを作成します。そのため、検索漏れが少なくなります。また、CJKTokenizerの場合、1文字のクエリを検索することができませんが、StandardTokenizerを使用すると検索可能になります。しかし、インデックスサイズが増えるので注意してください。

下記の例のように solr/core1/conf/schema.xml の analyzer 部分を変更することで、StandardTokenizer を使用できます。

<schema name="fess" version="1.4">
  <types>
    <fieldType name="text" class="solr.TextField" positionIncrementGap="100">
      <analyzer type="index">
        <charFilter class="solr.MappingCharFilterFactory" mapping="mapping_ja.txt"/>
        <tokenizer class="solr.StandardTokenizerFactory"/>
  :
      </analyzer>
      <analyzer type="query">
        <charFilter class="solr.MappingCharFilterFactory" mapping="mapping_ja.txt"/>
        <tokenizer class="solr.StandardTokenizerFactory"/>
  :

また、webapps/fess/WEB-INF/classes/app.diconでデフォルトで有効になっているuseBigramをfalseに変更します。

:
  <component name="queryHelper" class="jp.sf.fess.helper.impl.QueryHelperImpl">
      <property name="useBigram">true</property>
:

設定後、 Fess を再起動します。