天天看點

solr預設查詢設定

在搜尋過程中,如果我們每次請求中都傳入很多固定的參數,會很繁瑣,這裡再solrconfig.xml中初始化定義一些不經常改動的搜尋參數:

<requestHandler name="/select" class="solr.SearchHandler">
     <lst name="defaults">
       <str name="echoParams">explicit</str>

       <!-- Query settings -->
       <str name="defType">edismax</str>
       <str name="qf">
          text^0.5 features^1.0 name^1.2 sku^1.5 id^10.0 manu^1.1 cat^1.4
          title^10.0 description^5.0 keywords^5.0 author^2.0 resourcename^1.0
       </str>
       <str name="df">text</str>
       <str name="mm">100%</str>
       <str name="q.alt">*:*</str>
       <str name="rows">10</str>
       <str name="fl">*,score</str>

       <str name="mlt.qf">
         text^0.5 features^1.0 name^1.2 sku^1.5 id^10.0 manu^1.1 cat^1.4
         title^10.0 description^5.0 keywords^5.0 author^2.0 resourcename^1.0
       </str>
       <str name="mlt.fl">text,features,name,sku,id,manu,cat,title,description,keywords,author,resourcename</str>
       <int name="mlt.count">3</int>

       <!-- Faceting defaults -->
       <str name="facet">on</str>
       <str name="facet.field">cat</str>
       <str name="facet.field">manu_exact</str>
       <str name="facet.field">content_type</str>
       <str name="facet.field">author_s</str>
       <str name="facet.query">ipod</str>
       <str name="facet.query">GB</str>
       <str name="facet.mincount">1</str>
       <str name="facet.pivot">cat,inStock</str>
       <str name="facet.range.other">after</str>
       <str name="facet.range">price</str>
       <int name="f.price.facet.range.start">0</int>
       <int name="f.price.facet.range.end">600</int>
       <int name="f.price.facet.range.gap">50</int>
       <str name="facet.range">popularity</str>
       <int name="f.popularity.facet.range.start">0</int>
       <int name="f.popularity.facet.range.end">10</int>
       <int name="f.popularity.facet.range.gap">3</int>
       <str name="facet.range">manufacturedate_dt</str>
       <str name="f.manufacturedate_dt.facet.range.start">NOW/YEAR-10YEARS</str>
       <str name="f.manufacturedate_dt.facet.range.end">NOW</str>
       <str name="f.manufacturedate_dt.facet.range.gap">+1YEAR</str>
       <str name="f.manufacturedate_dt.facet.range.other">before</str>
       <str name="f.manufacturedate_dt.facet.range.other">after</str>

       <!-- Highlighting defaults -->
       <str name="hl">on</str>
       <str name="hl.fl">content features title name</str>
       <str name="hl.encoder">html</str>
       <str name="hl.simple.pre">&lt;b&gt;</str>
       <str name="hl.simple.post">&lt;/b&gt;</str>
       <str name="f.title.hl.fragsize">0</str>
       <str name="f.title.hl.alternateField">title</str>
       <str name="f.name.hl.fragsize">0</str>
       <str name="f.name.hl.alternateField">name</str>
       <str name="f.content.hl.snippets">3</str>
       <str name="f.content.hl.fragsize">200</str>
       <str name="f.content.hl.alternateField">content</str>
       <str name="f.content.hl.maxAlternateFieldLength">750</str>

       <!-- Spell checking defaults -->
       <str name="spellcheck">on</str>
       <str name="spellcheck.extendedResults">false</str>       
       <str name="spellcheck.count">5</str>
       <str name="spellcheck.alternativeTermCount">2</str>
       <str name="spellcheck.maxResultsForSuggest">5</str>       
       <str name="spellcheck.collate">true</str>
       <str name="spellcheck.collateExtendedResults">true</str>  
       <str name="spellcheck.maxCollationTries">5</str>
       <str name="spellcheck.maxCollations">3</str>           
     </lst>

     <!-- append spellchecking to our list of components -->
     <arr name="last-components">
       <str>spellcheck</str>
     </arr>
  </requestHandler>      

