Java之利用Filter實現兩組關鍵詞組合查詢

1. 需求

根據客戶名稱,查詢客戶網絡上面的負面信息。如客戶名稱爲”鹽城 鹽城市“,並自定義負面關鍵詞“貪污 受賄 被曝 曝光 小三 裸照”等,則是要求將包含這些負面關鍵詞且包含客戶名稱的信息查詢出來。注意事項:客戶名稱可定義多個(10個以內),負面關鍵詞可以定義多個(300個以內)。

分析

如果只用一個參數q去定義查詢,很可能查詢字符串長度會溢出,查詢q應該形如:

((鹽城 OR 鹽城市) AND 貪污) OR ((鹽城 OR 鹽城市) AND 受賄)…

所以本文采用Filter的形式來解決這一問題。

2. 解決步驟

  • 步驟一:將所需要查詢的客戶名稱、負面關鍵詞加入到中文分詞器詞典文件中;(本文略)

只有中文能夠將這些關鍵詞正確分詞,其它各項操作才能順利進行。

  • 步驟二:用爬蟲工具將網絡上的信息抓取下來後,在創建Lucene索引的時候, 將包含負面關鍵詞的文檔自定義分值(包含負面關鍵詞越多,分值越高);(說明略,可以參考:Lucene4.1:運用中文分詞器創建索引,給指定文本增加boost值)
    這樣可以保證查詢時,包含負面關鍵詞越多的文檔,查詢時排在越前面。
  • 步驟三:按客戶名稱查詢(如:鹽城 鹽城市);
    正常查詢輸入。
  • 步驟四:查詢時加入過濾器(Filter),過濾器的輸入就是負面關鍵詞列表;
    加入過濾器後,實現的查詢結果類似於:((鹽城 OR 鹽城市) AND 貪污) OR ((鹽城 OR 鹽城市) AND 受賄)…
  • 步驟五:自定義高亮結果。
    因爲客戶名稱需要高亮,負面關鍵詞也需要高亮,所以需要自定義高亮顯示。

3. SlorJ實現代碼

package com.clzhang.sample.solr;

import java.io.*;
import java.util.*;
//加入Java開發交流君樣:756584822一起吹水聊天
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.highlight.Highlighter;
import org.apache.lucene.search.highlight.QueryScorer;
import org.apache.lucene.search.highlight.SimpleSpanFragmenter;
import org.apache.lucene.search.highlight.TokenSources;
import org.apache.lucene.util.Version;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrDocument;
//加入Java開發交流君樣:756584822一起吹水聊天
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.chenlb.mmseg4j.Dictionary;
import com.chenlb.mmseg4j.analysis.ComplexAnalyzer;

/**
 * 綜合:按客戶名稱查詢客戶網絡上面的負面信息
 * @author Administrator
 *
 */
public class SlorJHighlightTest {
    // mmseg4j字典路徑
    private static final String MMSEG4J_DICT_PATH = "C:\\solr\\mm4jdic";
    private static Dictionary dictionary = Dictionary.getInstance(MMSEG4J_DICT_PATH);

    private HttpSolrServer server;
    private static final String DEFAULT_URL = "http://localhost:8080/solr/news";

    @Before
    public void init() {
        // 初始化Solr服務器句柄
        server = new HttpSolrServer(DEFAULT_URL);
        server.setMaxRetries(1); // defaults to 0. > 1 not recommended.
        server.setConnectionTimeout(5000); // 5 seconds to establish TCP
        server.setSoTimeout(1000); // socket read timeout
        server.setDefaultMaxConnectionsPerHost(100);
        server.setMaxTotalConnections(100);
        server.setFollowRedirects(false); // defaults to false
        server.setAllowCompression(true);
    }
//加入Java開發交流君樣:756584822一起吹水聊天
    @After
    public void destory() {
        server = null;
        System.runFinalization();
        System.gc();
    }

    @Test
    public void queryCase() {
        // 步驟一:查詢關鍵詞
        String keyword = "(鹽城 鹽城市)";
        SolrQuery params = new SolrQuery("webTitle:" + keyword);
        params.set("start", 0);
        params.set("rows", 5);
        params.set("fl", "objectId,webTitle,webContent");
//        params.set("sort", "webTime desc");

        // 步驟二:負面關鍵詞
        String negativeWord = "(貪污 受賄 被曝 曝光 小三 裸照)"; 
        params.addFilterQuery("webTitle:" + negativeWord);

        try {
            // 步驟三:需要高亮的關鍵詞,默認等於查詢關鍵詞+負面關鍵詞
            String hlKeywords = keyword + " " + negativeWord;
           //加入Java開發交流君樣:756584822一起吹水聊天 
            // 查詢
            QueryResponse response = server.query(params);
            Analyzer analyzer = new ComplexAnalyzer(dictionary);
            QueryScorer scorer = new QueryScorer(new QueryParser(
                    Version.LUCENE_41, null, analyzer).parse(hlKeywords), null);
            Highlighter highlighter = new Highlighter(scorer);
            highlighter.setTextFragmenter(new SimpleSpanFragmenter(scorer));

            // 輸出
            SolrDocumentList list = response.getResults();
            System.out.println("返回:" + list.getNumFound() + "條記錄\t耗時:" + response.getElapsedTime() + "毫秒");
            for (int i = 0; i < list.size(); i++) {
                SolrDocument doc = (SolrDocument)list.get(i);
                String objectId = doc.get("objectId").toString();
                String title = doc.get("webTitle").toString();
                String content = doc.get("webContent").toString();
                StringBuilder sbTitle = new StringBuilder();
            //加入Java開發交流君樣:756584822一起吹水聊天    
                // 有高亮結果則用高亮結果;沒有則用無高亮查詢結果。
                // 僅對標題(webTitle)高亮,內容(webContent)忽略
                TokenStream streamContent = TokenSources.getTokenStream("", title, analyzer);
                String[] fragContent = highlighter.getBestFragments(streamContent, title, 5000);
                if(fragContent != null && fragContent.length > 0) {
                    for(String str: fragContent) {
                        sbTitle.append(str);
                    }
                }else {
                    sbTitle.append(title);
                }
                System.out.println(sbTitle.toString());
//                System.out.println(content);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } 
    }
}//加入Java開發交流君樣:756584822一起吹水聊天

輸出:

返回:13條記錄 耗時:94毫秒
[曝光臺]實名舉報江蘇鹽城市阜寧縣吳灘鎮派出所辦案無能
鹽城質監局長馮建東貪@污糜爛被曝光:包二奶、玩小姐 還找黑客刪帖遭曝光
鹽城質監局長馮建東“包二奶、招小姐、淫下屬”醜行曝光
江蘇鹽城市中級人民法院是什麼鳥人?居然造出一個貪污大犯趙作海
[爆 猛 料]鹽城市亭湖農委下屬單位領導貪污特種苗木補助款




image

最新2020整理收集的一些高頻面試題(都整理成文檔),有很多幹貨,包含mysql,netty,spring,線程,spring cloud、jvm、源碼、算法等詳細講解,也有詳細的學習規劃圖,面試題整理等,需要獲取這些內容的朋友請加Q君樣:756584822

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章