Solr簡單總結

Solr

運行Solr服務

方式一:Jetty服務器啓動Solr

  1. 進入solr-4.10.2/example目錄
  2. 打開命令行,執行java –jar start.jar命令,便可啓動Solr服務
  3. 打開瀏覽器,經過http://localhost:8983/solr來訪問Solr管理頁面。

方式二:Tomcat服務器啓動Solr

  1. 部署Web服務,將solr-4.10.2/example/webapps/solr.war複製到本身的tomcat/webapps目錄中,並解壓,而後刪除solr.war文件
  2. 在Tomcat中加入相關jar包:將「resource\solr在tomcat運行須要導入的jar包\lib」下的jar包複製tomcat/webapps/solr/WEB-INF/lib下。
    而且把class/log4j.properties複製到tomcat/webapps/solr/WEB-INF下
  3. 修改Tomcat配置文件,指向Solr的索引庫及配置目錄。
    注意,這裏能夠指向solr-4.10.2/example/solr目錄,若是想獨立出來,也能夠將這個solr文件夾複製出來到任意位置(不要出現中文),例如:例如:C:/tmp/solr
  4. 進入Tomcat文件夾,用記事本打開:tomcat/bin/catalina.bat文件,添加一條配置信息,指向咱們的索引庫及配置目錄:set "JAVA_OPTS=-Dsolr.solr.home=C:/tmp/solr"
  5. 進入tomcat/bin目錄,雙擊 startup.bat文件啓動服務器
  6. 打開瀏覽器,訪問http://localhost:8080/solr 進入Solr管理頁面

Solr管理頁面

Dashboard儀表盤

顯示solr服務及系統運行信息java

Logging(日誌)

solr運行的日誌信息web

Core Admin(Core管理)

在Solr中,每個Core,表明一個索引庫,裏面包含索引數據及其配置信息。
Solr中能夠擁有多個Core,也就同時管理多個索引庫!就像在MySQL中能夠有多個database同樣!瀏覽器

JavaProperties

Java運行環境信息tomcat

ThreadDump

solr運行線程信息服務器

CoreSelector(Core選擇器)

schema.xml

注意:在本文件中,有兩個字段是Solr自帶的字段,絕對不要刪除:_version_節點和_root_節點app

Field字段定義字段的屬性信息段

屬性及含義:
name:字段名稱,最好如下劃線或者字母開頭
type:字段類型,指向的是本文件中的 標籤
indexed:是否建立索引
stored:是否被存儲
multiValued:是否能夠有多個值,若是字段能夠有多個值,設置爲truewebapp

FieldType指定數據類型

屬性及含義:
name:字段類型的名稱,能夠自定義, 標籤的type屬性能夠引用該字段,來指定數據類型
class:字段類型在Solr中的類。StrField可索引不可分詞。TextField字段可索引,能夠分詞,因此須要指定分詞器
:這個子標籤用來指定分詞器this

惟一主鍵 id

Lucene中原本是沒有主鍵的。刪除和修改都須要根據詞條進行匹配。而Solr卻能夠設置一個字段爲惟一主鍵,這樣刪改操做均可以根據主鍵來進行!命令行

IK分詞器

<fieldType name="text_ik" class="solr.TextField">
    <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>

SolrJ的使用

添加或修改索引庫數據

private static String baseURL = "http://localhost:8080/solr/core1";
@Test
public void createTest() throws Exception {
    //鏈接solr服務器
    HttpSolrServer solrServer = new HttpSolrServer(baseURL);
    //建立文檔對象
    SolrInputDocument document = new SolrInputDocument();
    document.addField("id", "5");
    document.addField("title", "8848手機,鈦合金外殼,註定不平凡");
    document.addField("content", "8848發發發");
    //向solr服務器寫入文檔
    solrServer.add(document);
    solrServer.commit();
}
@Test
public void create2Test() throws Exception {
    //鏈接solr服務器
    HttpSolrServer solrServer = new HttpSolrServer(baseURL);
    //建立文檔對象
    Item item = new Item();
    item.setId("6");
    item.setTitle("金立M2017成功人士的標配");
    item.setContent("金立你值得擁有");
    //向solr服務器寫入文檔
    solrServer.addBean(item);
    solrServer.commit();
    
}
//添加@Field註解
public class Item{
    @Field
    private String id;
    @Field
    private String title;
    @Field
    private String content;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getContent() {
        return content;
    }
    public void setContent(String content) {
        this.content = content;
    }
}

刪除索引庫數據

@Test
public void deleteTest() throws SolrServerException, IOException {
    // 鏈接solr服務器
    HttpSolrServer solrServer = new HttpSolrServer(baseURL);
    // 刪除索引
    //solrServer.deleteById("6");
    solrServer.deleteByQuery("title:金立");
    // 提交
    solrServer.commit();
}

查詢索引庫數據

