介紹
Solr是一款開源的全文檢索引擎,基於lucene。擁有完善的可配置功能界面。具有豐富的查詢語言,可擴展,可優化。
下載安裝
進入solr官網下載包(這里我使用的版本是8.0)
http://www.apache.org/dyn/closer.lua/lucene/solr/8.0.0
啟動Solr
命令行進入solr的bin目錄,提示Started Solr server on port 8983. Happy searching!即成功啟動服務。
常用命令
solr start -p 端口號 啟動服務
solr restart -p 端口號 重啟服務
solr stop -p 端口號 關閉服務
solr create -c name 創建一個core實例
創建Core實例
Solr所有操作在Core中進行,所以使用Solr之前需先創建Core實例,Solr服務可創建多個Core實例。
兩種方式創建Core實例,創建Core實例將在solr目錄下server/solr生成對應目錄。
通過命令創建
AdminUI創建
配置Schema
Schema配置將告訴solr服務如何建立索引,它的配置圍繞core目錄下conf/managed-schema文件,該文件指定每個字段類型,分詞方式。
可通過手動編輯或者使用schemaAPI進行配置(推薦使用schemaAPI,可不需要重新加載Core或重啟Solr服務,方便維護),不推薦使用手動編輯的方式(可能造成數據丟失)。
配置中文分詞器
Solr雖然自帶的中文分詞器,但不能自定義中文詞庫,擴展性較差。這里我們使用IK分詞器,這是一個第三方的分詞器,可以很好的擴展中文詞庫。
github地址(含配置方法/使用教程):https://github.com/magese/ik-analyzer-solr
可在AdminUI中Analysis中測試分詞效果
DIH導入索引數據
DIH全稱是Data Import Handler 數據導入處理器,作用是將數據導入到Solr中,而數據存儲在xml,pdf或關系型數據庫中。solr首先需要獲取這些數據,然后在數據中建立索引達到快速搜索的目的。
1.在core/conf/solrconfig.xml文件中配置數據導入文件映射位置
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler"> <lst name="defaults"> <str name="config">db-data-config.xml</str> </lst> </requestHandler>
2.copy一份導入數據示例文件到core/conf/目錄中,並重命名為db-data-config.xml
3.修改db-data-config.xml配置
<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>
4.執行DIH數據導入命令(AdminUI)
5.測試數據是否成功導入
Query查詢參數說明
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 查詢語法的版本,建議不使用它,由服務器指定默認值。
Solr的檢索運算符
“:” 指定字段查指定值,如返回所有值*:*
“?” 表示單個任意字符的通配
“*” 表示多個任意字符的通配(不能在檢索的項開始使用*或者?符號)
“~” 表示模糊檢索,如檢索拼寫類似於”roam”的項這樣寫:roam~將找到形如foam和roams的單詞;roam~0.8,檢索返回相似度在0.8以上的記錄。
AND、|| 布爾操作符
OR、&& 布爾操作符
NOT、!、-(排除操作符不能單獨與項使用構成查詢)
“+” 存在操作符,要求符號”+”后的項必須在文檔相應的域中存在²
( ) 用於構成子查詢
[] 包含范圍檢索,如檢索某時間段記錄,包含頭尾,date:[201507 TO 201510]
{} 不包含范圍檢索,如檢索某時間段記錄,不包含頭尾date:{201507 TO 201510}
JAVA連接Solr
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對象 * * 該對象有兩個可以使用,都是線程安全的 * 1、CommonsHttpSolrServer:啟動web服務器使用的,通過http請求的 * 2、 EmbeddedSolrServer:內嵌式的,導入solr的jar包就可以使用了 * 3、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; } }