簡體   English   中英

當存在動態字段時,Solr 突出顯示不適用於多個字段 hl.fl

[英]Solr highlighting does not work with multiple fields hl.fl when dynamic field is present

我的索引中有一個動態文本字段bar_*並希望 Solr 返回該字段的突出顯示。 所以我運行的是:

q=gold&hl=true&hl.fl=bar_*

它按預期工作,但如果我向hl.fl添加更多字段,它會停止工作。 例如

q=gold&hl=true&hl.fl=bar_*,foo

筆記:

  • bar_*foo字段在索引/架構中,這里沒有錯誤。
  • 只是將請求重寫為q=gold&hl=true&hl.fl=bar_*&hl.fl=fooq=gold&hl=true&hl.fl=bar_* foo沒有幫助。
  • 我在 Solr JIRA 中沒有發現關於該主題的任何錯誤。

有誰知道如何咬這個。 我看到的可能的解決方法是:

  1. 使用hl.fl=* 但這對性能不利。
  2. 為我的動態字段明確指定所有可能的字段名稱。 但我一點也不喜歡那樣。

我不知道使用的是什么版本,但似乎這是以前 Solr 版本的錯誤,我可以確認在 Solr 7.3 中它按預期工作。

curl -X GET \
  'http://localhost:8983/solr/test/select?q=x_ggg:Test1%20OR%20bar_x:Test2&hl=true&hl.fl=%2A_ggg,foo,bar_%2A' \
  -H 'cache-control: no-cache'

更正確的方法是: hl.fl=bar_*,foo,*_ggg (使用,或空格作為分隔符)。

當您從hl.fl參數中刪除星號hl.fl字段突出顯示停止工作時,這有助於避免長時間調試,因為該字段不再作為正則表達式處理。

以下是 Solr 7.3 源代碼中的點,我們可以在其中跟蹤此行為:

  1. Solr 調用org.apache.solr.highlight.SolrHighlighter#getHighlightFields
  2. 在處理字段之前,值被,或空格org.apache.solr.util.SolrPluginUtils#splitorg.apache.solr.util.SolrPluginUtils#split
  private final static Pattern splitList=Pattern.compile(",| ");

  /** Split a value that may contain a comma, space of bar separated list. */
  public static String[] split(String value){
     return splitList.split(value.trim(), 0);
  }
  1. 拆分的結果轉到方法org.apache.solr.highlight.SolrHighlighter#expandWildcardsInHighlightFields

在文檔中還提到了預期合同https://lucene.apache.org/solr/guide/7_3/highlighting.html

hl.fl 指定要突出顯示的字段列表。 接受以逗號或空格分隔的字段列表,Solr 應為其生成突出顯示的片段。

*(星號)通配符可用於匹配字段全局變量,例如 text_* 甚至 * 以突出顯示所有可以突出顯示的字段。 使用 * 時,請考慮添加 hl.requireFieldMatch=true。

如果未定義,將使用為 df 查詢參數定義的默認值。

嘗試

q=gold&hl=true&hl.fl=bar_*&hl.fl=foo

在深入研究 Solr 源代碼( org.apache.solr.highlight.SolrHighlighter#getHighlightFields )后,我找到了一個解決方法。 Solr 將hl.fl內容解釋為正則表達式模式。 所以我將 hl.fl 指定為:

hl.fl=bar_*|foo

即使用| 而不是逗號。 這對我來說非常有效。

順便說一句,我在互聯網上沒有找到這方面的文檔。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM