99re热视频这里只精品,久久久天堂国产精品女人,国产av一区二区三区,久久久精品成人免费看片,99久久精品免费看国产一区二区三区

Solr使用之拼寫(xiě)檢查(SpellCheck)

2018-11-27 17:55 更新

SpellCheck(拼寫(xiě)檢查)組件旨在提供基于其他相似 term 的內(nèi)嵌查詢建議。

這些建議的基礎(chǔ)可以是 Solr 中的字段、外部創(chuàng)建的文本文件或其他 Lucene 索引中的字段的 term。

配置 SpellCheckComponent

在 solrconfig.xml 中定義拼寫(xiě)檢查

第一步是在 solrconfig.xml 中指定 term 的來(lái)源。在 Solr 中有三種拼寫(xiě)檢查方法,在下面討論。

IndexBasedSpellChecker

IndexBasedSpellChecker 使用 Solr 索引作為用于拼寫(xiě)檢查并行索引的基礎(chǔ)。它要求定義一個(gè)字段作為索引 term 的基礎(chǔ);通常的做法是將 term 從某些字段 (如 title,body 等),復(fù)制到為拼寫(xiě)檢查而創(chuàng)建的另一個(gè)字段中。下面是一個(gè)使用 IndexBasedSpellChecker 配置 solrconfig. xml 的簡(jiǎn)單示例:

<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>

第一個(gè)元素定義了要使用 solr.SpellCheckComponent 的 searchComponent。這里 classname 是 SpellCheckComponent 的具體實(shí)現(xiàn)

:solr.IndexBasedSpellChecker。定義 classname 是可選的;如果沒(méi)有定義,它將默認(rèn)為:IndexBasedSpellChecker。

spellcheckIndexDir 定義了保持所述拼寫(xiě)檢查索引的目錄的位置,而字段定義了用于拼寫(xiě)檢查 term 的源字段(在架構(gòu)中定義)。為拼寫(xiě)檢查索引選擇一個(gè)字段時(shí),最好避免經(jīng)過(guò)大量處理的字段以獲得更準(zhǔn)確的結(jié)果。如果該字段具有處理同義詞或詞干的許多單詞變體,則除了更多有效的拼寫(xiě)數(shù)據(jù)之外,將使用這些變體創(chuàng)建詞典。

最后,buildOnCommit 定義是否在每次提交時(shí)都建立拼寫(xiě)檢查索引(也就是每次將新文檔添加到索引時(shí))。這是可選的,如果您愿意的話可以將其設(shè)置為 false,也可以省略它。

DirectSolrSpellChecker

在 DirectSolrSpellChecker 使用 Solr 索引中的 term,而沒(méi)有構(gòu)建類似 IndexBasedSpellChecker 的并行索引。這個(gè)拼寫(xiě)檢查器具有不必定期建立的好處,這意味著 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 以查詢這個(gè)拼寫(xiě)檢查器時(shí),您需要對(duì)其進(jìn)行相對(duì)較少的分析 (特別是對(duì)詞干分析)。請(qǐng)注意,您需要指定一個(gè)字段中使用您的建議,比如 IndexBasedSpellChecker,您可能希望將數(shù)據(jù)從像 title,body 等等的字段中復(fù)制到專門提供拼寫(xiě)建議的字段中。

許多參數(shù)與這個(gè)拼寫(xiě)檢查器應(yīng)該如何查詢索引的詞條建議有關(guān)。該 distanceMeasure 定義了在拼寫(xiě)檢查查詢期間使用的躍點(diǎn)數(shù)?!皟?nèi)部”值使用默認(rèn)的 Levenshtein 度量,它與其他拼寫(xiě)檢查器實(shí)現(xiàn)使用的度量標(biāo)準(zhǔn)相同。

由于此拼寫(xiě)檢查器正在查詢主索引,因此您可能需要限制查詢索引的頻率,以避免與用戶查詢發(fā)生任何性能沖突。該 accuracy 設(shè)置定義有效建議的閾值,同時(shí) maxEdits 定義允許的 term 更改次數(shù)。由于大多數(shù)拼寫(xiě)錯(cuò)誤都只有一個(gè)字母,所以將其設(shè)置為1會(huì)減少可能的建議的數(shù)量(默認(rèn)值為2)。該值只能是1或2. minPrefix 定義術(shù)語(yǔ)應(yīng)共享的最少字符數(shù)。將其設(shè)置為1意味著拼寫(xiě)建議將全部以相同的字母開(kāi)始。

該 maxInspections 參數(shù)定義在返回結(jié)果之前要審閱的可能匹配項(xiàng)的最大數(shù)目;默認(rèn)值是 5。minQueryLength 定義在提供建議之前查詢中必須有多少個(gè)字符;默認(rèn)是 4。

首先,拼寫(xiě)檢查器通過(guò)在索引中查找來(lái)分析傳入的查詢?cè)~。只有在索引中不存在的查詢?cè)~或者非常少見(jiàn)的詞(低于 maxQueryFrequency)被認(rèn)為是拼寫(xiě)錯(cuò)誤的,用于查找建議。比maxQueryFrequency 繞過(guò)拼寫(xiě)檢查器更頻繁的詞不變。在找到每個(gè)拼寫(xiě)錯(cuò)誤的單詞的建議之后,將其過(guò)濾為具有足夠頻率的 thresholdTokenFrequency 邊界值。這些參數(shù)(maxQueryFrequency 和 thresholdTokenFrequency)可以是百分比(如.01或1%)或絕對(duì)值(如4)。

FileBasedSpellChecker

FileBasedSpellChecker 使用外部文件作為拼寫(xiě)字典。如果將 Solr 用作拼寫(xiě)服務(wù)器,或者拼寫(xiě)建議不需要基于索引中的實(shí)際 term,這會(huì)很有用。在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 來(lái)定義 term 文件的位置和使用 characterEncoding 來(lái)定義 term 文件的編碼。

在前面的示例中,名稱用于命名檢查的這個(gè)特定定義。多個(gè)定義可以共存于單個(gè) solrconfig. xml 中,名稱有助于區(qū)分它們。如果只定義一個(gè)拼寫(xiě)檢查器,則不需要名稱。

WordBreakSolrSpellChecker

WordBreakSolrSpellChecker 通過(guò)將相鄰查詢 term 和 將 term 分解成多個(gè)單詞來(lái)提供建議。這是一個(gè) SpellCheckComponent 的增強(qiáng),利用 Lucene 的 WordBreakSpellChecker。它可以在不使用 shingle-based 字典的情況下檢測(cè)由錯(cuò)位的空白產(chǎn)生的拼寫(xiě)錯(cuò)誤,并且提供對(duì)單詞中斷錯(cuò)誤的整理支持,包括用戶在同一個(gè)查詢中混合了單詞拼寫(xiě)錯(cuò)誤和單詞中斷錯(cuò)誤的情況。它還提供碎片支持。

以下是如何在 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ù)將在討論其他拼寫(xiě)檢查時(shí)熟悉,如 name、classname 和 field。這個(gè)拼寫(xiě)檢查器的新功能是:combineWords,它定義了在字典搜索中是否應(yīng)合并單詞(默認(rèn)為true);breakWords,它定義在字典搜索期間單詞是否應(yīng)該被中斷(默認(rèn)為 true);maxChanges,它是一個(gè)整數(shù),它定義了拼寫(xiě)檢查器應(yīng)該檢查對(duì)索引的排序可能性的次數(shù)(默認(rèn)值是10)。

拼寫(xiě)檢查器可以配置一個(gè)傳統(tǒng)的檢查器(即:DirectSolrSpellChecker)。結(jié)果是結(jié)合在一起的,整理可以包含來(lái)自兩個(gè) spellcheckers 的更正組合。

將它添加到請(qǐng)求處理程序

查詢將被發(fā)送到 RequestHandler。如果每個(gè)請(qǐng)求都應(yīng)該生成一個(gè)建議,那么您會(huì)添加以下內(nèi)容到您正在使用的 requestHandler :

<str name="spellcheck">true</str>

其中一個(gè)可能的參數(shù)是使用的 spellcheck.dictionary ,并且可以定義倍數(shù)。使用多個(gè)詞典,查詢所有指定的詞典,并將結(jié)果交錯(cuò)。排序規(guī)則是使用來(lái)自不同拼寫(xiě)檢查程序的組合創(chuàng)建的,要注意在同一排序規(guī)則中不會(huì)發(fā)生多個(gè)重疊的更正。

下面是一個(gè)具有多個(gè)字典的示例:

<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>

拼寫(xiě)檢查參數(shù)

