Jira 11 の検索 API の非推奨機能およびアップグレード ガイド

検索ツールでより柔軟なオプションを利用できるように、Jira の検索機能に抽象化レイヤーが導入されます。この変更により、公開 API から Lucene への参照が削除され、OpenSearch がサポートされるようになります。この変更にかかわらず、検索とインデックス化のパフォーマンスは現在の Lucene 実装と同じで、スムーズな移行が保証されます。

このページでは、削除される Lucene 固有の API とコンポーネントについて概説し、プラットフォームに依存しない検索 API への移行方法について詳しく説明します。 

アトラシアンでは、アップグレード ドキュメントに積極的に取り組んでおり、今後もこの記事を更新していく予定です。さらに、すべての変更を変更ログでお知らせするため、簡単に追跡できます。変更ログについては、こちらをご確認ください。

このページの内容

重大な API の変更を検索 API に移行する

Due to the length of some of the strings in the table below, you might not see the full table width. To see more to the right or left, hover your mouse over the table before using it to scroll.

Module

廃止

手順

jira-api

com.atlassian.jira.index.EntitySearchExtractor and its subtypes:

  1. com.atlassian.jira.index.ChangeHistorySearchExtractor
  2. com.atlassian.jira.index.CommentSearchExtractor
  3. com.atlassian.jira.index.IssueSearchExtractor

代わりに com.atlassian.jira.search.entity.EntityIndexExtractor およびそのサブタイプを使用します。

  1. com.atlassian.jira.search.entity.ChangeHistoryIndexExtractor
  2. com.atlassian.jira.search.entity.CommentIndexExtractor
  3. com.atlassian.jira.search.entity.IssueIndexExtractor
  4. com.atlassian.jira.search.entity.WorkLogIndexExtractor

jira-api

com.atlassian.jira.issue#getIssue(org.apache.lucene.document.Document issueDocument)

com.atlassian.jira.issue#getIssue(com.atlassian.jira.search.Document issueDocument) を使用する

jira-api

com.atlassian.jira.jql.query.ClauseQueryFactory and related interfaces:


  1. com.atlassian.jira.jql.query.QueryFactoryResult
  2. com.atlassian.jira.jql.query.OperatorSpecificQueryFactory
  3. com.atlassian.jira.issue.customfields.searchers.CustomFieldSearcherClauseHandler#getClauseQueryFactory() およびすべての実装


代わりに com.atlassian.jira.search.jql.ClauseQueryMapper および対応するインターフェイスを使用します。

  1. com.atlassian.jira.search.Query
  2. com.atlassian.jira.search.jql.OperatorSpecificQueryFactory
  3. 代わりに com.atlassian.jira.issue.customfields.searchers.CustomFieldSearcherClauseHandler#getClauseQueryMapper() を実装します。

jira-api

com.atlassian.jira.issue.search.LuceneFieldSorter

LuceneFieldSorter を拡張するクラス: TextFieldSorter

Also deprecated, related searcher SPIs:

  1. com.atlassian.jira.issue.customfields.MultiSortableCustomFieldSearcher
  2. com.atlassian.jira.issue.customfields.SortableCustomFieldSearcher
  3. com.atlassian.jira.issue.customfields.NaturallyOrderedCustomFieldSearcher#getSortFieldType()

The deprecated class is used for two use cases: sorting, and loading field values from the index. Depending on the use case, replace LuceneFieldSorter with one of the following:

  • com.atlassian.jira.search.FieldSort
  • com.atlassian.jira.search.FieldValueLoader

Migrate related searcher SPIs to the corresponding replacements:

  1. com.atlassian.jira.issue.customfields.FieldSortsCustomFieldSearcher
  2. com.atlassian.jira.issue.customfields.ValueLoaderCustomFieldSearcher
  3. com.atlassian.jira.issue.customfields.NaturallyOrderedCustomFieldSearcher#getSortFieldType() の実装を削除します。
    たとえば、既定に戻します。

Lucene

  • org.apache.lucene.search.SortField
    • 例: com.atlassian.jira.issue.fields.NavigableField#getSortFields()
  • org.apache.lucene.search.FieldComparatorSource
    • 例: com.atlassian.jira.issue.fields.NavigableField#getSortComparatorSource()

代わりに com.atlassian.jira.search.FieldSort を使用します。

従来の FieldComparatorSource に対応するサブタイプのいずれかを使用します。

  • NaturalFieldSort: replaces StringSortComparatorSource and LongSortComparatorSource
  • ValueLoaderFieldSort: replaces MappedSortComparator
  • ScoreComputedFieldSort: replaces UserHistoryFieldComparatorSource

