高亮顯示

Solr 中的高亮顯示允許在查詢回應中包含與使用者查詢匹配的文件片段。

這些片段包含在查詢回應的特殊區段(highlighting 區段)中,並且用戶端會使用其中包含的格式提示來決定如何向使用者呈現程式碼片段。片段是文件欄位的一部分,其中包含來自查詢的匹配項,有時也稱為「程式碼片段」或「段落」。

高亮顯示的可配置性非常高,或許比 Solr 的任何其他部分都高。 有許多參數用於片段大小、格式、排序、備份/替代行為以及更多難以分類的選項。 儘管如此,高亮顯示使用起來非常簡單。

使用方式

高亮顯示要求您在架構中定義了 uniqueKey

常見高亮顯示器參數

您需要設定 hlhl.fl 參數,以啟用返回高亮顯示結果。 下表說明這些參數以及其他一些支援的參數。 請注意,許多高亮顯示參數支援依欄位覆寫,例如:f.title_txt.hl.snippets

hl

選用

預設值:false

使用此參數啟用或停用高亮顯示。 如果您想要使用高亮顯示,則必須將此設定為 true

hl.method

選用

預設值:unified

要使用的高亮顯示實作/引擎。 可接受的值為:unifiedoriginalfastVector

請參閱下方的選擇高亮顯示器部分,以瞭解可用高亮顯示器之間差異的詳細資訊。

hl.fl

選用

預設值:df 的值

指定要高亮顯示的欄位清單,以逗號或空格分隔。 這些必須是「已儲存」的。 可以使用 *(星號)的萬用字元來比對欄位 glob,例如 text_*,甚至 * 來高亮顯示所有可進行高亮顯示的欄位。 當使用 * 時,請考慮新增 hl.requireFieldMatch=true

請注意,此處列出的欄位應與查詢中參考的欄位具有相容的文字分析(在架構中定義)。 可能需要修改 hl.qhl.qparser 及/或修改文字分析。

以下範例使用本機參數語法和擴展 DisMax (eDisMax) 查詢剖析器來高亮顯示 hl.fl 中的欄位

&hl.fl=field1 field2&hl.q={!edismax qf=$hl.fl v=$q}&hl.qparser=lucene&hl.requireFieldMatch=true

預設值為 df 參數的值,而該參數本身沒有預設值。

hl.q

選用

預設值:q 的值

用於高亮顯示的查詢。 此參數可讓您高亮顯示與用於搜尋文件的詞彙或欄位不同的詞彙或欄位。 設定此參數時,您可能還需要設定 hl.qparser

預設值為 q 參數的值(已剖析)。

hl.qparser

選用

預設值:請參閱說明

用於 hl.q 查詢的查詢解析器。僅在設定 hl.q 時適用。

預設值為 defType 參數的值,而 defType 參數的預設值為 lucene

hl.requireFieldMatch

選用

預設值:false

如果設定為 false,則無論已解析的查詢參照哪個欄位,所有查詢詞彙都會針對每個要醒目提示的欄位 (hl.fl) 進行醒目提示。如果設定為 true,則只有與要醒目提示的欄位對齊的查詢詞彙才會被醒目提示。

如果查詢參照的欄位與要醒目提示的欄位不同,且它們具有不同的文字分析方式,則查詢可能不會醒目提示它應該醒目提示的查詢詞彙,反之亦然。使用的分析是針對要醒目提示的欄位 (hl.fl) 的分析,而不是查詢欄位的分析。

hl.queryFieldPattern

選用

預設值:none

類似於 hl.requireFieldMatch,但允許比對多個欄位,例如 q=fieldA:one OR fieldB:two OR fieldC:three hl.fl=fieldA hl.queryFieldPattern=fieldA,fieldB

也允許 hl.fl 欄位不存在於查詢中,例如 q=fieldA:one OR fieldB:two hl.fl=fieldZ hl.queryFieldPattern=fieldA

如果同時指定了 hl.queryFieldPatternhl.requireFieldMatch=true,則會靜默忽略 hl.queryFieldPattern

hl.usePhraseHighlighter

選用

預設值:true

如果設定為 true,Solr 將會以精確的短語形式醒目提示短語查詢(和其他進階的位置敏感查詢)。如果設定為 false,則短語的各部分將會醒目提示在任何地方,而不是僅在形成指定短語時醒目提示。

