注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

无线时代辐射无穷

抓紧生宝宝,小心辐射

 
 
 

日志

 
 

lunece查找 近似文章的问题  

2009-10-20 19:25:18|  分类: lucene |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
我正在做一个网站的垂直搜索模块,现在碰到了以下问题。

请注意:根据字符串查询相关内容的方法我已经写好了,所以我不是问查找相关文章的算法。

我要问的是:

我的查找相关文章的方法 要求我传一个代表文章内容的字符串作为对比参数。

难道我在显示每篇文章之前都要先把 该文章的所有内容传给 查找相关文章的方法,然后获得相关文章列表吗?

如果文章的内容很多,这种传输会不会造成性能问题呢?

javaeye生成相关文章列表的凭据数据是什么呢?也是拿整篇文章的内容去求得相关文章列表?还是有其他更改好的方法?

如果 javaeye也是把文章的所有内容作为查找相关文章的凭据,那么这些内容是如何传到后台的呢,通过url参数吗?

小弟不才,还请各位大大帮助。

附上查询方法:

Java代码 复制代码
  1. package com.jdtqn.module.tools.search;   
  2.   
  3. import java.io.StringReader;   
  4. import java.util.ArrayList;   
  5. import java.util.List;   
  6.   
  7. import jeasy.analysis.MMAnalyzer;   
  8.   
  9. import org.apache.lucene.index.IndexReader;   
  10. import org.apache.lucene.search.Hits;   
  11. import org.apache.lucene.search.IndexSearcher;   
  12. import org.apache.lucene.search.Query;   
  13. import org.apache.lucene.search.similar.MoreLikeThis;   
  14.   
  15. import com.jdtqn.module.tools.SearchResult;   
  16. import com.jdtqn.module.tools.SearchResults;   
  17.   
  18. public class MoreLikeThisSearcher implements Seacher{   
  19.   
  20.     private String index_path="D:\\work\\resin-pro-3.0.26\\deploy\\jdtqn_final\\anthemIndex";   
  21.        
  22.     public void setIndex_path(String index_path){   
  23.         this.index_path=index_path;   
  24.     }   
  25.     public SearchResults search(String queryWord) throws Exception {   
  26.            
  27.         IndexReader r = IndexReader.open(index_path);    
  28.         MoreLikeThis mlt = new MoreLikeThis(r); //传入IndexReader对象提供查询   
  29.         mlt.setAnalyzer(new MMAnalyzer());//设置使用的分词器   
  30.         mlt.setFieldNames(new String[]{"htmlTitle","htmlContent"}); //设置需要比较的field字段   
  31.         mlt.setMinWordLen(0);   
  32.         mlt.setMinDocFreq(2);//出现词的频率小于二,则该词不作为关键词被纳入搜索   
  33.         mlt.setMinTermFreq(3);   
  34.         mlt.setBoost(true);   
  35.         Query query = null;   
  36.         query = mlt.like(new StringReader(queryWord)); //创建查询,传入查询内容可为任意的Reader子类   
  37.         IndexSearcher searcher = new IndexSearcher(index_path);   
  38.         Hits hits = searcher.search(query); //根据查询返回相似文档   
  39.         int len = hits.length();   
  40.         System.out.println(len);   
  41.         SearchResult searchResult;   
  42.         SearchResults searchResults = new SearchResults();   
  43.         searchResults.setHitsCount(len);   
  44.         List<searchresult> searchList = new ArrayList<searchresult>();   
  45.         for (int i = 0; i < Math.min(7, len); i++) //如果比7大就只返回前7条   
  46.         {   
  47.             searchResult = new SearchResult();   
  48.             System.out.println(hits.score(i));   
  49.             searchResult.setHtmlName(hits.doc(i).get("htmlName"));   
  50.             System.out.println(hits.doc(i).get("htmlName"));   
  51.             searchResult.setHtmlTitle(hits.doc(i).get("htmlTitle"));   
  52.             searchList.add(searchResult);   
  53.             System.out.println("*****************");   
  54.         }   
  55.         r.close(); //关闭索引   
  56.         return searchResults;   
  57.     }   
  58. }  
package com.jdtqn.module.tools.search;    import java.io.StringReader;  import java.util.ArrayList;  import java.util.List;    import jeasy.analysis.MMAnalyzer;    import org.apache.lucene.index.IndexReader;  import org.apache.lucene.search.Hits;  import org.apache.lucene.search.IndexSearcher;  import org.apache.lucene.search.Query;  import org.apache.lucene.search.similar.MoreLikeThis;    import com.jdtqn.module.tools.SearchResult;  import com.jdtqn.module.tools.SearchResults;    public class MoreLikeThisSearcher implements Seacher{     private String index_path="D:\\work\\resin-pro-3.0.26\\deploy\\jdtqn_final\\anthemIndex";      public void setIndex_path(String index_path){    this.index_path=index_path;   }   public SearchResults search(String queryWord) throws Exception {        IndexReader r = IndexReader.open(index_path);     MoreLikeThis mlt = new MoreLikeThis(r); //传入IndexReader对象提供查询    mlt.setAnalyzer(new MMAnalyzer());//设置使用的分词器    mlt.setFieldNames(new String[]{"htmlTitle","htmlContent"}); //设置需要比较的field字段    mlt.setMinWordLen(0);    mlt.setMinDocFreq(2);//出现词的频率小于二,则该词不作为关键词被纳入搜索    mlt.setMinTermFreq(3);    mlt.setBoost(true);    Query query = null;    query = mlt.like(new StringReader(queryWord)); //创建查询,传入查询内容可为任意的Reader子类    IndexSearcher searcher = new IndexSearcher(index_path);    Hits hits = searcher.search(query); //根据查询返回相似文档    int len = hits.length();    System.out.println(len);    SearchResult searchResult;    SearchResults searchResults = new SearchResults();    searchResults.setHitsCount(len);    List<searchresult> searchList = new ArrayList<searchresult>();    for (int i = 0; i < Math.min(7, len); i++) //如果比7大就只返回前7条    {     searchResult = new SearchResult();     System.out.println(hits.score(i));     searchResult.setHtmlName(hits.doc(i).get("htmlName"));     System.out.println(hits.doc(i).get("htmlName"));     searchResult.setHtmlTitle(hits.doc(i).get("htmlTitle"));     searchList.add(searchResult);     System.out.println("*****************");    }    r.close(); //关闭索引    return searchResults;   }  }    

问题补充
难道就没人知道吗?没人做相似文章推荐这个功能吗?

自己顶下

采纳的答案

2008-08-12 kimmking (高级程序员)

相关文章的原理:

每一篇文字发布时,从其中抽取几个关键词(tag),
相关文章即是具有相同关键词的最近的几篇。
每一篇文章的各个tag可以给一个权重,也可以按各个关键词的权重和来作为文章相似度的指标。

(比如:本文的tag为 lunece 0.5,文章 0.2,查找 0.2...
  评论这张
 
阅读(399)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017