Fessでは、検索フィールドを追加することで、より柔軟に検索結果をカスタマイズできます。今回は、Fessのインデックスに新しいフィールドを追加し、検索機能を拡張する手順を紹介します。

フィールドの定義

まず、新しいフィールドを追加するには、app/WEB-INF/classes/fess_indices/fess/doc.json を編集します。このJSONファイルでは、Fessが管理するインデックスのスキーマを定義しています。properties セクションに新しいフィールドのデータ型や解析方法を設定します。

doc.jsonproperties 内で定義できるフィールドの種類として、以下を定義することができます。

  • keyword: 入力された文字列をそのまま扱う文字列型
  • text: 入力された文字列をテキスト解析して扱う文字列型
  • long: 符号付き64ビット整数型
  • float: 単精度浮動小数点数型
  • date: 日付型

今回は、category(製品カテゴリ)、description(製品説明)、release_date(リリース日)の3つのフィールドを追加する例で説明します。実際に使用する場合は、typeやformatなどはフィールドの属性にあわせて設定してください。この定義の詳細については、OpenSearchまたはElasticsearchのドキュメントを参照してください。

  "properties": {
    "category": {
        "type": "keyword"
    },
    "description": {
        "type": "text",
        "analyzer": "standard_analyzer",
        "search_analyzer": "standard_search_analyzer"
    },
    "release_date": {
        "type": "date"
    },
    ・・・
  }

doc.json の編集は、Fessが起動している状態で行っても問題ありません。

インデックスにフィールドを反映

定義したフィールドをインデックスに反映します。Fessの管理画面にログイン後、左メニュー「システム情報」>「メンテナンス」をクリックし、再インデクシング内の「エイリアスの更新」で「有効」にチェックを入れて「開始」ボタンをクリックします。

左メニュー「ダッシュボード」をクリックし、インデックスの中で「fess.yyyymmddhhmm」と表示されている、日付が新しいものを表示させます。「docs」0でない場合、日付が古い「fess.yyyymmdd」または「fess.yyyymmddhhmm」のインデックスと、「docs」の数が同じになるまで待ちます。インデックスが見当たらない場合は「>>」などで表示を切り替えてください。

新しいインデックス名を確認してマッピングされているかを確認します。「fess.202403190828」は、確認したインデックス名に置き換えてください。

# curl -XGET 'localhost:9200/fess.202403190828/_mapping?pretty'
{
  "fess.202403190828" : {
    "mappings" : {
      ・・・
      "properties" : {
        "category" : {
          "type" : "keyword"
        },
        "description" : {
          "type" : "text",
          "analyzer" : "standard_analyzer",
          "search_analyzer" : "standard_search_analyzer"
        },
        "release_date" : {
          "type" : "date"
        },
         ・・・
      }
    }
  }
}

マッピングが反映されていることを確認したら、日付が古い方の「fess.yyyymmdd〜」インデックスの「▼」を選択して、「delete index」をクリックします。確認ダイアログが表示されるので、「DELETE」をクリックします。

レスポンスの設定

追加したフィールドが検索結果に表示されるようにするには、app/WEB-INF/classes/fess_config.properties を編集して、検索結果のレスポンス形式や表示方法を設定します。今回は、以下のように設定して、検索結果に含めて、APIで検索可能にし、日付をソート対象とする設定をします。

query.additional.response.fields=category,description,release_date
query.additional.api.response.fields=category,description,release_date
query.additional.search.fields=category
query.additional.sort.fields=release_date

上記は、以下のような設定になります。

  • query.additional.response.fields: 検索結果のレスポンスに含めるフィールド
  • query.additional.api.response.fields: APIの検索結果のレスポンスに含めるフィールド
  • query.additional.search.fields: 検索条件として利用できるフィールド
  • query.additional.sort.fields: 検索結果のソートに使用されるフィールド

設定を保存したら、Fessのサービスを再起動してください。

クロールの実行

次にインデックスを作成します。今回はCSVファイルにデータを用意し、データストアクロール設定でクロールして作成します。CSVには以下を保存しています。

  • 1カラム目: 製品名
  • 2カラム目: 製品カテゴリ
  • 3カラム目: 製品説明
  • 4カラム目: リリース日
$ cat /tmp/csv/test.csv 
S00A1,Smartphone,This is a great smartphone with advanced features.,2023-03-15
T00A1,Tablet,This tablet offers great performance and portability.,2023-06-10
T00A2,Tablet,Experience the ultimate versatility with this cutting-edge tablet.,2023-09-25

管理画面の左メニュー「クローラー」>「データストア」>「新規作成」をクリックして、以下の項目を入力します。

  • 名前
  • ハンドラー名
  • パラメーター
  • スクリプト

「名前」には任意のクロール設定の名前を入力し、「ハンドラー名」は「CsvDataStore」を選択します。

パラメーターは以下を設定します。directories には、先ほど作成したcsvファイルを保存したディレクトリのパスを指定します。

directories=/tmp/csv
fileEncoding=Shift_JIS

スクリプトには以下を設定します。

url="http://SERVERNAME/" + cell1
host="SERVERNAME"
site="SERVERNAME"
content=cell1 + " " + cell2 + " " + cell3
digest=cell3
content_length=cell3.length()
last_modified=new java.util.Date()
category=cell2
description=cell3
release_date=new java.text.SimpleDateFormat("yyyy-MM-dd").parse(cell4)

クロール設定の作成後、左メニュー「システム」>「Default Crawler」を選択して、「いますぐ開始」をクリックします。

検索

クロール完了後、追加したフィールドが検索できるか確認してみましょう。検索キーワードとして設定したcategoryで値を検索できるかAPIで検索してみます。(検索結果はjqコマンドで整形し、一部省略しています。)

$ curl "http://localhost:8080/api/v1/documents?q=category:Smartphone" | jq .
{
  "q": "category:Smartphone",
  "record_count": 1,
  ・・・
  "data": [
    {
      "url": "http://SERVERNAME/S00A1",
      "title": "S00A1",
      ・・・
      "description": "This is a great smartphone with advanced features.",
      "release_date": "2023-03-15T00:00:00.000Z",
      "category": "Smartphone"
    }
  ]
}

categoryがSmartphoneのデータがヒットします。次にrelease_dateを降順で取得してみます。

$ curl "http://localhost:8080/api/v1/documents?q=*:*&sort=release_date.desc" | jq .
{
  "q": "*:*",
  "record_count": 3,
  ・・・
  "data": [
    {
      "url": "http://SERVERNAME/T00A2",
      "title": "T00A2",
      ・・・
      "description": "Experience the ultimate versatility with this cutting-edge tablet.",
      "release_date": "2023-09-25T00:00:00.000Z",
      "category": "Tablet"
    },
    {
      "url": "http://SERVERNAME/T00A1",
      "title": "T00A1",
      ・・・
      "description": "This tablet offers great performance and portability.",
      "release_date": "2023-06-10T00:00:00.000Z",
      "category": "Tablet"
    },
    {
      "url": "http://SERVERNAME/S00A1",
      "title": "S00A1",
      ・・・
      "description": "This is a great smartphone with advanced features.",
      "release_date": "2023-03-15T00:00:00.000Z",
      "category": "Smartphone"
    }
  ]
}

release_dateの降順で表示されます。

* * *

Fessでの検索フィールドの追加は、検索機能のカスタマイズに利用できます。さまざまな検索要件に合わせて検索フィールドを追加し、より効率的な検索体験を提供することが可能です。検索項目を追加したい場合などには、今回の方法を利用してみてください。