拼寫(xiě)檢查組件接受下面描述的參數(shù):

  • spellcheck 參數(shù)

    此參數(shù)為請(qǐng)求打開(kāi)拼寫(xiě)檢查建議。如果true,則會(huì)生成拼寫(xiě)建議。如果需要拼寫(xiě)檢查,則這是必需的。

  • spellcheck.q 或者 q 參數(shù)

    該參數(shù)指定拼寫(xiě)檢查的查詢。

    如果spellcheck.q被定義,則被使用;否則使用原始輸入查詢。該spellcheck.q參數(shù)旨在成為原始查詢,減去字段名稱,提升等額外的標(biāo)記。如指定了這個(gè) q 參數(shù),那么這個(gè)SpellingQueryConverter類就被用來(lái)解析成標(biāo)記;否則使用WhitespaceTokenizer

    選擇使用哪一個(gè)取決于應(yīng)用程序。從本質(zhì)上講,如果你的應(yīng)用程序中有一個(gè)拼寫(xiě)“準(zhǔn)備好”的版本,那么最好使用spellcheck.q。否則,如果您只是想要 Solr 做這個(gè)工作,使用q參數(shù)。

    SpellingQueryConverter類不使用非ASCII字符妥善處理。在這種情況下,您必須使用spellcheck.q或?qū)崿F(xiàn)您自己的QueryConverter

  • spellcheck.build 參數(shù)

    如果設(shè)置為true,則此參數(shù)將創(chuàng)建用于拼寫(xiě)檢查的字典。在典型的搜索應(yīng)用程序中,您需要在使用拼寫(xiě)檢查之前構(gòu)建字典。但是,并不總是需要先建立一個(gè)字典。例如,您可以將拼寫(xiě)檢查器配置為使用已存在的字典。

    字典將需要一些時(shí)間來(lái)建立,所以這個(gè)參數(shù)不應(yīng)該與每個(gè)請(qǐng)求一起發(fā)送。

  • spellcheck.reload 參數(shù)

    如果設(shè)置為true,則此參數(shù)將重新加載拼寫(xiě)檢查程序。結(jié)果取決于執(zhí)行SolrSpellChecker.reload()。在典型的實(shí)現(xiàn)中,重新加載拼寫(xiě)檢查程序意味著重新加載字典。

  • spellcheck.count 參數(shù)

    此參數(shù)指定拼寫(xiě)檢查器應(yīng)為某個(gè)術(shù)語(yǔ)返回的最大建議數(shù)。如果未設(shè)置此參數(shù),則該值默認(rèn)為1。如果參數(shù)已設(shè)置但未分配一個(gè)數(shù)字,則該值默認(rèn)為5。如果參數(shù)設(shè)置為正整數(shù),則該數(shù)字將成為拼寫(xiě)檢查程序返回的建議的最大數(shù)量。

  • spellcheck.onlyMorePopular 參數(shù)

    如果為true,Solr 將返回比現(xiàn)有查詢更有可能導(dǎo)致查詢命中次數(shù)的建議。請(qǐng)注意,即使索引中存在給定查詢?cè)~并認(rèn)為“正確”,也會(huì)返回更受歡迎的建議。

  • spellcheck.maxResultsForSuggest 參數(shù)

    例如,如果設(shè)置為5,并且用戶的查詢返回5個(gè)或更少的結(jié)果,則拼寫(xiě)檢查程序?qū)?bào)告“correctSpelled = false”,并提供建議(以及請(qǐng)求時(shí)的排序規(guī)則)。設(shè)置這個(gè)大于零對(duì)于創(chuàng)建“did-you-mean?”的查詢(對(duì)返回低數(shù)量的命中)很有用。

  • spellcheck.alternativeTermCount 參數(shù)

    定義索引或字典中存在的每個(gè)查詢 term 的返回建議數(shù)。據(jù)推測(cè),用戶會(huì)希望對(duì) docFrequency> 0 的單詞提出更少的建議。此外,設(shè)置此值可啟用上下文相關(guān)的拼寫(xiě)建議。

  • spellcheck.extendedResults 參數(shù)

    如果為true此參數(shù)導(dǎo)致 Solr 返回有關(guān)拼寫(xiě)檢查結(jié)果的附加信息,例如 index(origFreq)中每個(gè)原始詞語(yǔ)的頻率以及 index(frequency)中每個(gè)建議的頻率。請(qǐng)注意,這個(gè)結(jié)果格式與非擴(kuò)展格式不同,因?yàn)榉祷氐膯卧~建議實(shí)際上是一個(gè)列表數(shù)組,其中每個(gè)列表包含建議的術(shù)語(yǔ)及其頻率。

  • spellcheck.collate 參數(shù)

    如果為true此參數(shù)指示 Solr 對(duì)每個(gè)標(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 時(shí)會(huì)導(dǎo)致命中的排序規(guī)則, 即使在應(yīng)用原始的fq參數(shù)時(shí)也是如此。每個(gè)查詢有多個(gè)更正時(shí),這是特別有用的。

    這僅返回要使用的查詢。它實(shí)際上并不運(yùn)行建議的查詢。

  • spellcheck.maxCollations 參數(shù)

    要返回的最大排序數(shù)。默認(rèn)是1。如果spellcheck.collate為 false,則忽略此參數(shù)。

  • spellcheck.maxCollationTries 參數(shù)

    此參數(shù)指定 Solr 在放棄之前嘗試進(jìn)行排序的可能性數(shù)目。值越低,性能越好。找到可以返回結(jié)果的排序規(guī)則可能需要更高的值。默認(rèn)值是0,這相當(dāng)于不檢查排序規(guī)則。如果spellcheck.collate為 false,則忽略此參數(shù)。

  • spellcheck.maxCollationEvaluations 參數(shù)

    此參數(shù)指定在確定要對(duì)索引進(jìn)行測(cè)試的排序規(guī)則候選項(xiàng)之前,要對(duì)其進(jìn)行排序和計(jì)算的單詞更正組合的最大數(shù)目。如果用戶輸入含有許多拼寫(xiě)錯(cuò)誤的單詞的查詢,這是一個(gè)性能安全網(wǎng)。默認(rèn)值是10000組合,這在大多數(shù)情況下應(yīng)該可以正常工作。

  • spellcheck.collateExtendedResults

    如果為true此參數(shù)返回?cái)U(kuò)展的響應(yīng)格式,詳細(xì)說(shuō)明 Solr 找到的排序規(guī)則。默認(rèn)值是false,如果spellcheck.collate為 false,則忽略此錯(cuò)誤。

  • spellcheck.collateMaxCollectDocs 函數(shù)

    此參數(shù)指定在根據(jù)索引測(cè)試潛在歸類時(shí)應(yīng)收集的最大文檔數(shù)量。值0表示應(yīng)該收集所有文檔,從而產(chǎn)生確切的命中數(shù)。否則,在不需要精確的命中計(jì)數(shù)的情況下,作為性能優(yōu)化提供了一種估計(jì)--指定的值越高,估計(jì)就越精確。

    此參數(shù)的默認(rèn)值是0,但是當(dāng)spellcheck.collateExtendedResults為 false 時(shí),總是使用優(yōu)化,像指定了1一樣。

  • spellcheck.collateParam.* Prefix

    此參數(shù)前綴可用于指定在內(nèi)部驗(yàn)證歸類查詢時(shí)希望檢查使用的任何其他參數(shù)。例如,即使您的常規(guī)搜索結(jié)果允許通過(guò)類似的參數(shù)松散地匹配一個(gè)或多個(gè)查詢?cè)~語(yǔ)如:q.op=ORmm=20%您也可以指定重寫(xiě)參數(shù),例如spellcheck.collateParam.q.op=AND&spellcheck.collateParam.mm=100%要求需要只有在至少一個(gè)文檔中找到的所有單詞的排序規(guī)則才會(huì)被返回。

  • spellcheck.dictionary 參數(shù)

    此參數(shù)使 Solr 使用參數(shù)的參數(shù)中指定的字典。默認(rèn)設(shè)置是default。該參數(shù)可用于根據(jù)請(qǐng)求調(diào)用特定的拼寫(xiě)檢查器。

  • spellcheck.accuracy 參數(shù)

    指定拼寫(xiě)檢查實(shí)現(xiàn)使用的準(zhǔn)確度值,以確定結(jié)果是否值得。該值是0到1之間的浮點(diǎn)數(shù)。默認(rèn)為Float.MIN_VALUE。

  • spellcheck.<DICT_NAME>.key 參數(shù)

    指定用于處理給定字典的實(shí)現(xiàn)的鍵/值對(duì)。傳遞的值就是key=valuespellcheck.<DICT_NAME>.被剝離)。

    例如,給定一個(gè)字典調(diào)用foospellcheck.foo.myKey=myValue會(huì)導(dǎo)致myKey=myValue被傳遞到處理字典foo的實(shí)現(xiàn)。

