solr查詢語法


還以為網上的solr最基礎的東西應該很多,結果發現je這邊都是一些部署的資料。到沒用人給最基本的查詢語法。在做查詢時十分吃力,自己整理了幾個例子來分享下,希望別人不要再走彎路。

 

首先說下,查詢都是基於solrj。如果不清楚solrj。可以當做是對solr查詢語句的一個api封裝。

solr的查詢其實都是向select這個servlet穿字符型的參數,例如:

Solr代碼   收藏代碼
  1. http://192.168.1.107:8983/solr/collection1/select?q=*%3A*&wt=xml&indent=true  

 查詢的字段格式一般是:   字段名: 字段值

說明號會被urlcoding,變成“%3A。”

我沒有看過solrj的源碼。但是應該是將對select這個servlet的請求通過httpclient的方式的一種實現。

 

進入正題:

首先需要實例化 SolrQuery 對象,用來做要查詢的參數集合。

Java代碼   收藏代碼
  1. SolrQuery q = new SolrQuery();  
  2. q.setQuery("TITLE:中國人");  

 

1、最基本的字段查詢:

Java代碼   收藏代碼
  1. TITLE:中國人  

 即查詢 字段是TITLE 值包含“中國人”的所有結果集。

solr在查詢時,會對傳入的值分詞, 中國人有可能會被分成“中國”,“國人”,“中國人”。

包含着三個短語的語句都會被搜到。強制要求solr不分詞,可以給短語加上雙引號

Java代碼   收藏代碼
  1. TITLE:"中國人"  

 這樣就只返回值包含“中國人”這個詞語的。中國和 國人就不會返回。

 

2、多字段或關系 OR

Java代碼   收藏代碼
  1. TITLE:("中國人" AND "美國人" AND "英國人")  

 

3.多字段不包含的關系 NOT

這個語法就是我吃苦的地方,之前已經當多值or那樣去查,結果不是,要寫成

Java代碼   收藏代碼
  1. TITLE:(* NOT "上網費用高" NOT "寬帶收費不合理" )  

 

4.查詢一個范圍 BETWEEN

Java代碼   收藏代碼
  1. NUM:[-90 TO 360 ]  OR CREATED_AT:[" + date1 + " TO " + date2 + "]  

 適用於數字和日期類型 .

日期轉換上, date 要用 

Java代碼   收藏代碼
  1. String date1 = FastDateFormat.getInstance(  
  2.                     "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").format(  
  3.                     c.getStartTime().getTime())  

 來轉換,而不是慣用的 yyyy-MM-dd HH:mm:ss

 

配置好solr后,可以通過web管理界面進行管理和查詢。web界面基本列出了大多數查詢參數,可以通過這個學習lucene的查詢語法。
solr的查詢解析是通過queryParser來配置的(solrconfig.xml),一般我們用默認的即可。其各參數含義與用法簡單解釋如下:
q:查詢輸入,必須。可以使用運算符
fq:過濾查詢。可以使用運算符
sort:排序的字段,格式為field score,多個字段之間用逗號隔開,比如sum(x_f, y_f) desc, price asc,默認是score desc
start:從哪一行開始
rows:獲取多少行
fl:查詢要輸出的字段,字段之間用逗號隔開,比如title,price,seller,星號代表所有,默認就是星號。
df:定義查詢時默認的查詢field。
wt:返回的數據類型,可以是JSON、XML、pythonruby、php、csv等格式。
indent:true/false,返回的XML格式是否需要縮進(格式化展示),默認為false
debugQuery:調試查詢,會輸出查詢過程的一些參數。
 
高亮相關:
高亮是通過searchComponent來配置的,在solrconfig.xml中配置名為highlight的searchComponent即可,默認的實現是solr.HighlightComponent。
hl:true/false,是否高亮顯示
hl.fl:高亮顯示的字段
hl.example.pre:高亮顯示的前綴
hl.exapmle.post:高亮顯示的后綴
hl.requireFieldMatch:是否只在查詢指定的field(只有當hl.usePhraseHighlighter為true時才生效)高亮顯示,默認是在所有field都高亮
hl.usePhraseHighlighter:true/false,使用SpanScorer高亮查詢短語
hl.highlightMultiTerm:true/false,如果SpanScorer被啟用,這個參數針對前綴/模糊/范圍/通配符等開啟高亮顯示
 
facet:true/false
facet是solr的高級搜索功能之一,可以給用戶提供更友好的搜索體驗(類似於面包屑導航的功能)。在搜索關鍵字的同時,能夠按照 facet指定的字段進行分組統計。比如商品的分類、商品的規格等。facet的字段必須被索引,無須分詞(分詞意義不大),也無須存儲。詳細可參考《Solr的facet查詢》
facet的查詢結果返回字段為facet_counts,與responseHeader、response同級。
facet.query:類似於filter的語法,對任意字段進行篩選
facet.field:需要進行facet的字段
facet.prefix:對facet字段的前綴過濾
facet.sort:true/false,對facet以哪種順序返回,true為按照count值從大到小排序,默認為true
 
spellcheck:拼寫檢查
spellcheck是通過component的方式實現的,你可以在solrconfig.xml文件中配置searchComponent來完成拼寫檢查的功能,默認的實現是solr.SpellCheckComponent,具體的配置參數和實現原理可以看這里《spellCheckComponent》
 
spatial:空間搜索
spatial是專門針對空間數據進行搜索的,空間位置的索引和存儲fieldType是LatLonType或者SpatialRecursivePrefixTreeFieldType,通過使用空間搜索,你可以對點、面等數據建立索引,以圓形、方形或其他形狀進行范圍搜索,以及對搜索結果按距離排序等等,具體的配置參數和實現原理可以看這里《SpatialSearch》
 
 
檢索運算符:
冒號":": field:value結構查詢,表示字段field值為value的查詢。
通配符:?(任意一個字符) *(任意字符)
布爾操作:AND(並且,同&&) OR(或者,同||) +(包含) -(不包含) NOT(同!),注意AND、OR、NOT均為大寫
范圍:[A TO B](從A到B之間,包含A和B,注意TO大寫),{A TO B}(從A到B之間,不包含A和B,注意TO大寫)
子運算:()括號跟數學表達式上的差不多,比如:(瓜 OR 傻) AND 男人
模糊檢索:~表示模糊檢索,比如:roam~將找到形如foam和roams的單詞;roam~0.8,檢索返回相似度在0.8以上的記錄
控制相關度:^表示相關度,如檢索jakarta apache,同時希望讓”jakarta”的相關度更加好,那么在其后加上”^”符號和增量值,即jakarta^4 apache


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM