Tagger 處理器

Tagger 請求處理器,又稱「SolrTextTagger」,是一個「文字標籤器」。

給定一個包含名稱類欄位的字典(Solr 索引),您可以將文字張貼到此請求處理器,它將傳回每個出現的名稱,以及偏移量和其他所需的檔案中繼資料。它用於命名實體辨識 (NER)。

標籤器不會執行任何自然語言處理 (NLP)(Lucene 文字分析除外),因此它被認為是一個「樸素標籤器」,但它目前來說絕對是有用的,並且可以使用它作為關鍵組件來建構更完整的 NER 或 ERD(實體辨識與消除歧義)系統。SolrTextTagger 也可能用於查詢以了解查詢,或用於大型文件。

若要了解如何使用它,請跳至下方的教學

Tagger 請求處理器尚未支援分片索引。它可以在以 SolrCloud 模式執行的叢集中使用,但儲存標籤字典的集合必須是單一分片集合。儘管有此限制,但可以支援數千萬到數億個名稱(文件);最大值主要僅受限於記憶體。

Tagger 組態

若要設定標籤器,您的 Solr 結構描述需要 2 個欄位

  • 唯一鍵欄位(請參閱唯一鍵,了解如何在結構描述中定義唯一鍵)。建議的欄位設定:設定 docValues=true

  • 標籤欄位,必須是 TextField,在索引鏈的結尾(而非查詢鏈)使用 ConcatenateGraphFilterFactory:在該篩選器上設定 preservePositionIncrements=false。建議的欄位設定:omitNorms=trueomitTermFreqAndPositions=true,並且可能指定張貼格式 - 請參閱效能提示

文字欄位的索引分析鏈,除了結尾需要 ConcatenateGraphFilterFactory 之外,其他部分可以根據您的匹配偏好選擇任何分詞器和過濾器。例如,它可以有多詞同義詞,並使用 WordDelimiterGraphFilterFactory。但是,不要使用 FlattenGraphFilterFactory,因為它會干擾 ConcatenateGraphFilterFactory。位置間隙(例如,停用詞)會被忽略;目前尚不支援將間隙視為重要。

另一方面,文字欄位的查詢分析鏈則有更多限制。同一位置不應該有詞元 (token),因此不應進行同義詞擴展 — 改在索引時進行。支援停用詞(或任何其他引入位置間隙的過濾器)。在執行時,標籤器可以設定為將其視為標籤中斷或忽略它。

您的 solrconfig.xml 需要定義 solr.TagRequestHandler,它像搜尋處理器一樣支援 defaultsinvariantsappends 區段。

如需設定範例,請跳至下方的教學

標籤器參數

標籤器的執行完全可以透過請求參數設定。只有 field 是必需的。

field

必要

預設值:無

作為字典的標籤欄位。這是必需的;您可能會在請求處理器中指定它。

fq

選用

預設值:無

您可以指定一些篩選查詢來限制用於標籤的字典。此參數與 solr.SearchHandler 使用的參數相同。

rows

選用

預設值:10000

要傳回的最大文件數。此參數與 solr.SearchHandler 使用的參數相同。

fl

選用

預設值:無

Solr 用於列出要傳回欄位的標準參數。此參數與 solr.SearchHandler 使用的參數相同。

overlaps

選用

預設值:NO_SUB

選擇演算法來決定在重疊的標籤集中應保留哪些標籤,以及應修剪哪些標籤。選項如下:

  • ALL:發出所有標籤。

  • NO_SUB:不發出完全包含在另一個標籤內的標籤(即,沒有子標籤)。

  • LONGEST_DOMINANT_RIGHT:給定一個重疊標籤的叢集,發出最長的標籤(按字元長度)。如果長度相同,則選擇最右邊的標籤。移除與此標籤重疊的任何標籤,然後重複該演算法,以可能找到可以在叢集中發出的其他標籤。

matchText

選用

預設值:false

