类似百度google搜索的综合查询

爱T 2013-07-16 05:49:47
目前是两大项目都在同时集成在一个门户下,现在要在门户下一个综合查询,此功能类似百度搜索引擎,输入关键字(可以是两个项目任一模块下的任一字段),点击查询,出来相关信息的list页面,而且这个list展示的字段是这个关键字同一模块下的相关联的信息;还有输入关键字的时候可以联动出来相关信息的字段;

一句话就是百度搜索,两个项目是独立分开的,但来源同一个数据库;

技术上没有接触过这一块,请大神们从思路到技术点上的支持,谢谢
...全文
205 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
wkwkwkwkwkwk 2013-07-17
  • 打赏
  • 举报
回复
lucene搜索引擎依赖一个索引库类似小数据库, String lucenePath = req.getSession().getServletContext() .getRealPath("/WEB-INF/resultsFile/luceneFile"); 这个是放库文件的文件夹。 IndexWriter这个类负责增删改里面的数据,具体操作的类Document IndexWriter writer=new IndexWriter(dir,an,flag,IndexWriter.MaxFieldLength.UNLIMITED); dir是lucene封装的一个带路径的东西看成文件就行,flag初始化lucene库文件(指定目录自动生成库文件)是给true反之给false,后面参数的忘了。 搜索的方法很多上网自己找找看了,根据Document里面的field(相当与数据库的字段)进行搜索。
爱T 2013-07-17
  • 打赏
  • 举报
