網頁搜尋客戶端

壹頁書發表於2016-02-23
網站上一些使用者自己上傳的歌曲侵權了.
編輯給我一個Excel,包含歌曲名稱和歌手名稱.
比如
最接近天堂的地方 張傑
最浪漫的事(改編版) 張傑
最美的太陽 張傑

括號裡的內容需要去除之後再匹配.由於Excel的內容五花八門,我和編輯的工作量都很大,但是還存在漏殺的情況.
突然我想到藉助單位已有的solr,可以簡化工作量,而且匹配的精確度更高.

Excel的兩列直接貼在網頁上(其實就是列間用\t分隔,\n換行),然後程式解析,不斷訪問solr。
匹配到的歌曲,回資料庫獲取詳細資訊,以CSV形式提供下載.

編輯確認下線的歌曲,資料庫update一下,就完事兒了.
由於匹配度較好,編輯確認篩選的工作輕鬆了很多,而且漏殺率很小.

maven依賴:
  1.         <dependency>
  2.             <artifactId>solr-solrj</artifactId>
  3.             <groupId>org.apache.solr</groupId>
  4.             <version>4.9.0</version>
  5.             <type>jar</type>
  6.             <scope>compile</scope>
  7.         </dependency>
  8.         <dependency>
  9.             <groupId>org.slf4j</groupId>
  10.             <artifactId>slf4j-simple</artifactId>
  11.             <version>1.7.6</version>
  12.         </dependency>
  13.         <dependency>
  14.             <groupId>javax.servlet</groupId>
  15.             <artifactId>servlet-api</artifactId>
  16.             <version>2.5</version>
  17.             <scope>provided</scope>
  18.         </dependency>
  19.         <dependency>
  20.             <groupId>mysql</groupId>
  21.             <artifactId>mysql-connector-java</artifactId>
  22.             <version>5.1.38</version>
  23.         </dependency>

