安装庖丁会出现一系列问题,最后找到这篇文章来装庖丁:http://blog.163.com/sky_jun1016/blog/static/29994156201071274459377/,问题确实少了不少,最后要发布时发现搜索欢迎您、不锈钢等3个字的词时发现页面不见了,搜索共和国、圆明园之类的词时有页面,记录为0。
剖析:当你抓取的页面数据中含有3字词(如我搜索的欢迎您、不锈钢等)时,返回的结果没有页面。当你抓取的页面数据中不含3字词时,返回0记录的页面。
具体看后台报的错误,逐步追踪发现是Query有问题,追踪过程花了好长时间,因为nutch的匹配过程是多线程处理的,......
定位到了query,最后查到它的源头是在org.apache.nutch.analysis.NutchAnalysis的final public Query parseByLucene(Configuration conf) throws ParseException方法中,看代码:
Query query = new Query(conf);
if (queryString.length() > 0) {
// lucene分词
org.apache.lucene.queryParser.QueryParser parserLucene =
new org.apache.lucene.queryParser.QueryParser("", analyzer);
org.apache.lucene.search.Query q = null;
try {
q = parserLucene.parse(queryString); <<=========================================================中文分词截取
} catch (org.apache.lucene.queryParser.ParseException e) {
e.printStackTrace();
}
String termStrings = q.toString();
if (termStrings.indexOf(" ") > -1)
termStrings = termStrings.substring(1, termStrings.length()-1);
String[] terms = termStrings.split(" ");
for (int i = 0; i < terms.length; i++) {
String[] tems = {terms[i]};
query.addRequiredPhrase(tems, Clause.DEFAULT_FIELD);
}
}
return query; 《===========================================返回分词
跟踪发现query中得到的值是:不锈 不锈钢,有两个以致于后面的程序会出现String index out of range: -2的错误。
再往前跟踪,最上面的query的值为不锈钢、q的值为不锈 不锈钢,找到解决办法了。修改代码如下:
final public Query parseByLucene(Configuration conf) throws ParseException {
Query query = new Query(conf);
System.out.println("queryString="+queryString);
if (queryString.length() > 0) {
// lucene
org.apache.lucene.queryParser.QueryParser parserLucene = new org.apache.lucene.queryParser.QueryParser(
"", analyzer);
org.apache.lucene.search.Query q = null;
try {
q = parserLucene.parse(queryString);
System.out.println("q="+q);
} catch (org.apache.lucene.queryParser.ParseException e) {
e.printStackTrace();
}
String termStrings = q.toString();
if (termStrings.indexOf(" ") > -1)
termStrings = termStrings.substring(1, termStrings.length() - 1);
String[] terms = termStrings.split(" ");
List<String> list = new ArrayList<String>();
for(int i = 0; i < terms.length; i++){//判断字符串包含问题
if(i < terms.length-1){
if(terms[i+1].indexOf(terms[i]) <= -1)//terms[i]不被terms[i+1]包含,收录terms[i]
list.add(terms[i]);
}else{
list.add(terms[i]);
}
}
if(null != list){
for (String term : list) {
String[] tems = { term };
query.addRequiredPhrase(tems, Clause.DEFAULT_FIELD);
}
}
}
System.out.println("---------------------------|query:" + query + "|-------------------------------");
return query;
}
好吧,就这样!
还需要注意一点:添加自定义分词后,需要删除.compiled文件夹。