Lucene のアップグレード

This page contains breaking changes related to the upgrade of the Lucene library from version 3.3 to 7.3. 

変更

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

Several methods have been removed from the Jira code, because they're no longer needed. For some, we've provided alternatives you can use.

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)

変更点:

  • To index and store a field, use this method:

    addDocumentFieldsSearchable(final Document doc, final Issue issue)

  • To store a field without indexing it, use this method:

    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);
変更点を表で確認

Affected class

Code/items being changed

Changes and new code/items

com.atlassian.jira.util.BuildUtilsInfo#getLuceneVersion

com.atlassian.jira.util.BuildUtilsInfo#getLuceneVersion

None, no longer needed.

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

Method:

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

  • To index and store a field, use this method:

    addDocumentFieldsSearchable(final Document doc, final Issue issue)

  • To store a field without indexing it, use this method:

    addDocumentFieldsNotSearchable(final Document doc, final Issue issue)

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

Method:

getMaxFieldLength

None, no longer needed.

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

フィールド: EXPUNGE_DELETES_PCT_ALLOWED

None, no longer needed.

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 つのタイプから別のタイプに変換するための新しいメソッド変換

  • class used to have 3 constructors

従来のコンストラクタ ロジックは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 では、検索者のライフサイクルの管理元が明確ではありませんでした。

New classes:

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

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

AbstractOneDimensionalHitCollector DocumentHitCollector

AbstractOneDimensionalHitCollector DocumentHitCollector

public void doSetNextReader(LeafReaderContext context)
FieldableDocumentHitCollector class renamed 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
該当なし

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);

Lucene API exposed by Jira

Creating BooleanQuery

Using constructors to create boolean queries is no longer supported. Instead, you'll need to use the query builder.

See code examples...



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();

Creating Documents

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

See code examples...
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;


Creating Filters

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

See code examples...
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);

設定

Several configuration items have been removed, and substituted with the new ones.

Obsolete configuration New configuration

mergePolicy.setExpungeDeletesPctAllowed

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

JQL changes


あいまい検索

Old Lucene
New Lucene

text ~ "foo~0.5"

text ~ "foo~2"

Where 0 is an exact match and 2 allows 2 changes.

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

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

インデックスの再作成

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

最終更新日 2019 年 3 月 26 日

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

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