Lucene のアップグレード

このページには、Lucene ライブラリのバージョン 3.3 から 7.3 へのアップグレードに関連する大幅な変更が含まれています。 

変更

Jira コードおよび jira-lucene-dmz.jar

Jira コードから、不要になったいくつかのメソッドを削除しました。一部については、使用できる代わりのメソッドを提供しています。

com.atlassian.jira.util.BuildUtilsInfo#getLuceneVersion

変更点:

クラスが削除されました。 

com.atlassian.jira.issue.index.indexers.impl.VersionCustomFieldIndexer

変更されるメソッド:

public void addDocumentFields(final Document doc, final Issue issue, final Field.Index indexType)

変更点:

  • フィールドのインデックス作成および保存を行うには、このメソッドを使用します。

    addDocumentFieldsSearchable(final Document doc, final Issue issue)

  • インデックスを作成せずにフィールドを保存するには、このメソッドを使用します。

    addDocumentFieldsNotSearchable(final Document doc, final Issue issue)

com/atlassian/jira/config/properties/APKeys$JiraIndexConfiguration

変更点:

getMaxFieldLength は削除されました。 

com/atlassian/jira/config/properties/APKeys$JiraIndexConfiguration$MergePolicy

変更点:

EXPUNGE_DELETES_PCT_ALLOWED は削除されました。 

com.atlassian.jira.web.component.IssuePage 
com.atlassian.jira.web.component.IssuePager

変更点:

名前の変更 → com.atlassian.jira.web.component.ResultPage

名前の変更 → com.atlassian.jira.web.component.Pager

com.atlassian.jira.issue.search.SearchResults

変更点:  

 - これまでは List<Issue> の保持に使用

  • 現在 → holds List<T>

  • SearchService uses List<Issue>,SearchProvider uses List<DocumentWithId>

- メソッド getIssues → getResults に名前を変更

- new method transform for transforming results of one type to another

- class used to have 3 constructors → Old constructor logic moved to com.atlassian.jira.issue.search.IssueSearchResultsFactory and com.atlassian.jira.issue.search.DocumentSearchResultsFactory

com.atlassian.jira.issue.search.SearchProvider

変更点:

  • searchCount → 名前の変更 → getHitCount

  • search:
    • パラメータを com.atlassian.jira.issue.search.SearchQuery オブジェクトに含めるように変更

    • 新しいパラメータ fieldsToLoad。読み込むドキュメント フィールドを制限したり、空集合を渡してドキュメントのみを読み込んだりします。

  • 新しい戻り値の型 com.atlassian.jira.issue.search.DocumentWithId。読み込み済みの Lucene ドキュメントおよびその内部 Lucene ID を保持します。この ID は、現在の IndexReader のコンテキストでのみ有効です。これはキャッシュしないでください。 

  • Collector を使用する searchAndSort を削除 (Collector を使用する通常の検索は可能)。

    Collector collector = new MyCollector(); searchProvider.searchAndSort(query, user, collector, pager); return collector.getResults();

com.atlassian.jira.index.ManagedIndexSearcher

org.apache.lucene.search.IndexSearcher では、検索者のライフサイクルの管理元が明確ではありませんでした。

変更点:  

新しいクラスを 2 つ追加しました。

  • com.atlassian.jira.index.ManagedIndexSearcher は、手動で閉じる必要はありません。

  • com.atlassian.jira.index.UnmanagedIndexSearcher は、そのユーザーが閉じる必要があります。

AbstractOneDimensionalHitCollector
DocumentHitCollector

変更点:  

public void doSetNextReader(LeafReaderContext context) に変更されました。

FieldableDocumentHitCollector 

変更点:

クラスの名前を  FieldDocumentHitCollector に変更

MappedSortComparator  

public FieldComparator newComparator(String fieldname, int numHits, int sortPos, boolean reversed) は IOException  をスローします。

変更点:

public FieldComparator newComparator(String fieldname, int numHits, int sortPos, boolean reversed)

OneDimensionalTermHitCollector 


public OneDimensionalTermHitCollector (final String fieldId, final FieldVisibilityManager fieldVisibilityManager, final ReaderCache readerCache, final FieldManager fieldManager, final ProjectManager projectManager)

変更点:

