Solr是一款開源的全文檢索引擎,基於lucene。擁有完善的可配置功能界面。具備豐富的查詢語言,可擴展,可優化。php
進入solr官網下載包(這裏我使用的版本是8.0)java
http://www.apache.org/dyn/closer.lua/lucene/solr/8.0.0git
命令行進入solr的bin目錄,提示Started Solr server on port 8983. Happy searching!即成功啓動服務。github
solr start -p 端口號 啓動服務web
solr restart -p 端口號 重啓服務sql
solr stop -p 端口號 關閉服務數據庫
solr create -c name 建立一個core實例apache
Solr全部操做在Core中進行,因此使用Solr以前需先建立Core實例,Solr服務可建立多個Core實例。json
兩種方式建立Core實例,建立Core實例將在solr目錄下server/solr生成對應目錄。安全
Schema配置將告訴solr服務如何創建索引,它的配置圍繞core目錄下conf/managed-schema文件,該文件指定每一個字段類型,分詞方式。
可經過手動編輯或者使用schemaAPI進行配置(推薦使用schemaAPI,可不須要從新加載Core或重啓Solr服務,方便維護),不推薦使用手動編輯的方式(可能形成數據丟失)。
Solr雖然自帶的中文分詞器,但不能自定義中文詞庫,擴展性較差。這裏咱們使用IK分詞器,這是一個第三方的分詞器,能夠很好的擴展中文詞庫。
github地址(含配置方法/使用教程):https://github.com/magese/ik-analyzer-solr
可在AdminUI中Analysis中測試分詞效果
DIH全稱是Data Import Handler 數據導入處理器,做用是將數據導入到Solr中,而數據存儲在xml,pdf或關係型數據庫中。solr首先須要獲取這些數據,而後在數據中創建索引達到快速搜索的目的。
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler"> <lst name="defaults"> <str name="config">db-data-config.xml</str> </lst> </requestHandler>
<dataConfig> <dataSource driver="org.postgresql.Driver" url="jdbc:postgresql://127.0.0.1:5432/test" user="postgres" password="123456"/> <document> <entity name="sw2015_p11shangyedasha" query="select id,name,address,ST_AsText(geom) as geom from sw2015_p11shangyedasha"> <field column="id" name="id"></field> <field column="name" name="name"></field> <field column="address" name="address"></field> <field column="geom" name="geom"></field> </entity> </document> </dataConfig>
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],找關鍵字id爲1 的,而且sort是1到5之間的。
df 默認的查詢字段,通常默認指定。
qt (query type)指定那個類型來處理查詢請求,通常不用指定,默認是standard。
indent 返回的結果是否縮進,默認關閉,用 indent=true|on 開啓,通常調試json,php,phps,ruby輸出纔有必要用這個參數。
version 查詢語法的版本,建議不使用它,由服務器指定默認值。
「:」 指定字段查指定值,如返回全部值*:*
「?」 表示單個任意字符的通配
「*」 表示多個任意字符的通配(不能在檢索的項開始使用*或者?符號)
「~」 表示模糊檢索,如檢索拼寫相似於」roam」的項這樣寫:roam~將找到形如foam和roams的單詞;roam~0.8,檢索返回類似度在0.8以上的記錄。
AND、|| 布爾操做符
OR、&& 布爾操做符
NOT、!、-(排除操做符不能單獨與項使用構成查詢)
「+」 存在操做符,要求符號」+」後的項必須在文檔相應的域中存在²
( ) 用於構成子查詢
[] 包含範圍檢索,如檢索某時間段記錄,包含頭尾,date:[201507 TO 201510]
{} 不包含範圍檢索,如檢索某時間段記錄,不包含頭尾date:{201507 TO 201510}
maven引入solrj,solrj是java訪問Solr的客戶端工具包。
<!-- Solr --> <dependency> <groupId>org.apache.solr</groupId> <artifactId>solr-solrj</artifactId> <version>8.0.0</version> </dependency>
SolrUtil.java
package com.bret.gis.utils; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.impl.HttpSolrClient; import org.apache.solr.client.solrj.response.QueryResponse; import org.apache.solr.common.SolrDocumentList; public class SolrUtil { //指定solr服務器的地址 private final static String SOLR_URL = "http://localhost:8983/solr/"; /** * 建立SolrServer對象 * * 該對象有兩個可使用,都是線程安全的 * 一、CommonsHttpSolrServer:啓動web服務器使用的,經過http請求的 * 二、 EmbeddedSolrServer:內嵌式的,導入solr的jar包就可使用了 * 三、solr 4.0以後好像添加了很多東西,其中CommonsHttpSolrServer這個類更名爲HttpSolrClient * * @return */ public HttpSolrClient createSolrServer(){ HttpSolrClient solr = null; solr = new HttpSolrClient.Builder(SOLR_URL).withConnectionTimeout(10000).withSocketTimeout(60000).build(); return solr; } /** * 查詢 * @throws Exception */ public SolrDocumentList querySolr(String q,int start,int rows) throws Exception{ HttpSolrClient solrServer = new HttpSolrClient.Builder(SOLR_URL + "tianjing/").withConnectionTimeout(10000).withSocketTimeout(60000).build(); SolrQuery query = new SolrQuery(); //下面設置solr查詢參數 //query.set("q", "*:*");// 參數q 查詢全部 query.set("q",q);//相關查詢,好比某條數據某個字段含有周、星、馳三個字 將會查詢出來 ,這個做用適用於聯想查詢 //參數fq, 給query增長過濾查詢條件 query.addFilterQuery("id:[0 TO 9]");//id爲0-4 //給query增長布爾過濾條件 //query.addFilterQuery("description:演員"); //description字段中含有「演員」兩字的數據 //參數df,給query設置默認搜索域 query.set("df", "name"); //參數sort,設置返回結果的排序規則 query.setSort("id",SolrQuery.ORDER.desc); //設置分頁參數 query.setStart(start); query.setRows(rows);//每一頁多少值 //參數hl,設置高亮 query.setHighlight(true); //設置高亮的字段 query.addHighlightField("name"); //設置高亮的樣式 query.setHighlightSimplePre("<font color='red'>"); query.setHighlightSimplePost("</font>"); //獲取查詢結果 QueryResponse response = solrServer.query(query); //兩種結果獲取:獲得文檔集合或者實體對象 //查詢獲得文檔的集合 SolrDocumentList solrDocumentList = response.getResults(); System.out.println("經過文檔集合獲取查詢的結果"); System.out.println("查詢結果的總數量:" + solrDocumentList.getNumFound()); //遍歷列表 /*for (SolrDocument doc : solrDocumentList) { System.out.println("id:"+doc.get("id")+" name:"+doc.get("name")+" description:"+doc.get("description")); }*/ //獲得實體對象 /*List<Person> tmpLists = response.getBeans(Person.class); if(tmpLists!=null && tmpLists.size()>0){ System.out.println("經過文檔集合獲取查詢的結果"); for(Person per:tmpLists){ System.out.println("id:"+per.getId()+" name:"+per.getName()+" description:"+per.getDescription()); } }*/ return solrDocumentList; } }