- 浏览: 2046180 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (795)
- java (263)
- 聚类搜索引擎 (9)
- 经验之谈 (67)
- DSP (3)
- C++ (140)
- Linux (37)
- SNMP (6)
- Python (6)
- 数据库 (61)
- 网络 (20)
- 算法 (15)
- 设计模式 (4)
- 笔试题 (38)
- 散文 (35)
- 数据结构 (9)
- 银行知识 (0)
- 榜样 (9)
- Lucene (15)
- Heritrix (6)
- MetaSeeker (0)
- netbeans (12)
- php (3)
- 英语 (8)
- DB2 (0)
- java基础 (5)
- mongodb & hadoop (4)
- Javascript (7)
- Spring (4)
- ibatis & myibatis (1)
- velocity (1)
- 微服务 (0)
- paddle (1)
- 第三方 (0)
- 知识沉淀 (1)
- 建模 (0)
最新评论
-
0372:
标示对java很陌生!
中文乱码解决的4种方式 -
梦留心痕:
Java中\是转意字符, 可是你的这句话我没看懂,只要把得到的 ...
java中如何忽略字符串中的转义字符--转载 -
yanjianpengit:
[b][/b]
java为什么非静态内部类里面不能有静态成员 -
springdata-jpa:
可以参考最新的文档:如何在eclipse jee中检出项目并转 ...
eclipse 如何把java项目转成web项目 -
qq1130127172:
,非常好。
(转)SpringMVC 基于注解的Controller @RequestMapping @RequestParam..
输入“related:doc_id”返回索引库中的相关文档
public static void main(String[] args) throws IOException {
FSDirectory directory = FSDirectory.open(new File("D:\\DATAMANAGER\\INDEX\\SYS_3000"));
IndexReader r = IndexReader.open(directory);
MoreLikeThis mlt = new MoreLikeThis(r);
mlt.setFieldNames(new String[]{"docName","content"});
mlt.setMaxQueryTerms(5);
String queryString = "related:18";
if(queryString.startsWith("related:")){
//docId对应lucene内部的Doc.id字段,一般我们先通过检索一次获取到Lucene内部的docNum然后再根据这个docNum调用MoreLikeThis提供的接口(看了一下solr的MoreLikeThis组件的实现代码,其也是采用这种思想。不过它支持query查询多个docNum,然后再把每个docNum通过like方法去检索出的结果合在一起)
int docId = Integer.parseInt(queryString.substring(8));
System.out.println(docId+":"+r.isDeleted(docId));
if(!r.isDeleted(docId)){
Query query = mlt.like(docId);
System.out.println("query:"+query.toString());
IndexSearcher searcher = new IndexSearcher(r);
TopDocs topDocs = searcher.search(query, 10);
ScoreDoc[] sd = topDocs.scoreDocs;
for(int i=0;i<sd.length;i++){
Document d = searcher.doc(sd[i].doc);
System.out.println(d.getField("docId").stringValue()+"="+d.get("docName"));
}
}
}
}
1、为何找不到MoreLikeTihs的jar包?
使用org.apache.lucene.search.similar包的MoreLikeThis类。在Lucene 1.9它属于外部包"similarity",从Lucene 2.1起,它属于新的外部包"queries"。
在contrib\queries目录下的lucene-queries-3.0.2.jar
2、like(int docNum)帮你做了什么?
like(int docNum)它首先根据传入的docNum找出该doc里的高频terms,然后用这些高频terms生成Queue,最后把Queue传进search方法得到最后结果。它的主要思想就是认为这些高频terms足以表示doc信息,然后通过搜索得到最后与此doc类似的结果。
下面为网上转载的一篇文章,引自:http://hi.baidu.com/savagert/blog/item/060d0d0974387c346b60fb1b.html
Leveraging term vectors
所谓term vector, 就是对于documents的某一field,如title,body这种文本类型的, 建立词频的多维向量空间.每一个词就是一维, 这维的值就是这个词在这个field中的频率.
如果你要使用term vectors, 就要在indexing的时候对该field打开term vectors的选项:
Field options for term vectors
TermVector.YES – record the unique terms that occurred, and their counts, in each document, but do not store any positions or offsets information.
TermVector.WITH_POSITIONS – record the unique terms and their counts, and also the positions of each occurrence of every term, but no offsets.
TermVector.WITH_OFFSETS – record the unique terms and their counts, with the offsets (start & end character position) of each occurrence of every term, but no positions.
TermVector.WITH_POSITIONS_OFFSETS – store unique terms and their counts, along with positions and offsets.
TermVector.NO – do not store any term vector information.
If Index.NO is specified for a field, then you must also specify TermVector.NO.
这样在index完后, 给定这个document id和field名称, 我们就可以从IndexReader读出这个term vector(前提是你在indexing时创建了terms vector):
TermFreqVector termFreqVector = reader.getTermFreqVector(id, "subject");
你可以遍历这个TermFreqVector去取出每个词和词频, 如果你在index时选择存下offsets和positions信息的话, 你在这边也可以取到.
有了这个term vector我们可以做一些有趣的应用:
1) Books like this
比较两本书是否相似,把书抽象成一个document文件, 具有author, subject fields. 那么现在就通过这两个field来比较两本书的相似度.
author这个field是multiple fields, 就是说可以有多个author, 那么第一步就是比author是否相同,
String[] authors = doc.getValues("author");
BooleanQuery authorQuery = new BooleanQuery(); // #3
for (int i = 0; i < authors.length; i++) { // #3
String author = authors[i]; // #3
authorQuery.add(new TermQuery(new Term("author", author)), BooleanClause.Occur.SHOULD); // #3
}
authorQuery.setBoost(2.0f);
最后还可以把这个查询的boost值设高, 表示这个条件很重要, 权重较高, 如果作者相同, 那么就很相似了.
第二步就用到term vector了, 这里用的很简单, 单纯的看subject field的term vector中的term是否相同,
TermFreqVector vector = // #4
reader.getTermFreqVector(id, "subject"); // #4
BooleanQuery subjectQuery = new BooleanQuery(); // #4
for (int j = 0; j < vector.size(); j++) { // #4
TermQuery tq = new TermQuery(new Term("subject", vector.getTerms()[j]));
subjectQuery.add(tq, BooleanClause.Occur.SHOULD); // #4
}
2) What category?
这个比上个例子高级一点, 怎么分类了,还是对于document的subject, 我们有了term vector.
所以对于两个document, 我们可以比较这两个文章的term vector在向量空间中的夹角, 夹角越小说明这个两个document越相似.
那么既然是分类就有个训练的过程, 我们必须建立每个类的term vector作为个标准, 来给其它document比较.
这里用map来实现这个term vector, (term, frequency), 用n个这样的map来表示n维. 我们就要为每个category来生成一个term vector, category和term vector也可以用一个map来连接.创建这个category的term vector, 这样做:
遍历这个类中的每个document, 取document的term vector, 把它加到category的term vector上.
private void addTermFreqToMap(Map vectorMap, TermFreqVector termFreqVector) {
String[] terms = termFreqVector.getTerms();
int[] freqs = termFreqVector.getTermFrequencies();
for (int i = 0; i < terms.length; i++) {
String term = terms[i];
if (vectorMap.containsKey(term)) {
Integer value = (Integer) vectorMap.get(term);
vectorMap.put(term, new Integer(value.intValue() + freqs[i]));
} else {
vectorMap.put(term, new Integer(freqs[i]));
}
}
}
首先从document的term vector中取出term和frequency的list, 然后从category的term vector中取每一个term, 把document的term frequency加上去.OK了
有了这个每个类的category, 我们就要开始计算document和这个类的向量夹角了
cos = A*B/|A||B|
A*B就是点积, 就是两个向量每一维相乘, 然后全加起来.
这里为了简便计算, 假设document中term frequency只有两种情况, 0或1.就表示出现或不出现
private double computeAngle(String[] words, String category) {
// assume words are unique and only occur once
Map vectorMap = (Map) categoryMap.get(category);
int dotProduct = 0;
int sumOfSquares = 0;
for (int i = 0; i < words.length; i++) {
String word = words[i];
int categoryWordFreq = 0;
if (vectorMap.containsKey(word)) {
categoryWordFreq = ((Integer) vectorMap.get(word)).intValue();
}
dotProduct += categoryWordFreq; // optimized because we assume frequency in words is 1
sumOfSquares += categoryWordFreq * categoryWordFreq;
}
double denominator;
if (sumOfSquares == words.length) {
// avoid precision issues for special case
denominator = sumOfSquares; // sqrt x * sqrt x = x
} else {
denominator = Math.sqrt(sumOfSquares) *
Math.sqrt(words.length);
}
double ratio = dotProduct / denominator;
return Math.acos(ratio);
}
这个函数就是实现了上面那个公式还是比较简单的.
3) MoreLikeThis
对于找到比较相似的文档,lucene还提供了个比较高效的接口,MoreLikeThis接口
http://lucene.apache.org/java/1_9_1/api/org/apache/lucene/search/similar/MoreLikeThis.html
对于上面的方法我们可以比较每两篇文档的余弦值,然后对余弦值进行排序,找出最相似的文档,但这个方法的最大问题在于计算量太大,当文档数目很大时,几乎是无法接受的,当然有专门的方法去优化余弦法,可以使计算量大大减少,但这个方法精确,但门槛较高。
这个接口的原理很简单,对于一篇文档中,我们只需要提取出interestingTerm(即tf×idf高的词),然后用lucene去搜索包含相同词的文档,作为相似文档,这个方法的优点就是高效,但缺点就是不准确,这个接口提供很多参数,你可以配置来选择interestingTerm。
MoreLikeThis mlt = new MoreLikeThis(ir);
Reader target = ...
// orig source of doc you want to find similarities to
Query query = mlt.like( target);
Hits hits = is.search(query);
用法很简单,这样就可以得到,相似的文档
这个接口比较灵活,你可以不直接用like接口,而是用
retrieveInterestingTerms(Reader r)
这样你可以获得interestingTerm,然后怎么处理就根据你自己的需要了
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/foamflower/archive/2010/12/01/6048667.aspx
发表评论
-
利用solrj操作solr的API
2015-03-11 11:00 33028使用SolrJ操作Solr会比利用httpClient来操 ... -
Solr高效利用:Solr实现SQL的查询与统计
2015-03-11 10:51 5849Cloudera公司已经推出了基于Hadoop平台的查 ... -
(转)Lucene+SSH
2014-07-01 08:26 1032这篇博客写的不错,支持一下,顶。 http://shuai ... -
打分公式
2011-05-21 16:20 1445文档的分值代表了该文 ... -
queryparser的问题
2011-05-08 17:46 2106很多人在使用lucene时会使用其提供的querypars ... -
lucene基本
2011-04-07 11:03 1779Lucene索引中有几个最基 ... -
获取一个索引文件频率最高的Term
2011-04-07 11:00 2035前段时间同事也开始对搜索感兴趣,他看到luk ... -
TermEnum
2011-04-07 10:53 2176使用Lucene的API遍历Lucene ... -
lucene的分组查询
2011-04-07 10:51 1735通过lucene搜索去除相同结果。 在网上找了很久到没有答案 ... -
Lucene中的自定义排序功能
2011-04-07 10:47 1542Lucene中的自定义排序功能和Java集合中的自定义排序的实 ... -
lucene中的词频
2011-04-07 10:46 8413lucene in action作为action系列,确实坚持 ... -
lucene介绍
2011-04-07 10:28 17712009 年 9 月 14 日 本文将探讨 Apache ... -
lucene索引文档
2011-03-02 13:17 1911用Lucene索引文档 接下来我将一步一步的来演示如何利用 ... -
hadoop
2010-12-31 17:24 1990Hadoop的概要介绍 Hadoop,是一个分布式系统基础架 ...
相关推荐
Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放...Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。
从HDFS导入Wikipedia XML转储到Lucene索引或Elasticsearch,并基于Lucene的MoreLikeThis查询检索类似的Wikipedia文章。 此应用程序是基于文本的文档相似性度量的实现,该度量被用作的研究中的基准度量。 将...
本文阐述了基于XML 的数据检索技术, 并介绍了DOM 对XML 文档的操作。最后通 过例子实现用Javascript 的DOM 对XML 文档节点进行检索, 检索结果用XML 数据岛在HTML 页面 中显示。
用Javascript实现XML文档数据检索.pdf 本资源主要介绍了使用Javascript实现XML文档数据检索的技术,包括基于XML的数据检索技术、DOM对XML文档的操作、使用Javascript的DOM实现对基于XML的数据检索等。 一、基于XML...
以下是对"文档内容搜索 可以实现对其内容的判断以及关键词的检索"这一主题的详细解释: 首先,我们要理解文档内容搜索的基本原理。这通常涉及到自然语言处理(NLP)和信息检索(IR)技术。NLP是让计算机理解和生成...
使用PageOffice开发平台,实现对word文档的在线处理,并搜索、显示含有关键字的文档。 要获取文档的纯文本,以往的方法都比较复杂,而且效率也不高,但是利用PageOffice的FileSaver 对象的DocumentText属性却能...
在Java开发中,Lucene被广泛用于实现文件的全文检索功能,包括对doc、docx、pdf、txt等常见格式文档的文本内容检索。在本文中,我们将探讨如何使用Lucene对这些文件类型进行全文检索的实现。 首先,为了实现全文...
总结来说,利用Lucene实现文档关键字检索,主要涉及以下几个步骤:1) 文档预处理;2) 创建索引;3) 构建查询;4) 执行查询并获取结果;5) 高亮显示检索内容。这个过程涉及到Lucene的核心组件,包括Analyzer、...
通过集成到现有的Hibernate ORM环境中,可以轻松实现文档的管理,包括创建、更新、删除以及全文检索功能。结合Apache Lucene的强大搜索功能,Hibernate Search使得在数据库中进行复杂的文本搜索变得简单易行。在实际...
### 中文文档相似性检测关键技术解析 #### 一、引言 随着互联网技术的迅猛发展,数字内容的创作与分享变得越来越便捷。然而,这也带来了文档侵权问题的日益严峻,尤其是非授权文档分发和非法拷贝等行为,严重侵犯...
本文档将深入探讨网络检索系统的开发、管理和演示过程,旨在提供全面的技术指导和实践案例。 首先,我们要了解网络检索系统的核心组件和工作原理。系统通常包括以下几个部分:前端用户界面,后端检索引擎,索引构建...
**Python gensim库详解:主题建模、文档索引与相似性检索** gensim是一个强大的Python库,专门设计用于主题建模、文档索引和相似性检索,它在自然语言处理(NLP)和信息检索(IR)领域广泛应用。这个库提供了一套...
图像检索是指通过输入一张图片,系统自动找出与之相似或匹配的图片,这对于搜索引擎、社交媒体、安防监控等多种场景具有重大价值。本项目“CNN实现的图像检索”旨在探讨如何利用CNN的特性来构建一个高效的图像搜索...
基于Java的文档在线检索预览系统,支持office,txt,pdf等文件的主流办公文件的全文检索,以及在线展示,一处维护处处查看。应对的是某些企业文档较多,查找文档困难以及文档共享内容延迟的情况,解决个人文档版本内容...
使用hibernate search实现全文检索和文档管理功能: 1 全文检索 2 手动生成索引 3 文档上传(自动建立索引) 4 文档更新(自动建立索引) 5 文档删除 使用说明: 1 需要先恢复数据库 searchDB_2008sqlserver.bak 2 ...
本次实验旨在通过Java语言使用Lucene库来实现对文档集合的索引和搜索功能。实验的核心是理解文本信息检索的基本原理,包括向量空间模型、倒排索引的构建以及相关度计算。通过实际操作,学生将能够掌握文本处理、索引...
基于Hadoop的文档检索系统的设计与实现+部署文档+全部资料 高分项目.zip基于Hadoop的文档检索系统的设计与实现+部署文档+全部资料 高分项目.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩...
(3)本软件检测结果存在误差, 用更小的文档块进行检测,可以减少误差,但需要的时间会相应增加,块数大小定为200-400字较为合适,此时误差率也是可以接受的,文档相似率一般是比实际的要低。 (4)如果某个相似块...
"ruance.rar"可能包含的是一种文件配置与检索系统的测试文档,这表明该系统旨在优化文档管理,实现快速而准确的搜索功能。 接下来,我们关注“测试文档”。在软件开发过程中,测试文档是确保产品质量的重要组成部分...