hl.highlightMultiTerm

選用

預設值:true

如果設定為 true,Solr 將會醒目提示萬用字元查詢(和其他 MultiTermQuery 子類別)。如果設定為 false,則它們將完全不會被醒目提示。

hl.snippets

選用

預設值:1

指定每個欄位要產生的最大醒目提示片段數。可能會產生從零到此值的任何數量的片段。

hl.fragsize

選用

預設值:100

指定要考慮用於醒目提示的片段的大概大小(以字元為單位)。使用 0 表示不應考慮片段,並且應使用整個欄位值。

hl.tag.pre

選用

預設值:<em>

(對於原始醒目提示器,為 hl.simple.pre)指定要在醒目提示的詞彙之前使用的「標籤」。這可以是任何字串,但最常見的是 HTML 或 XML 標籤。

hl.tag.post

選用

預設值:</em>

(對於原始醒目提示器,為 hl.simple.post)指定要在醒目提示的詞彙之後使用的「標籤」。這可以是任何字串,但最常見的是 HTML 或 XML 標籤。

hl.encoder

選用

預設值:空白

如果為空白,則會傳回儲存的文字,而不會由醒目提示器執行任何逸出/編碼。如果設定為 html,則會對特殊的 HTML/XML 字元進行編碼(例如,& 會變成 &amp;)。永遠不會對前置和後置片段字元進行編碼。

hl.maxAnalyzedChars

選用

預設值:51200

尋找醒目提示的字元限制,超過此限制將不會進行醒目提示。這主要只是針對分析型偏移來源的效能考量,因為它是最慢的。請參閱結構描述選項和效能考量

根據選擇的醒目提示器(透過 hl.method),還支援更多參數。

查詢回應中的醒目提示

在查詢的回應中,Solr 會將醒目提示資料包含在與文件分開的部分中。由用戶端決定如何處理此回應並向使用者顯示醒目提示。

使用 Solr 隨附的範例文件,我們可以了解其運作方式

針對類似以下的查詢所做的回應

https://127.0.0.1:8983/solr/gettingstarted/select?hl=on&q=apple&hl.fl=manu&fl=id,name,manu,cat

我們會收到類似以下的回應(為了節省空間而稍微截斷)

{
  "response": {
    "numFound": 1,
    "start": 0,
    "docs": [{
      "id": "MA147LL/A",
      "name": "Apple 60 GB iPod with Video Playback Black",
      "manu": "Apple Computer Inc.",
      "cat": [
        "electronics",
        "music"
      ]
    }]
  },
  "highlighting": {
    "MA147LL/A": {
      "manu": [
        "<em>Apple</em> Computer Inc."
      ]
    }
  }
}

請注意兩個部分 docshighlightingdocs 部分包含查詢的 fl 參數所要求的文件欄位(僅限 "id"、"name"、"manu" 和 "cat")。

highlighting 部分包含每個文件的 ID,以及包含醒目提示部分的欄位。在此範例中,我們使用 hl.fl 參數來表示我們想要醒目提示 "manu" 欄位中的查詢詞彙。當該欄位中與查詢詞彙比對時,它將會包含在清單中每個文件 ID 的內容中。

選擇醒目提示器

Solr 提供 HighlightComponentSearchComponent),它位於搜尋處理程式的預設元件清單中。它在多個實際的醒目提示實作/引擎(或簡稱為「醒目提示器」)上提供某種統一的 API,這些實作/引擎會進行醒目提示的處理。

多個醒目提示器支援許多參數,有時實作詳細資料和語意會有些不同,因此在切換醒目提示器時,請不要期望獲得完全相同的結果。您應該使用 hl.method 參數來選擇醒目提示器。

有三種醒目提示器可供選擇,可以在執行階段使用 hl.method 參數進行選擇,依一般建議排序如下

統一醒目提示器

hl.method=unified

統一醒目提示器是最新型的醒目提示器(截至 Solr 6.4),它以選項中效能最高且最精確的醒目提示器而聞名。它可以處理一般需求,並可能透過外掛程式/延伸處理其他需求。我們建議您將此醒目提示器作為第一選擇。

