W3Cschool
恭喜您成為首批注冊用戶
獲得88經驗值獎勵
SpellCheck(拼寫檢查)組件旨在提供基于其他相似 term 的內嵌查詢建議。
這些建議的基礎可以是 Solr 中的字段、外部創(chuàng)建的文本文件或其他 Lucene 索引中的字段的 term。
第一步是在 solrconfig.xml 中指定 term 的來源。在 Solr 中有三種拼寫檢查方法,在下面討論。
IndexBasedSpellChecker 使用 Solr 索引作為用于拼寫檢查并行索引的基礎。它要求定義一個字段作為索引 term 的基礎;通常的做法是將 term 從某些字段 (如 title,body 等),復制到為拼寫檢查而創(chuàng)建的另一個字段中。下面是一個使用 IndexBasedSpellChecker 配置 solrconfig. xml 的簡單示例:
<searchComponent name="spellcheck" class="solr.SpellCheckComponent">
<lst name="spellchecker">
<str name="classname">solr.IndexBasedSpellChecker</str>
<str name="spellcheckIndexDir">./spellchecker</str>
<str name="field">content</str>
<str name="buildOnCommit">true</str>
<!-- optional elements with defaults
<str name="distanceMeasure">org.apache.lucene.search.spell.LevensteinDistance</str>
<str name="accuracy">0.5</str>
-->
</lst>
</searchComponent>
第一個元素定義了要使用 solr.SpellCheckComponent 的 searchComponent。這里 classname 是 SpellCheckComponent 的具體實現
:solr.IndexBasedSpellChecker。定義 classname 是可選的;如果沒有定義,它將默認為:IndexBasedSpellChecker。
spellcheckIndexDir 定義了保持所述拼寫檢查索引的目錄的位置,而字段定義了用于拼寫檢查 term 的源字段(在架構中定義)。為拼寫檢查索引選擇一個字段時,最好避免經過大量處理的字段以獲得更準確的結果。如果該字段具有處理同義詞或詞干的許多單詞變體,則除了更多有效的拼寫數據之外,將使用這些變體創(chuàng)建詞典。
最后,buildOnCommit 定義是否在每次提交時都建立拼寫檢查索引(也就是每次將新文檔添加到索引時)。這是可選的,如果您愿意的話可以將其設置為 false,也可以省略它。
在 DirectSolrSpellChecker 使用 Solr 索引中的 term,而沒有構建類似 IndexBasedSpellChecker 的并行索引。這個拼寫檢查器具有不必定期建立的好處,這意味著 term 始終與索引中的term 保持一致。下述例子表示了如何在 solrconfig.xml 中配置:
<searchComponent name="spellcheck" class="solr.SpellCheckComponent">
<lst name="spellchecker">
<str name="name">default</str>
<str name="field">name</str>
<str name="classname">solr.DirectSolrSpellChecker</str>
<str name="distanceMeasure">internal</str>
<float name="accuracy">0.5</float>
<int name="maxEdits">2</int>
<int name="minPrefix">1</int>
<int name="maxInspections">5</int>
<int name="minQueryLength">4</int>
<float name="maxQueryFrequency">0.01</float>
<float name="thresholdTokenFrequency">.01</float>
</lst>
</searchComponent>
當選擇 field 以查詢這個拼寫檢查器時,您需要對其進行相對較少的分析 (特別是對詞干分析)。請注意,您需要指定一個字段中使用您的建議,比如 IndexBasedSpellChecker,您可能希望將數據從像 title,body 等等的字段中復制到專門提供拼寫建議的字段中。
許多參數與這個拼寫檢查器應該如何查詢索引的詞條建議有關。該 distanceMeasure 定義了在拼寫檢查查詢期間使用的躍點數。“內部”值使用默認的 Levenshtein 度量,它與其他拼寫檢查器實現使用的度量標準相同。
由于此拼寫檢查器正在查詢主索引,因此您可能需要限制查詢索引的頻率,以避免與用戶查詢發(fā)生任何性能沖突。該 accuracy 設置定義有效建議的閾值,同時 maxEdits 定義允許的 term 更改次數。由于大多數拼寫錯誤都只有一個字母,所以將其設置為1會減少可能的建議的數量(默認值為2)。該值只能是1或2. minPrefix 定義術語應共享的最少字符數。將其設置為1意味著拼寫建議將全部以相同的字母開始。
該 maxInspections 參數定義在返回結果之前要審閱的可能匹配項的最大數目;默認值是 5。minQueryLength 定義在提供建議之前查詢中必須有多少個字符;默認是 4。
首先,拼寫檢查器通過在索引中查找來分析傳入的查詢詞。只有在索引中不存在的查詢詞或者非常少見的詞(低于 maxQueryFrequency)被認為是拼寫錯誤的,用于查找建議。比maxQueryFrequency 繞過拼寫檢查器更頻繁的詞不變。在找到每個拼寫錯誤的單詞的建議之后,將其過濾為具有足夠頻率的 thresholdTokenFrequency 邊界值。這些參數(maxQueryFrequency 和 thresholdTokenFrequency)可以是百分比(如.01或1%)或絕對值(如4)。
FileBasedSpellChecker 使用外部文件作為拼寫字典。如果將 Solr 用作拼寫服務器,或者拼寫建議不需要基于索引中的實際 term,這會很有用。在solrconfig.xml,您可以這樣定義searchComponent:
<searchComponent name="spellcheck" class="solr.SpellCheckComponent">
<lst name="spellchecker">
<str name="classname">solr.FileBasedSpellChecker</str>
<str name="name">file</str>
<str name="sourceLocation">spellings.txt</str>
<str name="characterEncoding">UTF-8</str>
<str name="spellcheckIndexDir">./spellcheckerFile</str>
<!-- optional elements with defaults
<str name="distanceMeasure">org.apache.lucene.search.spell.LevensteinDistance</str>
<str name="accuracy">0.5</str>
-->
</lst>
</searchComponent>
這里的區(qū)別是使用 sourceLocation 來定義 term 文件的位置和使用 characterEncoding 來定義 term 文件的編碼。
在前面的示例中,名稱用于命名檢查的這個特定定義。多個定義可以共存于單個 solrconfig. xml 中,名稱有助于區(qū)分它們。如果只定義一個拼寫檢查器,則不需要名稱。
WordBreakSolrSpellChecker 通過將相鄰查詢 term 和 將 term 分解成多個單詞來提供建議。這是一個 SpellCheckComponent 的增強,利用 Lucene 的 WordBreakSpellChecker。它可以在不使用 shingle-based 字典的情況下檢測由錯位的空白產生的拼寫錯誤,并且提供對單詞中斷錯誤的整理支持,包括用戶在同一個查詢中混合了單詞拼寫錯誤和單詞中斷錯誤的情況。它還提供碎片支持。
以下是如何在 solrconfig 中配置它的示例:
<searchComponent name="spellcheck" class="solr.SpellCheckComponent">
<lst name="spellchecker">
<str name="name">wordbreak</str>
<str name="classname">solr.WordBreakSolrSpellChecker</str>
<str name="field">lowerfilt</str>
<str name="combineWords">true</str>
<str name="breakWords">true</str>
<int name="maxChanges">10</int>
</lst>
</searchComponent>
一些參數將在討論其他拼寫檢查時熟悉,如 name、classname 和 field。這個拼寫檢查器的新功能是:combineWords,它定義了在字典搜索中是否應合并單詞(默認為true);breakWords,它定義在字典搜索期間單詞是否應該被中斷(默認為 true);maxChanges,它是一個整數,它定義了拼寫檢查器應該檢查對索引的排序可能性的次數(默認值是10)。
拼寫檢查器可以配置一個傳統(tǒng)的檢查器(即:DirectSolrSpellChecker)。結果是結合在一起的,整理可以包含來自兩個 spellcheckers 的更正組合。
查詢將被發(fā)送到 RequestHandler。如果每個請求都應該生成一個建議,那么您會添加以下內容到您正在使用的 requestHandler :
<str name="spellcheck">true</str>
其中一個可能的參數是使用的 spellcheck.dictionary ,并且可以定義倍數。使用多個詞典,查詢所有指定的詞典,并將結果交錯。排序規(guī)則是使用來自不同拼寫檢查程序的組合創(chuàng)建的,要注意在同一排序規(guī)則中不會發(fā)生多個重疊的更正。
下面是一個具有多個字典的示例:
<requestHandler name="spellCheckWithWordbreak" class="org.apache.solr.handler.component.SearchHandler">
<lst name="defaults">
<str name="spellcheck.dictionary">default</str>
<str name="spellcheck.dictionary">wordbreak</str>
<str name="spellcheck.count">20</str>
</lst>
<arr name="last-components">
<str>spellcheck</str>
</arr>
</requestHandler>
拼寫檢查組件接受下面描述的參數:
此參數為請求打開拼寫檢查建議。如果true
,則會生成拼寫建議。如果需要拼寫檢查,則這是必需的。
該參數指定拼寫檢查的查詢。
如果spellcheck.q
被定義,則被使用;否則使用原始輸入查詢。該spellcheck.q
參數旨在成為原始查詢,減去字段名稱,提升等額外的標記。如指定了這個 q 參數,那么這個SpellingQueryConverter
類就被用來解析成標記;否則使用WhitespaceTokenizer
。
選擇使用哪一個取決于應用程序。從本質上講,如果你的應用程序中有一個拼寫“準備好”的版本,那么最好使用spellcheck.q
。否則,如果您只是想要 Solr 做這個工作,使用q
參數。
SpellingQueryConverter
類不使用非ASCII字符妥善處理。在這種情況下,您必須使用spellcheck.q
或實現您自己的QueryConverter
如果設置為true
,則此參數將創(chuàng)建用于拼寫檢查的字典。在典型的搜索應用程序中,您需要在使用拼寫檢查之前構建字典。但是,并不總是需要先建立一個字典。例如,您可以將拼寫檢查器配置為使用已存在的字典。
字典將需要一些時間來建立,所以這個參數不應該與每個請求一起發(fā)送。
如果設置為true
,則此參數將重新加載拼寫檢查程序。結果取決于執(zhí)行SolrSpellChecker.reload()
。在典型的實現中,重新加載拼寫檢查程序意味著重新加載字典。
此參數指定拼寫檢查器應為某個術語返回的最大建議數。如果未設置此參數,則該值默認為1
。如果參數已設置但未分配一個數字,則該值默認為5
。如果參數設置為正整數,則該數字將成為拼寫檢查程序返回的建議的最大數量。
如果為true
,Solr 將返回比現有查詢更有可能導致查詢命中次數的建議。請注意,即使索引中存在給定查詢詞并認為“正確”,也會返回更受歡迎的建議。
例如,如果設置為5
,并且用戶的查詢返回5個或更少的結果,則拼寫檢查程序將報告“correctSpelled = false”,并提供建議(以及請求時的排序規(guī)則)。設置這個大于零對于創(chuàng)建“did-you-mean?”的查詢(對返回低數量的命中)很有用。
定義索引或字典中存在的每個查詢 term 的返回建議數。據推測,用戶會希望對 docFrequency> 0 的單詞提出更少的建議。此外,設置此值可啟用上下文相關的拼寫建議。
如果為true
此參數導致 Solr 返回有關拼寫檢查結果的附加信息,例如 index(origFreq
)中每個原始詞語的頻率以及 index(frequency)中每個建議的頻率。請注意,這個結果格式與非擴展格式不同,因為返回的單詞建議實際上是一個列表數組,其中每個列表包含建議的術語及其頻率。
如果為true
此參數指示 Solr 對每個標記(如果存在)采取最佳建議,并根據建議構建新的查詢。
例如,如果輸入查詢是“jawa class lording”,而“jawa”的最佳建議是“java”,“l(fā)ording”是“l(fā)oading”,那么結果歸類為“java class loading”。
該spellcheck.collate
參數只返回確保在 re-queried 時會導致命中的排序規(guī)則, 即使在應用原始的fq
參數時也是如此。每個查詢有多個更正時,這是特別有用的。
這僅返回要使用的查詢。它實際上并不運行建議的查詢。
要返回的最大排序數。默認是1
。如果spellcheck.collate
為 false,則忽略此參數。
此參數指定 Solr 在放棄之前嘗試進行排序的可能性數目。值越低,性能越好。找到可以返回結果的排序規(guī)則可能需要更高的值。默認值是0
,這相當于不檢查排序規(guī)則。如果spellcheck.collate
為 false,則忽略此參數。
此參數指定在確定要對索引進行測試的排序規(guī)則候選項之前,要對其進行排序和計算的單詞更正組合的最大數目。如果用戶輸入含有許多拼寫錯誤的單詞的查詢,這是一個性能安全網。默認值是10000
組合,這在大多數情況下應該可以正常工作。
如果為true
此參數返回擴展的響應格式,詳細說明 Solr 找到的排序規(guī)則。默認值是false
,如果spellcheck.collate
為 false,則忽略此錯誤。
此參數指定在根據索引測試潛在歸類時應收集的最大文檔數量。值0
表示應該收集所有文檔,從而產生確切的命中數。否則,在不需要精確的命中計數的情況下,作為性能優(yōu)化提供了一種估計--指定的值越高,估計就越精確。
此參數的默認值是0
,但是當spellcheck.collateExtendedResults
為 false 時,總是使用優(yōu)化,像指定了1
一樣。
此參數前綴可用于指定在內部驗證歸類查詢時希望檢查使用的任何其他參數。例如,即使您的常規(guī)搜索結果允許通過類似的參數松散地匹配一個或多個查詢詞語如:q.op=OR
和mm=20%
您也可以指定重寫參數,例如spellcheck.collateParam.q.op=AND&spellcheck.collateParam.mm=100%
要求需要只有在至少一個文檔中找到的所有單詞的排序規(guī)則才會被返回。
此參數使 Solr 使用參數的參數中指定的字典。默認設置是default
。該參數可用于根據請求調用特定的拼寫檢查器。
指定拼寫檢查實現使用的準確度值,以確定結果是否值得。該值是0到1之間的浮點數。默認為Float.MIN_VALUE
。
指定用于處理給定字典的實現的鍵/值對。傳遞的值就是key=value
(spellcheck.<DICT_NAME>.
被剝離)。
例如,給定一個字典調用foo
,spellcheck.foo.myKey=myValue
會導致myKey=myValue
被傳遞到處理字典foo
的實現。
使用 Solr 的 bin/solr -e techproducts 示例,這個查詢顯示了一個簡單的請求的結果,該請求使用 spellcheck.q 參數定義了一個查詢,并強制排序規(guī)則要求所有輸入條件必須匹配:
http://localhost:8983/solr/techproducts/spell?df=text&spellcheck.q=delll+ultra+sharp&spellcheck=true&spellcheck.collateParam.q.op=AND
結果如下:
<lst name="spellcheck">
<lst name="suggestions">
<lst name="delll">
<int name="numFound">1</int>
<int name="startOffset">0</int>
<int name="endOffset">5</int>
<int name="origFreq">0</int>
<arr name="suggestion">
<lst>
<str name="word">dell</str>
<int name="freq">1</int>
</lst>
</arr>
</lst>
<lst name="ultra sharp">
<int name="numFound">1</int>
<int name="startOffset">6</int>
<int name="endOffset">17</int>
<int name="origFreq">0</int>
<arr name="suggestion">
<lst>
<str name="word">ultrasharp</str>
<int name="freq">1</int>
</lst>
</arr>
</lst>
</lst>
<bool name="correctlySpelled">false</bool>
<lst name="collations">
<lst name="collation">
<str name="collationQuery">dell ultrasharp</str>
<int name="hits">1</int>
<lst name="misspellingsAndCorrections">
<str name="delll">dell</str>
<str name="ultra sharp">ultrasharp</str>
</lst>
</lst>
</lst>
</lst>
該 SpellCheckComponent 還支持分布式索引拼寫檢查。如果您在除 “/ select” 以外的請求處理程序上使用 SpellCheckComponent,則必須提供以下兩個參數:
指定分布式索引配置中的分片。有關分布式索引的更多信息,請參見使用索引分片的分布式搜索
指定 Solr 用于請求分片的請求處理程序。/select
請求處理程序不需要此參數。
例如:
http://localhost:8983/solr/techproducts/spell?spellcheck=true&spellcheck.build=true&spellcheck.q=toyata&shards.qt=/spell&shards=solr-shard1:8983/solr/techproducts,solr-shard2:8983/solr/techproducts
在對 SpellCheckComponent 的分發(fā)請求的情況下,即使 spellcheck.count 參數值小于五,分片請求至少五個建議。一旦建議被收集,他們由被配置的距離措施排列(默認為 Levenstein 距離),然后按聚合頻率。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: