Solr全文檢索引擎配置及使用方法


介紹

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;

    }

}

 


免責聲明!

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



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