UH 非常精確地醒目提示查詢,因此忠實於底層 Lucene 查詢實際比對的內容。其他醒目提示器會更自由地醒目提示詞彙(過度醒目提示)。對於深奧/自訂查詢,此醒目提示器比其他醒目提示器更有可能支援它。

此醒目提示器的一個強大優勢是,您可以選擇設定 Solr 在底層索引中放入更多資訊,以加速大型文件的醒目提示;支援多種設定,甚至可以針對每個欄位進行設定。其他醒目提示器的偏移來源幾乎沒有這種彈性。下面會詳細介紹。

有一些原因不選擇此醒目提示器:段落評分不考慮查詢中的增強。有些使用者希望有更多/更好的段落斷行彈性。「替代」回退選項更為原始。

原始醒目提示器

hl.method=original

原始醒目提示器,有時稱為「標準醒目提示器」或「預設醒目提示器」,是 Lucene 最初的醒目提示器 – 具有高度自訂選項的可靠選擇。其查詢精確度足以滿足大多數需求,儘管它不像統一醒目提示器那樣好/完美。

原始醒目提示器通常會即時分析儲存的文字,以便醒目提示。如果可用,它將使用完整的詞彙向量。如果文字不是「儲存」的,而是在 doc values (docValues="true") 中,則此醒目提示器可以與其搭配使用。

此醒目提示器的缺點是效能;它通常比統一醒目提示器慢兩倍。儘管它是最可自訂的,但它沒有基於 BreakIterator 的片段器(其他所有片段器都有),這可能會對某些語言造成挑戰。

快速向量醒目提示器

hl.method=fastVector

快速向量醒目提示器需要欄位上的完整詞彙向量選項(termVectorstermPositionstermOffsets),並且已針對此最佳化。它幾乎與原始醒目提示器一樣可設定,但有一些變數。

此醒目提示器特別支援多色醒目提示,這樣可以使用不同的標記在片段中表示不同的查詢字詞,通常表示為具有唯一顏色的 HTML 標籤。

此醒目提示器的查詢表示形式不如原始醒目提示器或統一醒目提示器那樣進階:例如,它無法與 surround 解析器很好地搭配使用,並且有許多與具有停用詞的查詢相關的已知錯誤。

快速向量醒目提示器和原始醒目提示器都可以一起用於搜尋請求中,以使用其中一種醒目提示器醒目提示某些欄位,並使用另一種醒目提示器醒目提示其他欄位。相反地,統一醒目提示器只能專門選擇。

統一醒目提示器專門透過搜尋參數進行設定。相反地,原始醒目提示器和快速向量醒目提示器的某些設定是在 solrconfig.xml 中設定的。「techproducts」configset 中有一個後者的穩健範例。

除了以下詳細資訊之外,還可以在Solr javadocs中找到更多資訊。

結構描述選項和效能考量

醒目提示的內部基本是偵測與查詢比對的個別字詞的偏移。有些醒目提示器可以透過結構描述中定義的分析鏈執行儲存的文字,有些醒目提示器可以從發佈中查找它們,有些醒目提示器可以從詞彙向量中查找它們。這些選擇有不同的取捨

  • 分析:統一醒目提示器和原始醒目提示器支援。如果您不刻意設定以下其他選項,則醒目提示器將會即時(在醒目提示期間)分析儲存的文字,以計算偏移。

    這種方法的優點是,您的索引不會隨著醒目提示非絕對必要的任何額外資料而變大。

    缺點是醒目提示速度與要處理的文字量大致呈線性關係,其中一個很大的因素是分析鏈的複雜性。

    對於「短」文字,這是個不錯的選擇。或者,它可能不是短文字,但您優先考慮較小的索引和索引速度,而不是醒目提示效能。

  • 發佈:統一醒目提示器支援。將 storeOffsetsWithPositions 設定為 true。這會將適量的額外資料新增至索引,但它可以大幅加速醒目提示,尤其是與較長文字欄位的分析相比。

    但是,除非新增「輕量」詞彙向量,否則萬用字元查詢將會回退至分析。

    • 搭配詞彙向量(輕量):僅統一醒目提示器支援。若要啟用此模式,請將 termVectors 設定為 true,但不要在要醒目提示的欄位上設定其他與詞彙向量相關的選項。

      這會向索引加入比僅使用 storeOffsetsWithPositions 更多的資料,但又不像啟用所有額外的詞向量選項那麼多。只有在使用萬用字元查詢時,才會由醒目提示器存取詞向量,並且會防止回溯分析已儲存的文字。

      這絕對是在大型文字欄位上醒目提示萬用字元查詢最快的方式。

  • 詞向量(完整):Unified、FastVector 和 Original Highlighters 均支援。將 termVectorstermPositionstermOffsets 設定為 true,並可視情況將 termPayloads 設定為進階使用案例。

    這會大幅增加索引的權重,大小與壓縮的儲存文字類似。如果您使用 Unified Highlighter,則不建議使用此設定,因為它比具有輕量詞向量的 Posting 慢且笨重。但是,如果另一個使用案例已經需要完整的詞向量,這可能會有意義。