拼寫(xiě)檢查示例

使用 Solr 的 bin/solr -e techproducts 示例,這個(gè)查詢顯示了一個(gè)簡(jiǎn)單的請(qǐng)求的結(jié)果,該請(qǐng)求使用 spellcheck.q 參數(shù)定義了一個(gè)查詢,并強(qiáng)制排序規(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>

分布式拼寫(xiě)檢查

該 SpellCheckComponent 還支持分布式索引拼寫(xiě)檢查。如果您在除 “/ select” 以外的請(qǐng)求處理程序上使用 SpellCheckComponent,則必須提供以下兩個(gè)參數(shù):

  • shards 參數(shù)

    指定分布式索引配置中的分片。有關(guān)分布式索引的更多信息,請(qǐng)參見(jiàn)使用索引分片的分布式搜索

  • shards.qt 參數(shù)

    指定 Solr 用于請(qǐng)求分片的請(qǐng)求處理程序。/select請(qǐng)求處理程序不需要此參數(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

在對(duì) SpellCheckComponent 的分發(fā)請(qǐng)求的情況下,即使 spellcheck.count 參數(shù)值小于五,分片請(qǐng)求至少五個(gè)建議。一旦建議被收集,他們由被配置的距離措施排列(默認(rèn)為 Levenstein 距離),然后按聚合頻率。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)