jira-api

  • com.atlassian.jira.issue.index.indexers.FieldIndexer
  • com.atlassian.jira.issue.index.indexers.CustomFieldIndexer

Base classes:

  • com.atlassian.jira.issue.index.indexers.impl.BaseFieldIndexer
  • com.atlassian.jira.issue.index.indexers.impl.AbstractCustomFieldIndexer

com.atlassian.jira.issue.index.indexers.impl パッケージのインデクサーの実装:

  • ExactTextCustomFieldIndexer
  • LocalDateIndexer
  • NumberCustomFieldIndexer
  • UserCustomFieldIndexer
  • VersionCustomFieldIndexer

非推奨のインデクサーは次の SPI によって Jira に登録されますが、これも非推奨です。
com.atlassian.jira.issue.search.searchers.information.SearcherInformation#getRelatedIndexers()

  • FieldIndexer を受け入れる GenericSearcherInformation コンストラクター。
  • ユーティリティ クラス com.atlassian.jira.issue.index.indexers.impl.FieldIndexerUtil 。これは Lucene 固有であり、削除される予定です。

代わりに com.atlassian.jira.search.issue.index.indexers.FieldIndexer または com.atlassian.jira.search.issue.index.indexers.CustomFieldIndexer を実装するか、その基本クラスのいずれかを拡張します。

  • com.atlassian.jira.search.issue.index.indexers.impl.VisibilityBaseFieldIndexer
  • com.atlassian.jira.search.issue.index.indexers.impl.BaseCustomFieldIndexer

com.atlassian.jira.search.issue.index.indexers.impl パッケージのインデクサーの実装を使用します。

次の SPI を使用して新しいインデクサーを登録します。
com.atlassian.jira.issue.search.searchers.information.SearcherInformation#getIndexers()

com.atlassian.jira.issue.search.searchers.information.GenericSearcherInformation.Builder を使用して SearchInformation インスタンスを構築します。

Lucene

org.apache.lucene.document.Document

To read indexed documents, use com.atlassian.jira.search.Document instead.

ドキュメントにインデックスを付けるには、代わりに com.atlassian.jira.search.field.FieldValueCollector を使用します。

Also see:

Lucene

org.apache.lucene.search.Query

代わりに com.atlassian.jira.search.Query を使用します。

非推奨の実装では、空のクエリは match none クエリになることに注意してください。OpenSearch に対応する新しい検索 API では、空のクエリは match all クエリではありません。

空のクエリは DefaultMatchNoDocsQuery.INSTANCE に置き換えることができます。

jira-api

DocumentConstants#LUCENE_SORTFIELD_PREFIX

代わりに #SORTFIELD_PREFIX を使用します。

jira-api

com.atlassian.jira.issue.index.SecurityIndexingUtils methods that return a org.apache.lucene.util.ByteRef:

  • generateProjectPermissionFieldContents(...)
  • generateIssueLevelPermissionContents(...)

Use these following methods that return a String instead:

  • generateProjectPermissionFieldContentString(...)
  • generateIssueLevelPermissionContentString(...)

jira-core

com.atlassian.jira.index.EntityDocumentFactory and its subtypes:

  1. com.atlassian.jira.issue.index.ChangeHistoryDocumentFactory
  2. com.atlassian.jira.issue.index.CommentDocumentFactory
  3. com.atlassian.jira.issue.index.IssueDocumentFactory
  4. com.atlassian.jira.issue.index.WorklogDocumentFactory

Use these interfaces instead:

  1. com.atlassian.jira.search.issue.index.ChangeHistoryFieldValuesFactory
  2. com.atlassian.jira.search.issue.index.CommentFieldValuesFactory (will come in a future version)
  3. com.atlassian.jira.search.issue.index.IssueFieldValuesFactory
  4. com.atlassian.jira.search.issue.index.WorklogFieldValuesFactory (will come in a future version)

Lucene

org.apache.lucene.search.IndexSearcher, including its subtypes:

  • com.atlassian.jira.index.ManagedIndexSearcher
  • com.atlassian.jira.index.UnmanagedIndexSearcher
  • com.atlassian.jira.index.DelayCloseSearcher

代わりに com.atlassian.jira.search.index.IndexSearcher を使用します。

jira-lucene-dmz

com.atlassian.jira.issue.search.SearchProvider

代わりに com.atlassian.jira.search.issue.IssueDocumentSearchService を使用します。

jira-lucene-dmz

com.atlassian.jira.issue.search.SearchProviderFactory

com.atlassian.jira.search.index.IndexAccessorRegistry を使用する

  • If searching for issues, use getIssuesIndexAccessor to get IndexAccessor
  • Otherwise, use getOrCreate(final String indexName) to get IndexAccessor

Then get IndexSearcher from IndexAccessor

jira-lucene-dmz

com.atlassian.jira.issue.search.parameters.lucene.JiraBytesRef

代替はありません。これらのメソッドは Lucene 固有のものであり、今後の OpenSearch には関係ありません。

jira-lucene-dmz

com.atlassian.jira.issue.search.parameters.lucene.sort.JiraLuceneFieldFinder

代替はありません。これらのメソッドは Lucene 固有のものであり、今後の OpenSearch には関係ありません。

jira-lucene-dmz

com.atlassian.jira.issue.search.SearchQuery

ドキュメントベースの検索には代わりにcom.atlassian.jira.search.request.SearchRequest を使用し、課題の検索には com.atlassian.jira.issue.search.SearchRequest を使用します。

jira-lucene-dmz

com.atlassian.jira.issue.index.IssueIndexManager

代わりに com.atlassian.jira.search.index.IndexAccessor または com.atlassian.jira.issue.index.IssueIndexer を使用してください。

jira-lucene-dmz

com.atlassian.jira.issue.index.TemporaryIndexProvider

このクラスは、非推奨の Lucene インデックスのみをサポートしています。OpenSearch などの他の検索プラットフォームをサポートする代替はありません。

Lucene

org.apache.lucene.search.Collector

Lucene コレクターの移行ガイドを参照してください。

REST API

PUT: /api/2/cluster/index-snapshot/{nodeId}

REST API ドキュメントを参照

代替はありません。このエンドポイントは Lucene 固有のものであり、今後の検索 API や OpenSearch には関係ありません。

jira-api

com.atlassian.jira.issue.customfields.SortableCustomField

com.atlassian.jira.issue.fields.CustomField#compare()

非推奨の SortableCustomField インターフェイスは、課題をソートするための比較機能を備えています。これは、ソートに対応したカスタム フィールド サーチャーにカスタム フィールドが関連付けられていない場合に代わりに使用されます。

ソート機能付きのカスタム フィールド サーチャーをすでに使用しているカスタム フィールドでは、追加の変更なしで SortableCustomField を削除できます。ソートに SortableCustomField を使用するカスタム フィールドでは、ソート機能付きのカスタム フィールド サーチャーを実装し、それをカスタム フィールド タイプに関連付ける必要があります。

同等のカスタム フィールド サーチャーの実装を次に示します。

  • FieldSortsCustomFieldSearcher を実装します。
  • getFieldSorts() で、DefaultValueLoaderFieldSort を返します。
  • FieldValueLoader を DefaultValueLoaderFieldSort に渡して、非推奨の SortableCustomField#Compare で使用されるのと同じ比較ロジックを備えた getComparator() を実装します。

可能であれば、ValueLoaderFieldSort よりも NaturalFieldSort のような他のより効率的なソート タイプを使用することが推奨されます。

複数値フィールドの場合、SortableCustomField ではその課題のフィールド値の完全なリストを使用する比較機能を実装できます。それに対し、ValueLoaderFieldSort では 1 つの値だけを比較できます。課題のフィールドに複数の値がある場合、その課題を他の課題と比較するために最も小さい値が使用されます (DefaultValueLoaderFieldSort#getComparator() に基づく)。

jira-core

com.atlassian.jira.issue.fields.ImmutableCustomField#compare()

com.atlassian.jira.issue.fields.ImmutableCustomField#getSortComparatorSource()

com.atlassian.jira.issue.customfields.SortableCustomField については、移行に関する上記の注記を参照してください。

jira-api

com.atlassian.jira.issue.statistics.StatisticsMapper

  • getDocumentConstant()
  • getValueFromLuceneField()

FieldValueLoader インターフェイスのメソッドを使用します。

  • field()
  • loadValue()

jira-lucene-dmz

com.atlassian.jira.web.bean.StatisticAccessorBean

com.atlassian.jira.web.bean.StatisticMapWrapper

jira-api モジュールの検索 API の代替機能を使用します。

  • com.atlassian.jira.issue.statistics.StatisticsMapGenerator
  • com.atlassian.jira.issue.statistics.StatisticMapWrapper

jira-api

com.atlassian.jira.search.jql.ClauseQueryMapperToFactoryAdapter

このクラスは、検索 API への移行を容易にすることを目的として Jira 10.4 で追加された一時的なヘルパーです。Jira 11 にはこれに代わるものはありません。

jira-api

com.atlassian.jira.plugin.versionpanel.impl.GenericTabPanel

SearchProvider をパラメーターとして持つコンストラクター。

SearchProvider をパラメーターとして持たないコンストラクターを使用します。

Lucene

com.atlassian.jira.index.stats.IndexSearcherWithStats

代わりに com.atlassian.jira.search.index.stats.IndexSearcherWithStats を使用します。

日付フィールドのインデックス化

LocalDate は、エポックからの日数単位ではなく、エポックからのミリ秒単位で保存されるようになりました。この変更は、期限、作業時間ログの日付、カスタム日付ピッカーの各フィールドに影響します。ただし、このアップデートは、検索 API を介したデータ アクセスではシームレスに行われます。

Jira 11 をインストールする際には、再インデックス化が必要になります。日付をインデックス化する場合は、エポックからのミリ秒単位でインデックス化してください。

ドキュメントの合計数をクエリで照会する

インデックス内のドキュメントの総数をクエリで照会するには、既存の Lucene API を使用できます。課題の総数を取得する方法を次に示します。

// Deprecated searchProviderFactory.getSearcher(SearchProviderFactory.ISSUE_INDEX).getIndexReader().numDocs()

検索 API サービスには、ドキュメントのカウント用に IssueDocumentSearchService.getHitCount() メソッドが用意されています。ただし、Jira には、空の JQL クエリに対して一致なしを強制的に返す設定オプションがあります。

String JIRA_EMPTY_JQL_RETURNS_NO_DATA_ENABLED = "jira.empty.jql.returns.no.data.enabled"

このオプションを有効にした場合、getHitCount では空の JQL が解析されて 0 が返されます。

代わりに次の方法を使用すると、jira.empty.jql.returns.no.data.enabled の設定に関係なく、正しいドキュメント数が返されます。

  • このオプションを使用するには、IssueIndexAccessorRegistry を依存関係として自動注入してから、次のように実行します。
issueIndexAccessorRegistry.getIssuesIndexAccessor().getSearcher() .getHitCount(SearchRequest.builder().query(DefaultMatchAllDocsQuery.INSTANCE).documentType(DocumentTypes.ISSUE).build(), timeout);
  • 結果を現在の ApplicationUser に基づく権限フィルターでフィルタリングする必要がある場合は、次の手順に従ってください。
    1. DefaultQueryFactory を依存関係として自動注入します。

    2. フィルター クエリを DefaultMatchAllDocsQuery.INSTANCE に設定した空の JQL クエリを使用します。

      var query = defaultQueryFactory.createIssueQuery(applicationUser, jqlQuery, DefaultMatchAllDocsQuery.INSTANCE, overrideSecurity);
      issueIndexAccessorRegistry.getIssuesIndexAccessor().getSearcher()
        .getHitCount(SearchRequest.builder().query(query).documentType(DocumentTypes.ISSUE).build(), timeout);

OpenSearch との互換性確保のための準備を行う

検索 API は、コードをコンパイルして Lucene と OpenSearch の両方でシームレスに機能できるようにする統一されたインターフェイスを提供しますが、これら 2 つの基盤となる検索プラットフォームには、特に規模とパフォーマンスに関して根本的な違いがあることを認識する必要があります。プラグイン コードが検索 API に対してコンパイルを行い、Lucene で正常に動作する場合でも、OpenSearch で実行した場合は特定の操作に新しい制限が適用されることがあります。

検索結果のサイズ制限

Lucene には、1 回の検索リクエストで返されるドキュメントの数に制限はありませんが、OpenSearch にはその制限があります。既定値は 10,000 ですが、OpenSearch インデックスの max_result_window で設定可能です。

関連する OpenSearch ドキュメントをご確認ください。

ドキュメントを無制限または大量に取得せずに済むようにアプリを設計することをお勧めします。そのためのテクニックとして、ページネーションや集計 API を使用できます。

避けられない場合は、searchStream API を使用すると、検索プラットフォームに関係なく大量の結果を安全にストリーミングできます。

用語クエリのサイズ制限

com.atlassian.jira.search.query.TermSetQuery は、Lucene の TermsQuery と同等の検索 API です。

Lucene とは異なり、OpenSearch では用語クエリに含めることができる用語の数に制限があります。この制限は max_terms_count で設定可能で、既定値は 65.536 です。

関連する OpenSearch ドキュメントをご確認ください。


最終更新日 2025 年 6 月 4 日

この内容はお役に立ちましたか?

はい
いいえ
この記事についてのフィードバックを送信する
Powered by Confluence and Scroll Viewport.