Tagger 處理器
Tagger 請求處理器,又稱「SolrTextTagger」,是一個「文字標籤器」。
給定一個包含名稱類欄位的字典(Solr 索引),您可以將文字張貼到此請求處理器,它將傳回每個出現的名稱,以及偏移量和其他所需的檔案中繼資料。它用於命名實體辨識 (NER)。
標籤器不會執行任何自然語言處理 (NLP)(Lucene 文字分析除外),因此它被認為是一個「樸素標籤器」,但它目前來說絕對是有用的,並且可以使用它作為關鍵組件來建構更完整的 NER 或 ERD(實體辨識與消除歧義)系統。SolrTextTagger 也可能用於查詢以了解查詢,或用於大型文件。
若要了解如何使用它,請跳至下方的教學。
Tagger 請求處理器尚未支援分片索引。它可以在以 SolrCloud 模式執行的叢集中使用,但儲存標籤字典的集合必須是單一分片集合。儘管有此限制,但可以支援數千萬到數億個名稱(文件);最大值主要僅受限於記憶體。
Tagger 組態
若要設定標籤器,您的 Solr 結構描述需要 2 個欄位
文字欄位的索引分析鏈,除了結尾需要 ConcatenateGraphFilterFactory
之外,其他部分可以根據您的匹配偏好選擇任何分詞器和過濾器。例如,它可以有多詞同義詞,並使用 WordDelimiterGraphFilterFactory
。但是,不要使用 FlattenGraphFilterFactory
,因為它會干擾 ConcatenateGraphFilterFactory
。位置間隙(例如,停用詞)會被忽略;目前尚不支援將間隙視為重要。
另一方面,文字欄位的查詢分析鏈則有更多限制。同一位置不應該有詞元 (token),因此不應進行同義詞擴展 — 改在索引時進行。支援停用詞(或任何其他引入位置間隙的過濾器)。在執行時,標籤器可以設定為將其視為標籤中斷或忽略它。
您的 solrconfig.xml
需要定義 solr.TagRequestHandler
,它像搜尋處理器一樣支援 defaults
、invariants
和 appends
區段。
如需設定範例,請跳至下方的教學。
標籤器參數
標籤器的執行完全可以透過請求參數設定。只有 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 用於控制回應格式的參數也受支援,例如 echoParams
、wt
、indent
等。
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 核心數一樣多。
-