Unified Highlighter

Unified Highlighter 除了先前列出的參數外,還支援以下額外參數

hl.offsetSource

選用

預設值:請參閱說明

預設情況下,Unified Highlighter 通常會選取正確的偏移來源(請參閱上方)。但是,在從一個偏移來源遷移到另一個尚未完成的偏移來源時,可能會出現不明確的情況。

偏移來源可以明確設定為以下其中之一:ANALYSISPOSTINGSPOSTINGS_WITH_TERM_VECTORSTERM_VECTORS

hl.fragAlignRatio

選用

預設值:0.33

此參數會影響段落中第一個相符項目(即醒目提示的文字)的位置。

預設值 0.33 表示將相符項目對齊到左三分之一。值 0.0 表示將相符項目對齊到左側,而 1.0 則表示對齊到右側。此設定是盡力而為的提示,因為存在各種因素。當有大量文字需要醒目提示時,降低此數字可以大幅提升效能。

hl.fragsizeIsMinimum

選用

預設值:true

true 時,hl.fragsize 參數會被視為(軟)最小片段大小;如果文字足夠,則片段至少會達到此大小。當 false 時,它是一個最佳目標 — 醒目提示器平均會產生此長度的醒目提示。false 設定速度較慢,尤其是在有大量文字且 hl.bs.type=SENTENCE 時。

hl.tag.ellipsis

選用

預設值:請參閱說明

預設情況下,每個程式碼片段都會以獨立值傳回(如同其他醒目提示器)。設定此參數可改為傳回一個字串,並以該文字作為分隔符號。注意:這可能會在未來移除。

hl.defaultSummary

選用

預設值:false

如果 true,則在無法產生正確的醒目提示程式碼片段時,請使用文字的前導部分作為程式碼片段。

hl.score.k1

選用

預設值:1.2

指定 BM25 詞頻正規化參數 'k1'。例如,可以將其設定為 0,僅根據相符的查詢詞彙數量對段落進行排名。

hl.score.b

選用

預設值:0.75

指定 BM25 長度正規化參數 'b'。例如,可以將其設定為 "0",以在排名時完全忽略段落的長度。

hl.score.pivot

選用

預設值:87

指定 BM25 平均段落長度(以字元為單位)。

hl.bs.language

選用

預設值:無

指定將文件劃分為段落的斷詞器語言。

hl.bs.country

選用

預設值:無

指定將文件劃分為段落的斷詞器國家/地區。

hl.bs.variant

選用

預設值:無

指定將文件劃分為段落的斷詞器變體。

hl.bs.type

選用

預設值:SENTENCE

指定將文件劃分為段落的斷詞器類型。可以是 SEPARATORSENTENCEWORD*、CHARACTERLINEWHOLESEPARATOR 是一個特殊的值,會根據 hl.bs.separator 中使用者提供的字元分割文字。

hl.bs.separator

選用

預設值:無

指出要在哪個字元上斷開文字。僅在您已定義 hl.bs.type=SEPARATOR 時使用。

當文字已事先經過處理,在所需的醒目提示段落邊界處具有特殊的分界字元時,這會很有用。此字元仍將以段落的最後一個字元的形式出現在文字中。

hl.weightMatches

選用

預設值:true

告知 UH 使用 Lucene 的「權重相符」API,而不是執行 SpanQuery 轉換。這是反映查詢最準確的醒目提示模式。此外,詞組將以整體形式醒目提示,而不是逐字醒目提示。目前,當醒目提示多個欄位時,此設定會大幅降低 unified highlighter 的速度。

