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