在建立SolrQuery時,咱們填寫的Query語句,能夠有如下高級寫法:線程

  1. 通配符?和 *:「*」表示匹配任意字符;「?」表示匹配出現的位置
  2. 布爾操做:AND、OR和NOT布爾操做(推薦使用大寫,區分普通字段)
  3. 子表達式查詢(子查詢):可使用「()」構造子查詢。好比:(query1 AND query2) OR (query3 AND query4)
  4. 類似度查詢:指定編輯距離的類似度查詢:對模糊查詢能夠設置編輯距離,可選0-2的整數(默認爲2):title:appla~1。
  5. 範圍查詢(Range Query):Lucene支持對數字、日期甚至文本的範圍查詢,而且兩端範圍。結束的範圍可使用「*」通配符。
    (1)日期範圍(ISO-8601時間GMT):a_begin_date:[1990-01-01T00:00:00.000Z TO 1999-12-31T24:59:99.999Z]
    (2)數字:salary:[2000 TO *]
    (3)文本:entryNm:[a TO a]
@Test
public void queryTest() throws SolrServerException{
    // 鏈接solr服務器
    HttpSolrServer solrServer = new HttpSolrServer(baseURL);
    //建立查詢條件對象
    SolrQuery params = new SolrQuery("*:*");
    //執行查詢,獲取響應數據
    QueryResponse response = solrServer.query(params);
    //獲取數據結果集
    SolrDocumentList list = response.getResults();
    System.out.println("一共獲取了" + list.size()+"條結果:");
    for (SolrDocument solrDocument : list) {
        System.out.println("id: " + solrDocument.getFieldValue("id"));
        System.out.println("title:" + solrDocument.getFieldValue("title"));
    }
}
@Test
public void queryBeanTest() throws SolrServerException{
    // 鏈接solr服務器
    HttpSolrServer solrServer = new HttpSolrServer(baseURL);
    //建立查詢條件對象
    SolrQuery params = new SolrQuery("*:*");
    //執行查詢,獲取響應
    QueryResponse response = solrServer.query(params);
    List<Item> beans = response.getBeans(Item.class);
    System.out.println("一共獲取了" + beans.size()+"條結果:");
    for (Item item : beans) {
        System.out.println("id: " + item.getId());
        System.out.println("title:" + item.getTitle());
    }
}

實現排序

@Test
public void querySortTest() throws SolrServerException, IOException {
    // 鏈接solr服務器
    HttpSolrServer solrServer = new HttpSolrServer(baseURL);
    // 建立查詢條件對象,範圍查詢,包含兩端
    SolrQuery query = new SolrQuery("*:*");
    // 設置查詢的排序參數,1-排序的字段名,2-排序方式(ORDER:asc desc)
    query.setSort("id", ORDER.asc);
    // 執行查詢,獲取響應數據
    QueryResponse response = solrServer.query(query);
    // 獲取結果集數據
    List<Item> list = response.getBeans(Item.class);
    System.out.println("總記錄數  numFound:"+response.getResults().getNumFound());
    for (Item item : list) {
        System.out.println("id: " + item.getId());
        System.out.println("title:" + item.getTitle());
    }
}

實現分頁

@Test
public void queryPageTest() throws SolrServerException, IOException {
    // 準備分頁參數
    int pageNum = 1; //頁碼
    int pageSize = 2; //每頁條數
    // 鏈接solr服務器
    HttpSolrServer solrServer = new HttpSolrServer(baseURL);
    // 建立查詢條件對象
    SolrQuery params = new SolrQuery("*:*");
    // 設置查詢的排序參數,1-排序的字段名,2-排序方式(ORDER:asc desc)
    params.setStart((pageNum-1)*pageSize);//設置起始條數
    params.setRows(pageSize);//設置每頁條數
    // 執行查詢,獲取響應數據
    QueryResponse response = solrServer.query(params);
    // 獲取結果集數據
    SolrDocumentList list = response.getResults();
    System.out.println("一共獲取了" + list.size() + "條結果:");
    for (SolrDocument solrDocument : list) {
        System.out.println("id: " + solrDocument.getFieldValue("id"));
        System.out.println("title:" + solrDocument.getFieldValue("title"));
    }
}

實現高亮

@Test
public void highLightingTest() throws SolrServerException, IOException{
    // 初始化solrj服務
    HttpSolrServer server = new HttpSolrServer(baseURL);
    // 設置查詢條件
    SolrQuery params = new SolrQuery("title:手機");
    // 設置前置標籤
    params.setHighlightSimplePre("<em >");
    // 設置後置標籤
    params.setHighlightSimplePost("</em>");
    // 添加高亮字段
    params.addHighlightField("title");
    // 執行查詢
    QueryResponse queryResponse = server.query(params);
    // 外層的Map,key:id,value:id之外的其餘高亮字段,可能有多個,也是一個Map
    // 內層的Map,key:高亮字段的名稱,value:字段的內容,集合
    Map<String, Map<String, List<String>>> highlighting = queryResponse.getHighlighting();
    // 遍歷map,獲取結果
    Set<String> ids = highlighting.keySet();
    for (String id : ids) {
        System.out.println("id: " + id);;
        // 獲取高亮字段的集合
        Map<String, List<String>> map = highlighting.get(id);
        // 獲取高亮字段
        System.out.println(map.get("title").get(0));
        // 由於content不是高亮字段,因此打印出的內容爲null
        System.out.println(map.get("content"));
    }
    
}
相關文章
相關標籤/搜索