如果 hl.usePhraseHighlighterhl.multiTermQuery 設定為 false,則無論您將其設定為什麼,此設定實際上都會是 false

Original Highlighter

Original Highlighter 除了先前列出的參數外,還支援以下額外參數

hl.mergeContiguous

選用

預設值:false

指示 Solr 將連續的片段摺疊成單一片段。值 true 表示連續的片段將摺疊成單一片段。

hl.maxMultiValuedToExamine

選用

預設值:Integer.MAX_VALUE

指定在停止之前要檢查的多值欄位中的最大項目數。如果先達到限制,然後才找到任何相符項目,則可能會傳回零個結果。

如果與 maxMultiValuedToMatch 一起使用,則會先達到哪個限制,就由該限制決定何時停止搜尋。

hl.maxMultiValuedToMatch

選用

預設值:Integer.MAX_VALUE

指定在停止之前,在多值欄位中找到的最大相符項目數。

如果也定義了 hl.maxMultiValuedToExamine,則會先達到哪個限制,就由該限制決定何時停止搜尋。

hl.alternateField

選用

預設值:無

指定如果 Solr 無法產生程式碼片段(也就是說,沒有任何詞彙相符),則用作備份預設摘要的欄位。

hl.maxAlternateFieldLength

選用

預設值:0

指定要傳回的欄位最大字元數。任何小於或等於 0 的值表示欄位的長度不受限制。

此參數僅與 hl.alternateField 參數一起使用。

hl.highlightAlternate

選用

預設值:true

如果設定為 truehl.alternateFieldName 處於活動狀態,則 Solr 將顯示整個替代欄位,並醒目提示出現的項目。如果使用 hl.maxAlternateFieldLength=N,則 Solr 會傳回最佳相符片段周圍最多 N 個字元。

如果設定為 false,或者如果替代欄位中也沒有相符項目,則替代欄位將在不醒目提示的情況下顯示。

hl.formatter

選用

預設值:simple

選取醒目提示輸出的格式設定器。目前,唯一合法的值是 simple,它會以可自訂的前置和後置文字程式碼片段包圍醒目提示的詞彙。

hl.simple.prehl.simple.post

選用

預設值:請參閱說明

指定在使用 simple 格式設定器時,應在醒目提示的詞彙之前 (hl.simple.pre) 和之後 (hl.simple.post) 出現的文字。預設值是 <em></em>

hl.fragmenter

選用

預設值:gap

指定醒目提示文字的文字程式碼片段產生器。標準片段產生器為 gap,它會建立固定大小的片段,並在多值欄位中具有間隙。

另一個選項是 regex,它會嘗試建立類似於指定正規表示式的片段。

hl.regex.slop

選用

預設值:0.6

當使用 regex 片段產生器 (hl.fragmenter=regex) 時,此參數會定義片段產生器可以偏離理想片段大小(由 hl.fragsize 指定)的因數,以容納正規表示式。

例如,hl.fragsize=100 的容錯值為 0.2,則應該產生長度介於 80 到 120 個字元之間的片段。使用 regex 片段產生器時,通常最好提供稍微較小的 hl.fragsize 值。

hl.regex.pattern

選用

預設值:無

指定片段化的正規表示式。這可用於擷取句子。

hl.regex.maxAnalyzedChars

選用

預設值:10000

指示 Solr 在使用 regex 片段產生器時,僅分析欄位中的這麼多個字元(之後,片段產生器會產生固定大小的片段)。

請注意,將複雜的正規表示式套用至大型欄位會消耗大量計算資源。

hl.preserveMulti

選用

預設值:false

如果 true,則多值欄位會按照它們儲存在索引中的順序傳回所有值。如果 false,則只會傳回符合醒目提示請求的值。

hl.payloads

選用

預設值:true

hl.usePhraseHighlightertrue,且索引的欄位具有 Payload 但沒有詞向量時(通常非常少見),索引的 Payload 將會與 Posting 一起讀入醒目提示器的記憶體索引中。

如果可能會發生這種情況,並且您知道您不需要它們進行醒目提示(也就是說,您的查詢不會依 Payload 篩選),那麼您可以將其設定為 false 來節省一些記憶體。

