现在的位置: 首页 > 综合 > 正文

庖丁中文分词出现的问题

2018年01月29日 ⁄ 综合 ⁄ 共 2506字 ⁄ 字号 评论关闭

安装庖丁会出现一系列问题,最后找到这篇文章来装庖丁:http://blog.163.com/sky_jun1016/blog/static/29994156201071274459377/,问题确实少了不少,最后要发布时发现搜索欢迎您、不锈钢等3个字的词时发现页面不见了,搜索共和国、圆明园之类的词时有页面,记录为0。

剖析:当你抓取的页面数据中含有3字词(如我搜索的欢迎您、不锈钢等)时,返回的结果没有页面。当你抓取的页面数据中不含3字词时,返回0记录的页面。

具体看后台报的错误,逐步追踪发现是Query有问题,追踪过程花了好长时间,因为nutch的匹配过程是多线程处理的,......

定位到了query,最后查到它的源头是在org.apache.nutch.analysis.NutchAnalysisfinal 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文件夹。

抱歉!评论已关闭.