Apache Luceneの検証(1): 最新版をソースコードからビルド

## はじめに

検索プラットフォームとして注目を浴びている`Apache Solr(アパッチ ソーラー)`や`Elasticsearch(エラスティックサーチ)`、
いずれも検索ライブラリ`Apache Lucene(アパッチ ルシーン)`を利用し、
転置索引の作成と高度な全文検索を実現しています。
Apache Lucene に実際触れながら、その機能を理解してみることにします。

※ 全文検索のインデックスやトークナイズの基本は、以下拙文をご参照ください

https://qiita.com/mingchun_zhao/items/00a62daff310010b08dd

## Apache Lucene とは

※ 引用元: https://ja.wikipedia.org/wiki/Apache_Lucene
 
- Apacheトップレベルプロジェクトの1つで、`Doug Cutting`によって開発
- Java製のFLOSSの検索ライブラリ
    - `FLOSS(フロス)`は、`Free/Libre and Open Source Software`の頭字語
    - 自由ソフトウェアとオープンソースをまとめた表現
- 強力な文書インデキシング及び検索機能を提供
- スペルチェック、ハイライト、テキスト解析機能を提供
- 日本語のテキスト解析を利用するためには、以下を利用
    - トークナイザー(形態素解析)
        - JapaneseTokenizer(Kuromoji)
        - JapaneseAnalyzer(Kuromoji)
    - アナライザー(フィルタリング・整形)
        - CJKTokenizer
        - CJKAnalyzer

## Apache Lucene のホームページ

https://lucene.apache.org/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523098/161a7523-856d-7565-1afb-34e6fc853ca0.png)

## Apache Lucene の GitHub リポジトリ

https://github.com/apache/lucene

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523098/83519b9d-d62f-0952-4859-84cb336cc099.png)


## 検証環境

OS: AlmaLinux 9

## 最新版のソースコードから Lucene をビルドする手順

### OpenJDK 19 をインストール

- dnf コマンドで OpenJDK 19 をインストール
```shell
sudo dnf install java-19-openjdk-devel -y
```

- 別バージョンのJavaが存在する場合、`alternatives`コマンドで切り替え
```shell
alternatives --config java

There are 2 programs which provide 'java'.

  Selection    Command
-----------------------------------------------
*+ 1           java-11-openjdk.x86_64 (/usr/lib/jvm/java-11-openjdk-11.0.18.0.10-2.el9_1.x86_64/bin/java)
   2           java-latest-openjdk.x86_64 (/usr/lib/jvm/java-19-openjdk-19.0.2.0.7-1.rolling.el9.x86_64/bin/java)

Enter to keep the current selection[+], or type selection number: 2
```

- Java バージョンを確認

```shell
java -version

openjdk version "19.0.2" 2023-01-17
OpenJDK Runtime Environment (Red_Hat-19.0.2.0.7-1.rolling.el9) (build 19.0.2+7)
OpenJDK 64-Bit Server VM (Red_Hat-19.0.2.0.7-1.rolling.el9) (build 19.0.2+7, mixed mode, sharing)
```

### Gradle 7.6 をインストール

- Gradle バイナリファイルをダウンロード

```shell
wget https://services.gradle.org/distributions/gradle-7.6-bin.zip -P /tmp
```

- `/opt/gradle`ディレクトリに解凍

```shell
unzip -d /opt/gradle /tmp/gradle-7.6-bin.zip
```

- Gradle の環境変数を設定するスクリプトを作成

```shell
sudo tee /etc/profile.d/gradle.sh <<EOF
export GRADLE_HOME=/opt/gradle/gradle-7.6
export PATH=\$GRADLE_HOME/bin:\$PATH
EOF
```

- スクリプトに実行権限を付与

```shell
chmod +x /etc/profile.d/gradle.sh
```

- 環境変数をロード

```shell
source /etc/profile.d/gradle.sh
```

- Gradle バージョンを確認

```shell
gradle -v

Welcome to Gradle 7.6!

Here are the highlights of this release:
 - Added support for Java 19.
 - Introduced `--rerun` flag for individual task rerun.
 - Improved dependency block for test suites to be strongly typed.
 - Added a pluggable system for Java toolchains provisioning.

For more details see https://docs.gradle.org/7.6/release-notes.html


------------------------------------------------------------
Gradle 7.6
------------------------------------------------------------

Build time:   2022-11-25 13:35:10 UTC
Revision:     daece9dbc5b79370cc8e4fd6fe4b2cd400e150a8

Kotlin:       1.7.10
Groovy:       3.0.13
Ant:          Apache Ant(TM) version 1.10.11 compiled on July 10 2021
JVM:          19.0.2 (Red Hat, Inc. 19.0.2+7)
OS:           Linux 5.14.0-162.12.1.el9_1.x86_64 amd64
```

### Lucene の Git リポジトリから最新版ソースコードをクローン

```shell
git clone https://github.com/apache/lucene.git
```

### Gradle ランチャスクリプト `gradlew` を実行

```shell
cd lucene
./gradlew

Downloading gradle-wrapper.jar from https://raw.githubusercontent.com/gradle/gradle/v7.6.0/gradle/wrapper/gradle-wrapper.jar
Generating gradle.properties
Downloading https://services.gradle.org/distributions/gradle-7.6-bin.zip
...........10%............20%...........30%............40%............50%...........60%............70%............80%...........90%............100%
Starting a Gradle Daemon, 1 incompatible Daemon could not be reused, use --status for details

> Task :help

Welcome to Gradle 7.6.

To run a build, run gradlew <task> ...

To see a list of available tasks, run gradlew tasks

To see more detail about a task, run gradlew help --task <task>

To see a list of command-line options, run gradlew --help

For more detail on using Gradle, see https://docs.gradle.org/7.6/userguide/command_line_interface.html

For troubleshooting, visit https://help.gradle.org

This is an experimental Lucene/Solr gradle build. See some
guidelines, ant-equivalent commands etc. under help/*; or type:

  gradlew :helpWorkflow         # Typical workflow commands.
  gradlew :helpTests            # Tests, filtering, beasting, etc.
  gradlew :helpFormatting       # Code formatting conventions.
  gradlew :helpJvms             # Using alternative or EA JVM toolchains.
  gradlew :helpDeps             # Declaring, inspecting and excluding dependencies.
  gradlew :helpForbiddenApis    # How to add/apply rules for forbidden APIs.
  gradlew :helpLocalSettings    # Local settings, overrides and build performance tweaks.
  gradlew :helpRegeneration     # How to refresh generated and derived resources.
  gradlew :helpGit              # Git assistance and guides.
  gradlew :helpIDEs             # IDE support.
  gradlew :helpPublishing       # Maven and other artifact publishing, signing, etc.

For the impatient, build the project with 'gradlew assemble'

BUILD SUCCESSFUL in 17s
3 actionable tasks: 1 executed, 2 up-to-date
```

数分の短い時間で無事 Lucene のビルドが終わりました。

## おわりに

Apache Luceneの最新版をソースコードからビルドしました。
次回は Lucene のチュートリアルを試してみます。
お楽しみに。