其中:

  • q – 查詢字元串,必須的。Solr 中用來搜尋的查詢。有關該文法的完整描述,請參閱 參考資料 中的 “Lucene QueryParser Syntax”。可以通過追加一個分号和已索引且未進行斷詞的字段的名稱來包含排序資訊。預設的排序是 

    score desc

    ,指按記分降序排序。

               q=myField:Java AND otherField:developerWorks; date asc

    此查詢搜尋指定的兩個字段并根據一個日期字段對結果進行排序。
  • start – 傳回第一條記錄在完整找到結果中的偏移位置,0開始,一般分頁用。
  • rows – 指定傳回結果最多有多少條記錄,配合start來實作分頁。
  • sort – 排序,格式:sort=<field name>+<desc|asc>[,<field name>+<desc|asc>]… 。示例:(inStock desc, price asc)表示先 “inStock” 降序, 再 “price” 升序,預設是相關性降序。
  • wt – (writer type)指定輸出格式,可以有 xml, json, php, phps, 後面 solr 1.3增加的,要用通知我們,因為預設沒有打開。
  • fq – (filter query)過慮查詢,作用:在q查詢符合結果中同時是fq查詢符合的,
  • fl- field作為逗号分隔的清單指定文檔結果中應傳回的 

    Field

     集。預設為 “

    *

    ”,指所有的字段。“score” 指還應傳回記分。例如 *,score

    将傳回所有字段及得分。用solrj的bean時,得在query中指定 query.set(“fl”, “*,score”);

  • q.op – 覆寫schema.xml的defaultOperator(有空格時用”AND”還是用”OR”操作邏輯),一般預設指定
  • df – 預設的查詢字段,一般預設指定
  • qt – (query type)指定那個類型來處理查詢請求,一般不用指定,預設是standard。
  • indent – 傳回的結果是否縮進,預設關閉,用 indent=true|on 開啟,一般調試json,php,phps,ruby輸出才有必要用這個參數。
  • version – 查詢文法的版本,建議不使用它,由伺服器指定預設值。

hight:

hl-highlight,h1=true,表示采用高亮。可以用h1.fl=field1,field2 來設定高亮顯示的字段。

    • hl.fl:

      用空格或逗号隔開的字段清單。要啟用某個字段的highlight功能,就得保證該字段在schema中是stored。如果該參數未被給出,那麼就會高

      亮預設字段 standard

      handler會用df參數,dismax字段用qf參數。你可以使用星号去友善的高亮所有字段。如果你使用了通配符,那麼要考慮啟用

      hl.requiredFieldMatch選項。

    • hl.requireFieldMatch:

      如果置為true,除非該字段的查詢結果不為空才會被高亮。它的預設值是false,意味

      着它可能比對某個字段卻高亮一個不同的字段。如果hl.fl使用了通配符,那麼就要啟用該參數。盡管如此,如果你的查詢是all字段(可能是使用

      copy-field 指令),那麼還是把它設為false,這樣搜尋結果能表明哪個字段的查詢文本未被找到

    • hl.usePhraseHighlighter:

      如果一個查詢中含有短語(引号框起來的)那麼會保證一定要完全比對短語的才會被高亮。

    • hl.highlightMultiTerm

      如果使用通配符和模糊搜尋,那麼會確定與通配符比對的term會高亮。預設為false,同時hl.usePhraseHighlighter要為true。

    • hl.snippets:

      這是highlighted片段的最大數。預設值為1,也幾乎不會修改。如果某個特定的字段的該值被置為0(如f.allText.hl.snippets=0),這就表明該字段被禁用高亮了。你可能在hl.fl=*時會這麼用。

    • hl.fragsize:

      每個snippet傳回的最大字元數。預設是100.如果為0,那麼該字段不會被fragmented且整個字段的值會被傳回。大字段時不會這麼做。

    • hl.mergeContiguous:

      如果被置為true,當snippet重疊時會merge起來。

    • hl.maxAnalyzedChars:

      會搜尋高亮的最大字元,預設值為51200,如果你想禁用,設為-1

    • hl.alternateField:

      如果沒有生成snippet(沒有terms 比對),那麼使用另一個字段值作為傳回。

    • hl.maxAlternateFieldLength:

      如果hl.alternateField啟用,則有時需要制定alternateField的最大字元長度,預設0是即沒有限制。是以合理的值是應該為

    • hl.snippets * hl.fragsize這樣傳回結果的大小就能保持一緻。
    • hl.formatter:一個提供可替換的formatting算法的擴充點。預設值是simple,這是目前僅有的選項。顯然這不夠用,你可

      以看看org.apache.solr.highlight.HtmlFormatter.java 和

      solrconfig.xml中highlighting元素是如何配置的。

      注意在不論原文中被高亮了什麼值的情況下,如預先已存在的em tags,也不會被轉義,是以在有時會導緻假的高亮。

    • hl.fragmenter:

      這個是solr制

      定fragment算法的擴充點。gap是預設值。regex是另一種選項,這種選項指明highlight的邊界由一個正規表達式确定。這是一種非典型

      的進階選項。為了知道預設設定和fragmenters (and

      formatters)是如何配置的,可以看看solrconfig.xml中的highlight段。

      regex 的fragmenter有如下選項:

    • hl.regex.pattern:正規表達式的pattern
    • hl.regex.slop:這是hl.fragsize能變化以适應正規表達式的因子。預設值是0.6,意思是如果hl.fragsize=100那麼fragment的大小會從40-160.
這些值都可以在select中加入,也可以用solrj的api去設定,也可以配置在solrconfig.xml中配置。