如果為 true,則在標籤回應中傳回相符的文字。這將觸發標籤器在標籤之前完全緩衝輸入。

tagsLimit

選用

預設值:1000

回應中要傳回的最大標籤數。在此之後,標籤動作將有效停止。

skipAltTokens

選用

預設值:false

如果為 true,則會抑制可能發生的錯誤,例如,如果您在分析器中啟用查詢時的同義詞擴展(通常不應該這樣做)。除非您知道無法避免這種詞元,否則讓此設定保持為預設值 false

ignoreStopwords

選用

預設值:false

一個布林值旗標,會導致停用詞(或任何導致位置跳過的條件,例如 >255 個字元的單詞)被忽略,就像它們不存在一樣。否則,其行為是將它們視為標籤中的中斷,假設您的索引文字分析設定未定義 StopWordFilter。依預設,會檢查索引分析鏈中是否存在 StopWordFilter,如果找到,則如果未指定,ignoreStopWords 會為 true。您可能不應該設定 StopWordFilter,也可能不需要設定此參數。

xmlOffsetAdjust

選用

預設值:false

如果為 true,表示輸入是 XML,並且應根據需要調整傳回標籤的偏移量,以便客戶端可以在標籤偏移量對中插入開頭和結尾元素。如果無法這樣做,則將省略該標籤。使用此選項時,您應該在結構描述中設定 HTMLStripCharFilterFactory。這將觸發標籤器在標籤之前完全緩衝輸入。

Solr 用於控制回應格式的參數也受支援,例如 echoParamswtindent 等。

Geonames 教學

本教學示範如何使用熱門的 Geonames 資料集設定和使用文字標籤器。它不僅僅是一個教學;它還是一個操作指南,其中包含上面未描述的資訊。

建立並設定 Solr 集合

建立一個名為「geonames」的 Solr 集合。在本教學中,我們假設使用預設的「資料驅動」設定。它適用於實驗和快速入門,但不適用於生產環境或達到最佳狀態。

bin/solr create -c geonames

設定標籤器

我們需要先設定結構描述。我們使用的「資料驅動」模式允許我們將此步驟保持在最低限度 — 我們只需要宣告一個欄位類型、2 個欄位和一個複製欄位即可。

最關鍵的部分是預先定義「tag」欄位類型。設定文字分析的方法有很多種;我們在這裡不會深入探討這些選擇。但重要的一點是在索引分析器鏈的末尾使用 ConcatenateGraphFilterFactory。另一個對於效能很重要的部分是 postingsFormat=FST50,它產生一個緊湊的基於 FST 的記憶體內資料結構,這對於文字標籤器特別有利。

結構描述設定

curl -X POST -H 'Content-type:application/json'  https://127.0.0.1:8983/solr/geonames/schema -d '{
  "add-field-type":{
    "name":"tag",
    "class":"solr.TextField",
    "postingsFormat":"FST50",
    "omitNorms":true,
    "omitTermFreqAndPositions":true,
    "indexAnalyzer":{
      "tokenizer":{
         "class":"solr.StandardTokenizerFactory" },
      "filters":[
        {"class":"solr.EnglishPossessiveFilterFactory"},
        {"class":"solr.ASCIIFoldingFilterFactory"},
        {"class":"solr.LowerCaseFilterFactory"},
        {"class":"solr.ConcatenateGraphFilterFactory", "preservePositionIncrements":false }
      ]},
    "queryAnalyzer":{
      "tokenizer":{
         "class":"solr.StandardTokenizerFactory" },
      "filters":[
        {"class":"solr.EnglishPossessiveFilterFactory"},
        {"class":"solr.ASCIIFoldingFilterFactory"},
        {"class":"solr.LowerCaseFilterFactory"}
      ]}
    },

  "add-field":{"name":"name", "type":"text_general"},

  "add-field":{"name":"name_tag", "type":"tag", "stored":false },

  "add-copy-field":{"source":"name", "dest":["name_tag"]}
}'