核心Servlet

  1. package com.vv.tools;  
  2.   
  3. import java.io.IOException;  
  4. import java.sql.Connection;  
  5. import java.sql.DriverManager;  
  6. import java.sql.PreparedStatement;  
  7. import java.sql.ResultSet;  
  8. import java.sql.SQLException;  
  9. import java.util.ArrayList;  
  10. import java.util.Iterator;  
  11. import java.util.List;  
  12.   
  13. import javax.servlet.ServletException;  
  14. import javax.servlet.http.HttpServlet;  
  15. import javax.servlet.http.HttpServletRequest;  
  16. import javax.servlet.http.HttpServletResponse;  
  17.   
  18. import org.apache.solr.client.solrj.SolrServerException;  
  19. import org.apache.solr.client.solrj.impl.HttpSolrServer;  
  20. import org.apache.solr.client.solrj.response.QueryResponse;  
  21. import org.apache.solr.common.SolrDocument;  
  22. import org.apache.solr.common.SolrDocumentList;  
  23. import org.apache.solr.common.params.ModifiableSolrParams;  
  24.   
  25.   
  26. public class SearchServlet extends HttpServlet {  
  27.     private static final long serialVersionUID = 1L;  
  28.     private static String URL = "jdbc:mysql://192.168.1.138:30000/songod";  
  29.     private static String USERNAME = "xx";  
  30.     private static String PWD = "xx";  
  31.     private HttpSolrServer server = null;  
  32.   
  33.     private HttpSolrServer getSolrServer() {  
  34.         if (server == null) {  
  35.             String url = "http://192.168.1.204:8983/solr/Song";  
  36.             server = new HttpSolrServer(url);  
  37.             server.setSoTimeout(30000); // socket read timeout  
  38.             server.setConnectionTimeout(10000);  
  39.             server.setDefaultMaxConnectionsPerHost(10000);  
  40.             server.setMaxTotalConnections(10);  
  41.             server.setFollowRedirects(false); // defaults to false  
  42.             server.setAllowCompression(true);  
  43.             server.setMaxRetries(1);  
  44.         }  
  45.         return server;  
  46.     }  
  47.   
  48.     protected void doGet(HttpServletRequest request, HttpServletResponse response)  
  49.             throws ServletException, IOException {  
  50.         response.setCharacterEncoding("GBK");  
  51.         request.setCharacterEncoding("utf8");  
  52.   
  53.         String str = request.getParameter("data");  
  54.   
  55.         if (str != null && str != "") {  
  56.             try {  
  57.                 List<Integer> result = searchAll(str);  
  58.                 if (result.size() == 0) {  
  59.                     response.sendRedirect("index.html");  
  60.                 }  
  61.   
  62.                 response.setContentType("application/x-xls");  
  63.                 response.setHeader("Content-Disposition""attachment;filename=songs.csv");  
  64.                 Class.forName("com.mysql.jdbc.Driver");  
  65.                 Connection con = DriverManager.getConnection(URL, USERNAME, PWD);  
  66.                 PreparedStatement pt = con.prepareStatement(  
  67.                         "select songid,name,singername,vocalid,authflag from sod_song_ksc where songid = ?");  
  68.   
  69.                 for (Integer songid : result) {  
  70.                     pt.setInt(1, songid);  
  71.                     ResultSet rs = pt.executeQuery();  
  72.                     while (rs.next()) {  
  73.                         response.getWriter().print(rs.getString("songid") + ",");  
  74.                         response.getWriter().print(rs.getString("name") + ",");  
  75.                         response.getWriter().print(rs.getString("singername") + ",");  
  76.                         response.getWriter().print(rs.getString("vocalid") + ",");  
  77.                         response.getWriter().print(rs.getString("authflag") + "\n");  
  78.                     }  
  79.                     rs.close();  
  80.                 }  
  81.                 pt.close();  
  82.                 con.close();  
  83.                 response.getWriter().flush();  
  84.   
  85.             } catch (SolrServerException e) {  
  86.                 e.printStackTrace();  
  87.             } catch (ClassNotFoundException e) {  
  88.                 // TODO Auto-generated catch block  
  89.                 e.printStackTrace();  
  90.             } catch (SQLException e) {  
  91.                 // TODO Auto-generated catch block  
  92.                 e.printStackTrace();  
  93.             }  
  94.         }  
  95.     }  
  96.   
  97.     private List<Integer> searchAll(String str) throws SolrServerException {  
  98.         List<Integer> result = new ArrayList<Integer>(100);  
  99.         String[] rows = str.split("\r\n");  
  100.         for (String row : rows) {  
  101.             String[] info = row.split("\t");  
  102.             String name = info[0].replaceAll("[\\[(<《【]"" ").replaceAll("[`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~!@#¥%……&*()——+|{}【】‘;:”“’。,、?《》]""");  
  103.   
  104.             String singername = "*";  
  105.             if (info.length > 1) {  
  106.                 if (info[1].contains("/")) {  
  107.                     String[] artists = info[1].split("/");  
  108.                     for (String artist : artists) {  
  109.                         singername = artist;  
  110.                         result.addAll(search(name, singername));  
  111.                     }  
  112.                 } else {  
  113.                     singername = info[1];  
  114.                     result.addAll(search(name, singername));  
  115.                 }  
  116.             } else {  
  117.                 result.addAll(search(name, singername));  
  118.             }  
  119.         }  
  120.         return result;  
  121.     }  
  122.   
  123.     private List<Integer> search(String wdSongname, String wdSingername) throws SolrServerException {  
  124.         List<Integer> list = new ArrayList<Integer>();  
  125.         ModifiableSolrParams params = new ModifiableSolrParams();  
  126.         params.set("q""(+Song_Name:" + wdSongname + "  +Song_SingerName:" + wdSingername + ") or (+Song_Name:"  
  127.                 + wdSongname + "  and +Song_Name:" + wdSingername + ")");  
  128.         params.set("start"0);  
  129.         params.set("rows"300000);  
  130.         params.set("wt""json");  
  131.   
  132.         QueryResponse qrsp = getSolrServer().query(params);  
  133.         SolrDocumentList docs = qrsp.getResults();  
  134.   
  135.         Iterator it = docs.iterator();  
  136.         while (it.hasNext()) {  
  137.             SolrDocument doc = (SolrDocument) it.next();  
  138.             Integer songid = (Integer) doc.getFieldValue("Song_SongID");  
  139.             String name = (String) doc.getFieldValue("Song_Name");  
  140.             String singername = (String) doc.getFieldValue("Song_SingerName");  
  141.             String producer = (String) doc.getFieldValue("Song_Producer");  
  142.   
  143.             list.add(songid);  
  144.         }  
  145.   
  146.         return list;  
  147.     }  
  148.   
  149.     protected void doPost(HttpServletRequest request, HttpServletResponse response)  
  150.             throws ServletException, IOException {  
  151.         doGet(request, response);  
  152.     }  
  153.   
  154. }  

index.html網頁很簡單

<!DOCTYPE html>
<html>
    <head>
    <meta charset="UTF-8">
    <title>版權查詢</title>
</head>
<body>
    <form action="SearchServlet" method="POST">
        <textarea id="data" name="data" cols=100 rows=30>小花狸版權搜尋.請輸入歌曲名稱和歌手名稱.</textarea>
        

        <input type="submit" value="Upload" />
    </form>
</body>
</html>

在網頁輸入excel的內容


CSV的結果:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-1993297/,如需轉載,請註明出處,否則將追究法律責任。

相關文章