1. 程式人生 > >solr搜索之solrJ語法(三)

solr搜索之solrJ語法(三)

solr語法 solrj語法

1.1 solr語法

.基本查詢

q 查詢的關鍵字,此參數最為重要,例如,q=id:1,默認為q=*:*

fl 指定返回哪些字段,用逗號或空格分隔,註意:字段區分大小寫,例如,fl= id,title,sort

start 返回結果的第幾條記錄開始,一般分頁用,默認0開始

rows 指定返回結果最多有多少條記錄,默認值為 10,配合start實現分頁

sort 排序方式,例如id desc 表示按照id降序

wt (writer type)指定輸出格式,有 xml, json, php

fq filter query)過慮查詢,提供一個可選的篩選器查詢。返回在q查詢符合結果中同時符合的

fq條件的查詢結果,例如:q=id:1&fq=sort:[1 TO 5],找關鍵字id1 的,並且sort15之間的。

df 默認的查詢字段,一般默認指定。

qt query type)指定那個類型來處理查詢請求,一般不用指定,默認是standard

indent 返回的結果是否縮進,默認關閉,用 indent=true|on 開啟,一般調試json,php,phps,ruby輸出才有必要用這個參數。

version 查詢語法的版本,建議不使用它,由服務器指定默認值。

. Solr的檢索運算符

  “: 指定字段查指定值,如返回所有值*:*

  “? 表示單個任意字符的通配

  “* 表示多個任意字符的通配(不能在檢索的項開始使用*或者?符號)

  “~ 表示模糊檢索,如檢索拼寫類似於”roam”的項這樣寫:roam~將找到形如foamroams的單詞;roam~0.8,檢索返回相似度在0.8以上的記錄。

AND|| 布爾操作符

OR&& 布爾操作符

NOT!-(排除操作符不能單獨與項使用構成查詢)

  “+ 存在操作符,要求符號”+”後的項必須在文檔相應的域中存在

( ) 用於構成子查詢

[] 包含範圍檢索,如檢索某時間段記錄,包含頭尾,date:[201507 TO 201510]

{} 不包含範圍檢索,如檢索某時間段記錄,不包含頭尾date:{201507 TO 201510}

. 高亮

h1 是否高亮,hl=true,表示采用高亮

hl.fl 設定高亮顯示的字段,用空格或逗號隔開的字段列表。要啟用某個字段的highlight功能,就得保證該字段在schema中是stored。如果該參數未被給出,那麽就會高亮默認字段 standard handler會用df參數,dismax字段用qf參數。你可以使用星號去方便的高亮所有字段。如果你使用了通配符,那麽要考慮啟用hl.requiredFieldMatch選項。

hl.requireFieldMatch 如果置為true,除非用hl.fl指定了該字段,查詢結果才會被高亮。它的默認值是false

hl.usePhraseHighlighter 如果一個查詢中含有短語(引號框起來的)那麽會保證一定要完全匹配短語的才會被高亮。

hl.highlightMultiTerm 如果使用通配符和模糊搜索,那麽會確保與通配符匹配的term會高亮。默認為false,同時hl.usePhraseHighlighter要為true

hl.fragsize 返回的最大字符數。默認是100.如果為0,那麽該字段不會被fragmented且整個字段的值會被返回。

. 分組

  官方wikihttp://wiki.apache.org/solr/SimpleFacetParameters#Facet_Fields_and_Facet_Queries

  這是facet的官方wiki,裏面有facet各個參數的詳細說明。所以這裏只說一些常用的。

FacetSolr的核心搜索功能,主要是導航(Guided Navigation)、參數化查詢(Paramatic Search)Facet的主要好處是在搜索的同時,可以按照Facet條件進行分組統計,給出導航信息,改善搜索體驗。

Facet主要分為:Field Facet Date Facet 兩大類

1. Field Facet

facet 參數字段必須被索引

facet=on facet=true

facet.field 分組的字段

facet.prefix 表示Facet字段前綴

facet.limit Facet字段返回條數

facet.offict 開始條數,偏移量,它與facet.limit配合使用可以達到分頁的效果

facet.mincount Facet字段最小count,默認為0

facet.missing 如果為ontrue,那麽將統計那些Facet字段值為null的記錄

