package com.blinkcoder.kit;
import com.blinkcoder.common.myConstants;
import com.blinkcoder.model.Blog;
import com.blinkcoder.search.SearchHelper;
import com.jfinal.kit.PathKit;
import com.jfinal.log.Logger;
import com.jfinal.plugin.activerecord.Page;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.*;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* User: Michael Chen
* Email: yidongnan@gmail.com
* Date: 14-3-3
* Time: 下午1:49
*/
public class SearchKit {
private final static Logger log = Logger.getLogger(SearchKit.class);
private final static String _g_lucene_path = PathKit.getWebRootPath() +
File.separator + "WEB-INF" + File.separator + myConstants
.LUCENE_DIR + File.separator;
private final static SearchHelper g_holder;
static {
try {
g_holder = SearchHelper.init(_g_lucene_path);
} catch (IOException e) {
throw new RuntimeException("Unabled to init index repository.", e);
}
}
public static SearchHelper getHolder() {
return g_holder;
}
public static Page<Blog> findBlogs(String key, boolean only_subject,
boolean sort_by_time, int p, int count) {
try {
Sort sort = sort_by_time ? new Sort(new SortField(
SearchHelper.FN_ID, SortField.Type.INT, true)) : new Sort(
new SortField("title", SortField.Type.SCORE),
new SortField("content", SortField.Type.SCORE),
new SortField(SearchHelper.FN_ID, SortField.Type.INT,
true));
List<Integer> ids = g_holder.find(Blog.class, makeBlogQuery(key,
only_subject), null, sort, p, count);
List<Blog> blogList = new ArrayList<>();
for (int id : ids) {
blogList.add(Blog.dao.Get(id));
}
return new Page<>(blogList, p, count, countBlogs(key,
only_subject), blogList.size());
} catch (IOException e) {
log.error("find Blogs failed, key=" + key + "," +
"only_subject=" + only_subject, e);
}
return null;
}
public static int countBlogs(String key, boolean only_subject) {
try {
return g_holder.count(Blog.class, makeBlogQuery(key,
only_subject), null);
} catch (IOException e) {
log.error("countBlogs failed, key=" + key + "," +
"only_subject=" + only_subject, e);
}
return -1;
}
private static Query makeBlogQuery(String key, boolean only_subject) {
key = QueryParser.escape(IKAnalyzerKit.cleanupKey(key));
BooleanQuery query = new BooleanQuery();
BooleanQuery complexQuery = new BooleanQuery();
complexQuery.add(SearchHelper.makeQuery("title", key, 50.0f),
BooleanClause.Occur.SHOULD);
if (!only_subject) {
complexQuery.add(SearchHelper.makeQuery("content", key, 1.0f),
BooleanClause.Occur.SHOULD);
complexQuery.add(SearchHelper.makeQuery("tags", key, 20.0f),
BooleanClause.Occur.SHOULD);
}
query.add(complexQuery, BooleanClause.Occur.MUST);
return query;
}
}