Original Highlighter 具有外掛程式架構,可讓新功能在 solrconfig.xml 中註冊。「techproducts」設定組會明確顯示大部分這些設定。您可以使用它作為指南,提供您自己的元件,以包含 SolrFormatterSolrEncoderSolrFragmenter

FastVector Highlighter

如果並非所有欄位都應使用 FVH 醒目提示,則 FastVector Highlighter (FVH) 可以與 Original Highlighter 結合使用。在這種模式下,為所有應使用 FVH 的欄位設定 hl.method=originalf.yourTermVecField.hl.method=fastVector。請注意,Original Highlighter 使用 hl.simple.pre,而 FVH(和其他醒目提示器)使用 hl.tag.pre,這是一件很煩人的事。

除了上面的 Common Highlighter Parameters 之外,上面的 Original Highlighter 中記錄的以下參數也受 FVH 支援

  • hl.alternateField

  • hl.maxAlternateFieldLength

  • hl.highlightAlternate

以下是 FVH 支援的其他參數

hl.fragListBuilder

選用

預設值:weighted

程式碼片段片段化演算法。weighted fragListBuilder 使用 IDF 權重來排序片段。

其他選項為 single,它會以一個程式碼片段傳回整個欄位內容,或者為 simple。您可以使用此參數選取 fragListBuilder,或在 solrconfig.xml 中修改現有的實作,透過新增 "default=true" 將其設為預設值。

hl.fragmentsBuilder

選用

預設值:default

片段產生器負責格式化片段,預設會使用 <em></em> 標記(如果未定義 hl.tag.prehl.tag.post)。

另一個預先設定的選項是 colored,這是如何使用片段產生器將 HTML 插入程式碼片段中以實現彩色醒目提示的範例(如果您選擇的話)。您也可以實作自己的片段產生器(如果願意)。您可以使用此參數選取片段產生器,或在 solrconfig.xml 中修改現有的實作,透過新增 "default=true" 將其設為預設值。

hl.boundaryScanner

請參閱下方 將邊界掃描器與 FastVector Highlighter 搭配使用

hl.bs.*

請參閱下方 將邊界掃描器與 FastVector Highlighter 搭配使用

hl.phraseLimit

選用

預設值:5000

在搜尋最高分詞組時,要分析的最大詞組數。

hl.multiValuedSeparatorChar

選用

預設值:空格字元

用於分隔多值欄位中一個值與下一個值的文字。預設值為「 」(空格)。

將邊界掃描器與 FastVector Highlighter 搭配使用

FastVector Highlighter 偶爾會截斷醒目提示的詞彙。若要防止這種情況發生,請在 solrconfig.xml 中實作邊界掃描器,然後使用 hl.boundaryScanner 參數來指定醒目提示的邊界掃描器。

Solr 支援兩種邊界掃描器:breakIteratorsimple

breakIterator 邊界掃描器

breakIterator 邊界掃描器考量了地區設定和邊界類型,因此開箱即用就能提供卓越的效能。在大多數情況下,您會想要使用 breakIterator 邊界掃描器。若要實作 breakIterator 邊界掃描器,請將此程式碼新增至您的 solrconfig.xml 檔案的 highlighting 區段,並根據您的應用程式調整類型、語言和國家/地區值。

<boundaryScanner name="breakIterator" class="solr.highlight.BreakIteratorBoundaryScanner">
   <lst name="defaults">
     <str name="hl.bs.type">WORD</str>
     <str name="hl.bs.language">en</str>
     <str name="hl.bs.country">US</str>
   </lst>
</boundaryScanner>

hl.bs.type 參數的可能值為 WORD、LINE、SENTENCE 和 CHARACTER。

simple 邊界掃描器

simple 邊界掃描器會掃描指定最大字元值 (hl.bs.maxScan) 和常見分隔符號(例如標點符號)(hl.bs.chars) 的詞彙邊界。若要實作 simple 邊界掃描器,請將此程式碼新增至您的 solrconfig.xml 檔案的 highlighting 區段,並根據您的應用程式調整值。

<boundaryScanner name="simple" class="solr.highlight.SimpleBoundaryScanner" default="true">
   <lst name="defaults">
     <str name="hl.bs.maxScan">10</str>
     <str name="hl.bs.chars">.,!?\t\n</str>
   </lst>
</boundaryScanner>