回复
引用 3 楼 wkwkwkwkwkwk 的回复:
String lucenePath = req.getSession().getServletContext() .getRealPath("/WEB-INF/resultsFile/luceneFile"); File f = new File(lucenePath); boolean flag=true; if (f.exists()) { flag=false; } String oldFileUrl=vo.getFileUrl(); Term term=new Term("fileUrl", oldFileUrl); Document doc =getLuceneDocByTerm(term, lucenePath); if(doc==null){ doc=new Document(); Field typeNameField = new Field("typeName", vo.getTypeName()+"-"+vo.getTypeClassifyName(), Store.YES, Index.ANALYZED); Field urlField = new Field("fileUrl", vo.getFileUrl(), Store.YES, Index.ANALYZED); Field keywordsField = new Field("keywords", vo.getKeywords(), Store.YES, Index.ANALYZED); Field summaryContentField = new Field("summaryContent", vo.getSummaryContent(), Store.YES, Index.ANALYZED); Field nameField=new Field("name",vo.getName(),Store.YES,Index.ANALYZED); Field authorField=new Field("author", vo.getAuthor(),Store.YES,Index.ANALYZED); doc.add(typeNameField); doc.add(urlField); doc.add(keywordsField); doc.add(summaryContentField); // doc.add(nameField); doc.add(authorField); }else{ //修改filed的值 //doc.getField("fileName").setValue(vo.getFileName()); doc.getField("fileUrl").setValue(vo.getFileUrl()); doc.getField("keywords").setValue(vo.getKeywords()); doc.getField("summaryContent").setValue(vo.getSummaryContent()); doc.getField("name").setValue(vo.getName()); doc.getField("author").setValue(vo.getAuthor()); } //如果是新增从0开始如果是修改从已有的数量开始 if(file!=null){ //先做删除的操作 if(deleteFiles!=null){ for (ResultFile resultFile : deleteFiles) { doc.removeField("content"+resultFile.getContentIndex()); } } //得到所有的结果文件 String hql="FROM ResultFile WHERE resultId="+vo.getId()+" and delFlag = '" + FLAG_0 + "' "; List list=newsoftDao.queryByHql(hql); int i=list==null?0:list.size(); int iden=0; for (File fileLoop : file) { String content = getContent(fileLoop); Field contentField = new Field("content"+i, content, Store.YES, Index.ANALYZED); doc.add(contentField); //声明一个文件 ResultFile rFile=new ResultFile(); rFile.setResultId(vo.getId()); //得到当前的时间作为文件名称 rFile.setCreatedById(vo.getCreatedById()); rFile.setFileUrl(fileLoop.getName()); rFile.setDelFlag(FLAG_0); rFile.setFileName(fileNames[iden]); rFile.setCreatedDate(new Date()); rFile.setContentIndex(i); newsoftDao.addOrUpdateObject(rFile); iden++; i++; } } //修改索引 Analyzer an = new IK_CAnalyzer(); Directory dir=new SimpleFSDirectory(new File(lucenePath)); IndexWriter writer=new IndexWriter(dir,an,flag,IndexWriter.MaxFieldLength.UNLIMITED); writer.updateDocument(term,doc); writer.commit(); writer.optimize();// 优化索引    writer.close();// 索引创建完需要关闭 ///////////以前做的其中的一个方法 好像是维护lucene索引库的。修改和增加的方法没有搜索。
这么一堆,我是着实没看懂啊,能不能详细说说啊,或者给点成形的例子,非常感谢
wkwkwkwkwkwk 2013-07-17
  • 打赏
  • 举报
回复
String lucenePath = req.getSession().getServletContext()
.getRealPath("/WEB-INF/resultsFile/luceneFile");
File f = new File(lucenePath);
boolean flag=true;

if (f.exists()) {
flag=false;
}

String oldFileUrl=vo.getFileUrl();
Term term=new Term("fileUrl", oldFileUrl);

Document doc =getLuceneDocByTerm(term, lucenePath);
if(doc==null){
doc=new Document();
Field typeNameField = new Field("typeName", vo.getTypeName()+"-"+vo.getTypeClassifyName(),
Store.YES, Index.ANALYZED);
Field urlField = new Field("fileUrl", vo.getFileUrl(), Store.YES,
Index.ANALYZED);
Field keywordsField = new Field("keywords", vo.getKeywords(),
Store.YES, Index.ANALYZED);
Field summaryContentField = new Field("summaryContent",
vo.getSummaryContent(), Store.YES, Index.ANALYZED);
Field nameField=new Field("name",vo.getName(),Store.YES,Index.ANALYZED);
Field authorField=new Field("author", vo.getAuthor(),Store.YES,Index.ANALYZED);
doc.add(typeNameField);
doc.add(urlField);
doc.add(keywordsField);
doc.add(summaryContentField);
// doc.add(nameField);
doc.add(authorField);

}else{
//修改filed的值
//doc.getField("fileName").setValue(vo.getFileName());
doc.getField("fileUrl").setValue(vo.getFileUrl());
doc.getField("keywords").setValue(vo.getKeywords());
doc.getField("summaryContent").setValue(vo.getSummaryContent());
doc.getField("name").setValue(vo.getName());
doc.getField("author").setValue(vo.getAuthor());
}
//如果是新增从0开始如果是修改从已有的数量开始
if(file!=null){
//先做删除的操作
if(deleteFiles!=null){
for (ResultFile resultFile : deleteFiles) {
doc.removeField("content"+resultFile.getContentIndex());
}
}
//得到所有的结果文件
String hql="FROM ResultFile WHERE resultId="+vo.getId()+" and delFlag = '" + FLAG_0 + "' ";
List list=newsoftDao.queryByHql(hql);

int i=list==null?0:list.size();
int iden=0;
for (File fileLoop : file) {
String content = getContent(fileLoop);
Field contentField = new Field("content"+i, content, Store.YES,
Index.ANALYZED);
doc.add(contentField);
//声明一个文件
ResultFile rFile=new ResultFile();
rFile.setResultId(vo.getId());
//得到当前的时间作为文件名称
rFile.setCreatedById(vo.getCreatedById());
rFile.setFileUrl(fileLoop.getName());
rFile.setDelFlag(FLAG_0);
rFile.setFileName(fileNames[iden]);
rFile.setCreatedDate(new Date());
rFile.setContentIndex(i);
newsoftDao.addOrUpdateObject(rFile);
iden++;
i++;
}
}
//修改索引
Analyzer an = new IK_CAnalyzer();
Directory dir=new SimpleFSDirectory(new File(lucenePath));
IndexWriter writer=new IndexWriter(dir,an,flag,IndexWriter.MaxFieldLength.UNLIMITED);


writer.updateDocument(term,doc);
writer.commit();
writer.optimize();// 优化索引   
writer.close();// 索引创建完需要关闭




///////////以前做的其中的一个方法 好像是维护lucene索引库的。修改和增加的方法没有搜索。
爱T 2013-07-16
  • 打赏
  • 举报
回复
自己在网上找了这些知识点,但有没有更好更细化的方法或者例子之类的,不胜感激

1.我们现在的项目就是一个针对资源的搜索引擎。
一般来说,搜索引擎要有爬虫、索引库、管理、检索,如果是针对资源的还需要有解析器等模块组成。

资源爬取部分是java+Shell脚本,解析部分用的tika,索引和全文检索是基于solr开发的。

基本都是基于Apache开源搭建的。

2.Lucene是一个全文搜索引擎的工具包,单纯用Lucene可以实现全文检索、分词等等这些细节的功能,但是无法成为一个搜索引擎。

Solr底层是基于Lucene实现的一个开源制品,封装了许多例如高亮、文本分析等功能,比单纯用Lucene省去了很多很多繁琐工作。

3. 对于中文搜索来说,需要分词和建立倒排索引。

4. 给你个思路,把字段内容用查询语句连起来,然后在查询条件里用模糊查询,至于要达到搜索引擎的效率,那就要看你的数据量来说了,太多的话考虑用多台数据中心服务器,用云架构综合处理。
模糊查询可参考这里 http://bbs.csdn.net/topics/30436639

5. 可以这样:

1 程序启动时先做一个数据库预处理,将每个关键字段的唯一值各存在一张临时表中。

2 用户输出字符串时,先切分,到临时表中预查。如果没有,此时便有结论了。

3 根据预查的结果(因为已知关键字对应的字段),构造 SQL 再来查询。


(1)就是建立倒排索引的山寨做法。
(2)就是中文分词。

6. larbin爬虫抓取
Lucene倒排索引原理 

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