facet.sort 表示 Facet 字段值以哪種順序返回 .格式為 true(count)|false(index,lex)true(count) 表示按照 count 值從大到小排列,false(index,lex) 表示按照字段值的自然順序 (字母 , 數字的順序 ) 排列 . 默認情況下為 true(count)

2. Date Facet

    對日期類型的字段進行 Facet. Solr 為日期字段提供了更為方便的查詢統計方式 .註意 , Date Facet的字段類型必須是 DateField( 或其子類型 ). 需要註意的是 , 使用 Date Facet , 字段名 , 起始時間 , 結束時間 , 時間間隔這 4 個參數都必須提供 .

facet.date 該參數表示需要進行 Date Facet 的字段名 , facet.field 一樣 , 該參數可以被設置多次 , 表示對多個字段進行 Date Facet.

facet.date.start 起始時間 , 時間的一般格式為 2015-12-31T23:59:59Z, 另外可以使用NOW,YEAR,MONTH等等 ,

facet.date.end 結束時間

facet.date.gap 時間間隔,如果 start 2015-1-1,end 2016-1-1gap 設置為+1MONTH表示間隔1 個月 , 那麽將會把這段時間劃分為 12 個間隔段 .

facet.date.hardend 表示 gap 叠代到 end 時,還剩余的一部分時間段,是否繼續去下一個間隔. 取值可以為 true|false, 默認為 false.

    例 start 2015-1-1,end 2015-12-21,gap +1MONTH, 如果hardend false,則,最後一個時間段為 2015-12-1 2016-1-1; 反之,如果 hardend true,則,最後一個時間段為 2015-12-1 2015-12-21.

  註意:Facet的字段必須被索引,無需分詞,無需存儲。無需分詞是因為該字段的值代表了一個整體概念,無需存儲是因為一般而言用戶所關心的並不是該字段的具體值,而是作為對查詢結果進行分組的一種手段,給出相關的分組信息,從而改善搜索體驗。

1.2 SolrJ查詢語法總結

//AND 並且

SolrQuery params = newSolrQuery("name:apple AND manu:inc");

//OR 或者

params.setQuery("name:apple ORmanu:apache");

//空格等同於 OR

params.setQuery("name:servermanu:dell");

//params.setQuery("name:solr -manu:inc");

//params.setQuery("name:server +manu:dell");

//查詢name包含solr apple

params.setQuery("name:solr,apple");

//manu不包含inc

params.setQuery("name:solr,apple NOTmanu:inc");

//50 <= price <= 200

params.setQuery("price:[50 TO200]");

params.setQuery("popularity:[5 TO6]");

//params.setQuery("price:[50 TO 200] -popularity:[5 TO 6]");

//params.setQuery("price:[50 TO 200] +popularity:[5 TO 6]");

//50 <= price <= 200 AND 5 <=popularity <= 6

params.setQuery("price:[50 TO 200] ANDpopularity:[5 TO 6]");

params.setQuery("price:[50 TO 200] ORpopularity:[5 TO 6]");

//過濾器查詢,可以提高性能 filter 類似多個條件組合,如and

//params.addFilterQuery("id:VA902B");

//params.addFilterQuery("price:[50 TO200]");

//params.addFilterQuery("popularity:[*TO 5]");

//params.addFilterQuery("weight:*");

//0 < popularity < 6 沒有等於

//params.addFilterQuery("popularity:{0TO 6}");

//排序

params.addSortField("id",ORDER.asc);

//分頁:start開始頁,rows每頁顯示記錄條數

//params.add("start","0");

//params.add("rows","200");

//params.setStart(0);

//params.setRows(200);

//設置高亮

params.setHighlight(true); // 開啟高亮組件

params.addHighlightField("name");// 高亮字段

params.setHighlightSimplePre("<fontcolor=‘red‘>");//標記,高亮關鍵字前綴

params.setHighlightSimplePost("</font>");//後綴

params.setHighlightSnippets(1);//結果分片數,默認為1

params.setHighlightFragsize(1000);//每個分片的最大長度,默認為100

//分片信息

params.setFacet(true)

.setFacetMinCount(1)

.setFacetLimit(5)//

.addFacetField("name")//分片字段

.addFacetField("inStock");

//params.setQueryType("");


本文出自 “IT技術解決方案” 博客,請務必保留此出處http://wyait.blog.51cto.com/12674066/1945902

solr搜索之solrJ語法(三)