設定自訂 Solr 請求處理器

curl -X POST -H 'Content-type:application/json' https://127.0.0.1:8983/solr/geonames/config -d '{
  "add-requesthandler" : {
    "name": "/tag",
    "class":"solr.TaggerRequestHandler",
    "defaults":{"field":"name_tag"}
  }
}'

載入一些範例資料

我們將使用 CSV 格式的一些 Geonames.org 資料。Solr 在載入各種格式的資料方面非常靈活。這個 cities1000.zip 應該是一個將近 7MB 的檔案,解壓縮後會得到一個大約 22.2MB 的 cities1000.txt 檔案,其中包含 145k 行,每行都是世界上至少有 1000 個居民的城市。

使用 bin/solr post

$ bin/solr post -c geonames -t text/csv \
  --params 'optimize=true&maxSegments=1&separator=%09&encapsulator=%00&fieldnames=id,name,,alternative_names,latitude,longitude,,,countrycode,,,,,,population,elevation,,timezone,lastupdate' \
  /tmp/cities1000.txt

或使用 curl

$ curl -X POST --data-binary @/path/to/cities1000.txt -H 'Content-type:application/csv' \
  'https://127.0.0.1:8983/solr/geonames/update?commit=true&optimize=true&maxSegments=1&separator=%09&encapsulator=%00&fieldnames=id,name,,alternative_names,latitude,longitude,,,countrycode,,,,,,population,elevation,,timezone,lastupdate'

這可能需要大約 35 秒;這取決於情況。如果結構描述經過調整,只包含我們真正需要的內容(如果不需要文字搜尋,則不需要),則速度可能會快得多。

在該命令中,我們說 optimize=true&maxSegments=1,以便將索引置於可加快標籤速度的狀態。encapsulator=%00 是一種駭客方法,用於停用預設的雙引號。

標籤時間!

這是一個標籤一小段文字的簡單範例。如需更多選項,請參閱先前的文件。

$ curl -X POST \
  'https://127.0.0.1:8983/solr/geonames/tag?overlaps=NO_SUB&tagsLimit=5000&fl=id,name,countrycode&wt=json&indent=on' \
  -H 'Content-Type:text/plain' -d 'Hello New York City'

回應應如下所示(QTime 可能會有所不同)

{
  "responseHeader":{
    "status":0,
    "QTime":1},
  "tagsCount":1,
  "tags":[{
      "startOffset":6,
      "endOffset":19,
      "ids":["5128581"]}],
  "response":{"numFound":1,"start":0,"docs":[
      {
        "id":"5128581",
        "name":["New York City"],
        "countrycode":["US"]}]
  }}

標籤器效能提示

  • 遵循上述建議的設定欄位設定。此外,為了獲得最佳的標籤器效能,請設定 postingsFormat=FST50。但是,非預設的張貼格式沒有向後相容性保證,因此如果您升級 Solr,則可能會在啟動時發現一個令人討厭的例外,因為它無法讀取較舊的索引。如果待標籤的輸入文字很小(例如,您正在標籤查詢或推文),則張貼格式的選擇就沒有那麼重要了。

  • 在將字典載入到 1 個 Lucene 片段後,或至少載入到盡可能少的片段後,進行「最佳化」。

  • 對於大量標籤許多文件,有一些策略,這些策略並非互斥:

    • 對它們進行批次處理。標籤器不直接支援批次處理,但作為一種駭客方法,您可以發送一堆文件,這些文件之間串聯了一個字典中不存在的無意義單詞,例如「ZZYYXXAABBCC」。您需要追蹤這些字元的偏移量,以便從結果中減去它們。

    • 為了進一步減少標籤延遲,請考慮使用 EmbeddedSolrServer 嵌入 Solr。請參閱 EmbeddedSolrNoSerializeTest

    • 使用多個執行緒 — 或許與 Solr 可用的 CPU 核心數一樣多。