public OneDimensionalTermHitCollector(final String fieldId, final FieldVisibilityManager fieldVisibilityManager, final ReaderCache readerCache, final FieldManager fieldManager

ReaderCache

Collection<String>[] get(LeafReader reader, String key, Supplier<Collection<String>[]> supplier);

JiraDocValues getDocValues(LeafReader indexReader, String field); 

変更点:

{@link ReaderCache} は Lucene {@link org.apache.lucene.index.DocValues} を使用しています。

JiraDocValues getDocValues(IndexReader indexReader, String field);

CustomFieldStattable

StatisticsMapper getStatisticsMapper(CustomField customField);

変更点:

コントラクトの変更。Jira 8.0 以降、"stattable" フィールドには次の型の doc value が必要です。

{@link org.apache.lucene.index.SortedDocValues},

{@link org.apache.lucene.index.SortedSetDocValues}、または {@link org.apache.lucene.index.BinaryDocValues}

com.atlassian.jira.jql.util.JqlDateSupport

変更点:

 getIndexedValue → を削除。日付は long 型としてインデックスに直接保存されるようになりました。

com.atlassian.jira.jql.util.JqlLocalDateSupport  

変更点:

 getIndexedValue を削除 → ローカル日付は long 型としてインデックスに直接保存されるようになりました。

com.atlassian.jira.util.LuceneUtils   

日付およびローカル日付を従来のストリングベースのインデックス形式に変換、またはその逆の変換を行うためのさまざまなメソッド。

変更点:

このクラスは削除されました。日付およびローカル日付は long 型としてインデックスに追加されます

com.atlassian.jira.issue.customfields.NaturallyOrderedCustomFieldsSearcher 

変更点:

1 つのメソッドにより拡張された SPI: public SortField.Type getSortFieldType();

com.atlassian.jira.index.NumberTools
com.atlassian.jira.util.LuceneNumericUtils

移行済み → com.atlassian.jira.lucenelegacy.NumberTools

移行済み → com.atlassian.jira.lucenelegacy.NumericUtils

com.atlassian.jira.issue.search.QueryPermissions

削除済み → com.atlassian.jira.issue.search.SearchQuery参照

com.atlassian.jira.issue.search.SearchQuery 

変更点:

  • QueryPermissions フィールドの削除
    • ApplicationUser user および boolean overrideSecurity を直接設定します。
    • user は、権限および com.atlassian.jira.jql.query.QueryCreationContext. の作成に使用されます。overrideSecurity = true の場合もこれは必要です。
  • create メソッドの削除:
  1. create(Query,QueryPermissions, org.apache.lucene.search.Query)
  2. create(Query,QueryPermissions)
  3. createNoPermissions(Query)  

    変更点:
    SearchQuery, をさらに構成するには以下を使用します。
    • SearchQuery.create(query, user)
    • overrideSecurity(true)
    • luceneQuery(andQuery);
変更点を表で確認

影響を受けるクラス

変更されているコード / アイテム

変更と新しいコード / アイテム

com.atlassian.jira.util.BuildUtilsInfo#getLuceneVersion

com.atlassian.jira.util.BuildUtilsInfo#getLuceneVersion

いいえ、不要です。

com.atlassian.jira.issue.index.indexers.impl.VersionCustomFieldIndexer

メソッド:

public void addDocumentFields(final Document doc, final Issue issue, final Field.Index indexType)

  • フィールドのインデックス作成および保存を行うには、このメソッドを使用します。

    addDocumentFieldsSearchable(final Document doc, final Issue issue)

  • インデックスを作成せずにフィールドを保存するには、このメソッドを使用します。

    addDocumentFieldsNotSearchable(final Document doc, final Issue issue)

com/atlassian/jira/config/properties/APKeys$JiraIndexConfiguration

メソッド:

getMaxFieldLength

いいえ、不要です。

com/atlassian/jira/config/properties/APKeys$JiraIndexConfiguration$MergePolicy

フィールド: EXPUNGE_DELETES_PCT_ALLOWED

いいえ、不要です。

com.atlassian.jira.web.component.IssuePage

com.atlassian.jira.web.component.IssuePager

com.atlassian.jira.web.component.IssuePage

com.atlassian.jira.web.component.IssuePager

名前の変更 → com.atlassian.jira.web.component.ResultPage

名前の変更 → com.atlassian.jira.web.component.Pager

com.atlassian.jira.issue.search.SearchResults

  • これまでは List<Issue> を保持

  • 現在: List<T> を保持

  • SearchServiceList<Issue> を使用、SearchProviderList<DocumentWithId> を使用

  • メソッド getIssues

名前変更 → getResults

結果を 1 つのタイプから別のタイプに変換するための新しいメソッド変換

  • クラスは過去に 3 つのコンストラクタを保持

従来のコンストラクタ ロジックはcom.atlassian.jira.issue.search.IssueSearchResultsFactory および com.atlassian.jira.issue.search.DocumentSearchResultsFactory に移行

com.atlassian.jira.issue.search.SearchProvider

searchCount  

名前の変更 → getHitCount

search

  • パラメータを com.atlassian.jira.issue.search.SearchQuery オブジェクトに含めるように変更

  • 新しいパラメータ fieldsToLoad。読み込むドキュメント フィールドを制限したり、空集合を渡してドキュメント id のみを読み込んだりします。


新しい戻り値の型 com.atlassian.jira.issue.search.DocumentWithId。読み込み済みの Lucene ドキュメントおよびその内部 Lucene ID を保持します。この ID は、現在の IndexReader のコンテキストでのみ有効です。これはキャッシュしないでください。 

Collector を使用する searchAndSort を削除 (Collector を使用する通常の検索は可能)。

Collector collector = new MyCollector(); searchProvider.searchAndSort(query, user, collector, pager); return collector.getResults();
MyLoader loader = new MyLoader(indexReader) { public void myCollect( int docId) { // your business logic with indexReader and docId } }; searchProvider.search(SearchQuery.create(query, user), pager, Collections.emptySet()) .getResults() .stream() .map(DocumentWithId::getDocId) .forEach(loader::myCollect); return loader.getResults();

com.atlassian.jira.index.ManagedIndexSearcher

org.apache.lucene.search.IndexSearcher では、検索者のライフサイクルの管理元が明確ではありませんでした。

新しいクラス:

  • com.atlassian.jira.index.ManagedIndexSearcher は、手動で閉じる必要はありません。

  • com.atlassian.jira.index.UnmanagedIndexSearcher は、そのユーザーが閉じる必要があります。

AbstractOneDimensionalHitCollector DocumentHitCollector

AbstractOneDimensionalHitCollector DocumentHitCollector

public void doSetNextReader(LeafReaderContext context)
FieldableDocumentHitCollector 名前が変更されたクラスFieldDocumentHitCollector
MappedSortComparator

public FieldComparator newComparator(String fieldname, int numHits, int sortPos, boolean reversed) 

IOException をスローします。

public FieldComparator newComparator(String fieldname, int numHits, int sortPos, boolean reversed)
OneDimensionalTermHitCollector public OneDimensionalTermHitCollector (final String fieldId, final FieldVisibilityManager fieldVisibilityManager, final ReaderCache readerCache, final FieldManager fieldManager, final ProjectManager projectManager) public OneDimensionalTermHitCollector(final String fieldId, final FieldVisibilityManager fieldVisibilityManager, final ReaderCache readerCache, final FieldManager fieldManager)

ReaderCache

Collection<String>[] get(LeafReader reader, String key, Supplier<Collection<String>[]> supplier);

JiraDocValues getDocValues(LeafReader indexReader, String field);

Jira 8.0 以降、{@link ReaderCache} は Lucene を使用します。

{@link org.apache.lucene.index.DocValuJiraDocValues getDocValues(IndexReader indexReader, String field);


CustomFieldStattable

StatisticsMapper getStatisticsMapper(CustomField customField);

コントラクトの変更。Jira 8.0 以降、"stattable" フィールドには次の型の doc value が必要です。

{@link org.apache.lucene.index.SortedDocValues}

{@link org.apache.lucene.index.SortedSetDocValues}、または {@link org.apache.lucene.index.BinaryDocValues}

                     
                  
com.atlassian.jira.jql.util.JqlDateSupport

getIndexedValue

削除されました。日付は long 型としてインデックスに直接保存されるようになりました。
com.atlassian.jira.jql.util.JqlLocalDateSupport

getIndexedValue

削除されました。ローカル日付は long 型としてインデックスに直接保存されるようになりました
com.atlassian.jira.util.LuceneUtils 日付およびローカル日付を従来のストリングベースのインデックス形式に変換、またはその逆の変換を行うためのさまざまなメソッド。クラス全体が削除されました。日付およびローカル日付は long 型としてインデックスに追加されました。
com.atlassian.jira.issue.customfields.NaturallyOrderedCustomFieldsSearcher
N/A

1 つのメソッドによって拡張された SPI: 

public SortField.Type getSortFieldType();

com.atlassian.jira.index.NumberTools

com.atlassian.jira.util.LuceneNumericUtils

移動されたクラス

移行済み → com.atlassian.jira.lucenelegacy.NumberTools

移行済み → com.atlassian.jira.lucenelegacy.NumericUtils

com.atlassian.jira.issue.search.QueryPermissions


削除済み → com.atlassian.jira.issue.search.SearchQuery参照
com.atlassian.jira.issue.search.SearchQuery
  • QueryPermissions フィールドは削除されました
  • create メソッドの削除:
  1. create(Query,QueryPermissions, org.apache.lucene.search.Query)
  2. create(Query,QueryPermissions)
  3. createNoPermissions(Query)
  • ApplicationUser user および boolean overrideSecurity を直接設定します
  • user は、権限および com.atlassian.jira.jql.query.QueryCreationContext. の作成に使用されます。overrideSecurity = true の場合もこれは必要です

SearchQuery, さらに構成するには以下を使用します。
SearchQuery.create(query, user)
.overrideSecurity(true)
.luceneQuery(andQuery);

Jira によって公開される Lucene API

BooleanQuery の作成

コンストラクタを使用したブール クエリの作成はサポートされなくなりました。代わりに、クエリ ビルダーを使用する必要があります。

コード例を参照...



Jira 7.x
BooleanQuery boolQuery = new BooleanQuery();
boolQuery.add(TermQueryFactory.nonEmptyQuery(fieldName), BooleanClause.Occur.MUST);
boolQuery.add(TermQueryFactory.visibilityQuery(fieldName), BooleanClause.Occur.MUST);
return boolQuery;
Jira 8.0
BooleanQuery.Builder boolQueryBuilder = new BooleanQuery.Builder();
boolQueryBuilder.add(TermQueryFactory.nonEmptyQuery(fieldName), BooleanClause.Occur.MUST);
boolQueryBuilder.add(TermQueryFactory.visibilityQuery(fieldName), BooleanClause.Occur.MUST);
return boolQueryBuilder.build();

ドキュメントの作成

ドキュメントでフィールドを指定するには、Field クラスのサブクラス (StringFieldTextFieldStoredField) を使用する必要があります。

コード例を参照...
Jira 7.x
Document document = new Document();       
document.add(new Field(ACTIVE, Boolean.toString(user.isActive()), YES, NOT_ANALYZED_NO_NORMS));
document.add(new Field(EMAIL, user.getEmailAddress(), YES, ANALYZED_NO_NORMS));
document.add(new Field(EXACT_DISPLAY_NAME, IdentifierUtils.toLowerCase(user.getDisplayName()), NO, NOT_ANALYZED_NO_NORMS));
return document;
Jira 8.0
Document document = new Document();      
document.add(new StringField(ACTIVE, Boolean.toString(user.isActive()), YES));document.add(new TextField(DISPLAY_NAME, user.getDisplayName(), YES));
document.add(new TextField(EMAIL, user.getEmailAddress(), YES));
document.add(new SortedDocValuesField(EXACT_USER_NAME, new BytesRef(IdentifierUtils.toLowerCase(user.getName()))));
return document;


フィルターの作成

org.apache.lucene.search.Filter クラスは、BooleanClause.Occur.FILTER が発生する通常の org.apache.lucene.search.Query に変更されました。

コード例を参照...
Jira 7.x
Query query = new TermQuery(new Term(fieldName, fieldValue));
Query filterQuery = new TermQuery(new Term(filterFieldName, filterFieldValue));
Filter filter = new QueryWrapperFilter(filterQuery);
issueSearcher.search(query, filter, maxHits);
Jira 8.0
Query query = new TermQuery(new Term(fieldName, fieldValue));
Query filterQuery = new TermQuery(new Term(filterFieldName, filterFieldValue));
Query queryWithFilter = new BooleanQuery.Builder()
                    .add(query, BooleanClause.Occur.MUST)
                    .add(filterQuery, BooleanClause.Occur.FILTER)
                    .build();
issueSearcher.search(queryWithFilter, maxHits);

構成

いくつかの設定項目が削除され、代わりに新しい項目が追加されました。

廃止された構成新しい構成

mergePolicy.setExpungeDeletesPctAllowed

mergePolicy.setForceMergeDeletesPctAllowed
mergePolicy.setUseCompoundFile indexWriterConfig.setUseCompoundFile
-mergePolicy.setReclaimDeletesWeight
-mergePolicy.setMaxCFSSegmentSizeMB

JQL の変更


あいまい検索

以前の Lucene
新しい Lucene

text ~ "foo~0.5"

text ~ "foo~2"

ここで、0 は完全一致、2 は 2 つの変更を許可します。

インデックスはスワップ ファイルとみなされる

doc value は仮想アドレス スペースに保存されるため、Java プロセスが多くのメモリ (3 倍のインデックス ファイル) を占有してしているかのように見える場合があります。これは実際の RAM ではなく、メモリにマップされたファイルです。これらは必要に応じてスワップ インおよびスワップ アウトされます。

インデックスの再作成

EAP 04 よりも前の Jira のすべてのバージョンから EAP 04 以降に移行する際、フォラグラウンドでの完全なインデックス再作成を実行する必要があります。EAP 04 では、Lucene インデックスで日付を保存する方法を変更しました。インデックス再作成をバックグラウンドで行うと、Lucene が望ましくない状態 (同じフィールド名でさまざまなタイプが混在する) になるため、目的を達成できません。

最終更新日 2019 年 8 月 13 日

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

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