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

介紹

Solr是一款開源的全文檢索引擎,基於lucene。擁有完善的可配置功能界面。具備豐富的查詢語言,可擴展,可優化。php

下載安裝

進入solr官網下載包(這裏我使用的版本是8.0)java

http://www.apache.org/dyn/closer.lua/lucene/solr/8.0.0git

啓動Solr

命令行進入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

建立Core實例

Solr全部操做在Core中進行,因此使用Solr以前需先建立Core實例,Solr服務可建立多個Core實例。json

兩種方式建立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對象
     *
     * 該對象有兩個可使用,都是線程安全的
     * 一、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;

    }

}
相關文章
相關標籤/搜索