なんちゃって全文検索

searchall.png
全文検索を実行した図

GAEデータベースには全文検索機能はない。
そこで一旦データベース上の全記事を取得してjavaコード上で検索をかける方法で対処した。

  • 記事数が1000件を超える場合には先頭1000件以上の残りの記事は検索対象に登らない
  • データベースの全てのレコードを読み込むことになりレスポンスは遅い

キーワードの有無をcontainsで探る時にtoLowerCaseを噛ませること、
ターゲットのハイライトで(?i),$0で正規表現replaceAllすることがポイントです。

    public void doGet(final HttpServletRequest req, final HttpServletResponse res)
    {
		 final String keyword = req.getParameter("keyword");
		 if(keyword == null || keyword.isEmpty()) return;
		
    	 final PersistenceManager pm = PMF.get().getPersistenceManager();
         final String query = "select from " + Tidder.class.getName();
         final Query que = pm.newQuery(query);
         que.setOrdering("date descending");
         final List<Tidder> list = (List<Tidder>) que.execute();
         try
         {
             res.setContentType("text/html");
             res.setCharacterEncoding("UTF-8");
             final PrintWriter out = res.getWriter();
             out.write("<dl id='search_result'>\n");
             for (final Tidder t : list)
             {
            	 String raw = t.raw().getValue();
            	 String rawLow = raw.toLowerCase();
            	 String keywordLow = keyword.toLowerCase();
            	 if(t.name().toLowerCase().contains(keywordLow) || rawLow.contains(keywordLow))
            	 {
     	 			out.write("<dt><a href='"+URCF.encode(t.name())+"'>"+Miscellaneous.INSTANCE.htmlEncode(t.name()).replaceAll("(?i)"+keyword, "<span class='keyword'>$0</span>")+"</a></dt>\n");
     	 			int position = rawLow.indexOf(keywordLow);
     	 			String str = (position < 30)? raw : "..."+raw.substring(position-12);
     	 			String ret = (str.length() < 360)?Miscellaneous.INSTANCE.htmlEncode(str).replaceAll("(?i)"+keyword,"<span class='keyword'>$0</span>"):Miscellaneous.INSTANCE.htmlEncode(str.substring(0,360)).replaceAll("(?i)"+keyword,"<span class='keyword'>$0</span>")+"...";
     	 			out.write("<dd>"+ret+"</dd>\n");
            	 }
             }
             out.write("</dl>\n");
         }
         catch (final IOException e)
         {
             e.printStackTrace();
         }
    }    
    last modified: 30 August 2012 [ View wiki source Close ]
     
SEARCH DIFFERENCE ATTACHMENT RECENT POST