tianhaoleng 2008-08-12 12:52
浏览 162
已采纳

lunece查找 近似文章的问题

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



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



我要问的是:



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



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



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



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



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



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



附上查询方法:



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;
}

}


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



自己顶下
  • 写回答

1条回答 默认 最新

  • kimmking 博客专家认证 2008-08-12 21:46
    关注

    相关文章的原理:

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

    (比如:本文的tag为 lunece 0.5,文章 0.2,查找 0.2...

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 删除虚拟显示器驱动 删除所有 Xorg 配置文件 删除显示器缓存文件 重启系统 可是依旧无法退出虚拟显示器
  • ¥15 vscode程序一直报同样的错,如何解决?
  • ¥15 关于使用unity中遇到的问题
  • ¥15 开放世界如何写线性关卡的用例(类似原神)
  • ¥15 关于并联谐振电磁感应加热
  • ¥60 请查询全国几个煤炭大省近十年的煤炭铁路及公路的货物周转量
  • ¥15 请帮我看看我这道c语言题到底漏了哪种情况吧!
  • ¥66 如何制作支付宝扫码跳转到发红包界面
  • ¥15 pnpm 下载element-plus
  • ¥15 解决编写PyDracula时遇到的问题