-
Lucene(搜索引擎) 去掉重复主题引发的问题???10
主题:spring 是怎么?
有二个人回答:
回答一:spring 是一个整合了多功能框架,
回答二:spring 里面包含了MVC
我现在开始搜索:
我搜一:spring
会出现主题:spring 是怎么?(只能出现一个,要去重)
我搜二:框架
会出现主题:spring 是怎么?
我搜三,MVC
会出现主题:spring 是怎么?使用:DuplicateFilter出现的问题:
DuplicateFilter filter = new DuplicateFilter(uniqueField);
query = new FilteredQuery(query, filter);
------以上是先去掉重复再进行搜索,跟踪源码会发现,在过滤时,进行合并,要么取第一个要么取第后一个
如上面例子,进行合并后,只取回答一或者回答二,把另外一条给忽略掉,(假设取第一条)
这样一来我用第二条中的内容搜索时,"MVC"找不到关联的主题,,有对去重内容有研究过的,,希望给个解决方案
问题补充beneo的回答: public static void main(String[] args) { //Lucene Document的域名; //实例化IKAnalyzer分词器 Analyzer analyzer = new IKAnalyzer(); Directory directory = null; IndexWriter iwriter = null; IndexSearcher isearcher = null; try { //建立内存索引对象 directory = new RAMDirectory(); iwriter = new IndexWriter(directory, analyzer, true, IndexWriter.MaxFieldLength.LIMITED); Document doc = new Document(); doc.add(new Field("topicId", "1", Field.Store.YES, Field.Index.NOT_ANALYZED)); doc.add(new Field("answerId", "1", Field.Store.YES, Field.Index.NOT_ANALYZED)); doc.add(new Field("content", "spring 是怎么? spring 是一个整合了多功能框架", Field.Store.YES, Field.Index.ANALYZED)); iwriter.addDocument(doc); Document doc2 = new Document(); doc2.add(new Field("topicId", "1", Field.Store.YES, Field.Index.NOT_ANALYZED)); doc2.add(new Field("answerId", "2", Field.Store.YES, Field.Index.NOT_ANALYZED)); doc2.add(new Field("content", "spring 是怎么? spring 里面包含了模型-视图-控制", Field.Store.YES, Field.Index.ANALYZED)); iwriter.addDocument(doc2); iwriter.close(); //实例化搜索器 isearcher = new IndexSearcher(directory); BooleanQuery bq = new BooleanQuery(); TermQuery tq = new TermQuery(new Term("content", "框架")); bq.add(tq, BooleanClause.Occur.MUST); DuplicateFilter df = new DuplicateFilter("topicId"); df.setKeepMode(DuplicateFilter.PM_FAST_INVALIDATION); //搜索相似度最高的5条记录 TopDocs topDocs = isearcher.search(bq,df,5); System.out.println("命中:" + topDocs.totalHits); System.out.println("分数:" + topDocs.getMaxScore()); //输出结果 ScoreDoc[] scoreDocs = topDocs.scoreDocs; for (int i = 0; i < topDocs.totalHits; i++) { Document targetDoc = isearcher.doc(scoreDocs[i].doc); System.out.println("内容:" + targetDoc.toString()); } } catch (CorruptIndexException e) { e.printStackTrace(); } catch (LockObtainFailedException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (isearcher != null) { try { isearcher.close(); } catch (IOException e) { e.printStackTrace(); } } if (directory != null) { try { directory.close(); } catch (IOException e) { e.printStackTrace(); } } } }
不过这正引申出我的问题:
查"模型"可以查出来内容 ,,查"功能"就查不出来内容......这是因为DuplicateFilter只是取了最后一条,,把第一条的忽略掉的原故...
2011年1月05日 10:46
1个答案 按时间排序 按投票排序
-
其实这个问题真的没有那么复杂,我们直接上源代码
public DocIdSet getDocIdSet(IndexReader reader) throws IOException { if(processingMode==PM_FAST_INVALIDATION) { return fastBits(reader); } else { return correctBits(reader); } }
你最后获得的Doc id set,结果文档必须出自此文档集合,你要确认这点
可以看到过滤模式有2种PM_FAST_INVALIDATION以及PM_FULL_INVALIDATION
我们就看fastBits好了private OpenBitSet fastBits(IndexReader reader) throws IOException { OpenBitSet bits=new OpenBitSet(reader.maxDoc()); bits.set(0,reader.maxDoc()); //assume all are valid Term startTerm=new Term(fieldName); // 这个filedName就是你需要过滤的field TermEnum te = reader.terms(startTerm); // Returns an enumeration of all terms starting at a given term,显然 null 的情况不再目前的讨论范围 if(te!=null) { Term currTerm=te.term(); // 如果属于这个指定的field,取出所有这个field的文档 while((currTerm!=null)&&(currTerm.field()==startTerm.field())) //term fieldnames are interned { // 如果docFreq > 1,你给的例子是2个doc if(te.docFreq()>1) { int lastDoc=-1; //unset potential duplicates TermDocs td = reader.termDocs(currTerm); td.next(); if(keepMode==KM_USE_FIRST_OCCURRENCE) { //保留第一个 td.next(); } do { // 后面的都抹去 lastDoc=td.doc(); bits.clear(lastDoc); }while(td.next()); if(keepMode==KM_USE_LAST_OCCURRENCE) { //恢复最后一个 bits.set(lastDoc); } } if(!te.next()) { break; } currTerm=te.term(); } } return bits; }
如果你搜索的内容在doc1的话,最后返回的是doc1;如果你是搜索的内容在doc2的话,最后返回的还是doc1。
最后query再对doc1进行查询,结果就是你最后看到的结果。
2011年1月05日 10:46
相关推荐
《Lucene搜索引擎开发权威经典》是由于天恩编著的一本深入探讨Lucene搜索引擎开发的专业书籍,这本书结合源码分析,旨在帮助读者掌握Lucene的核心技术和应用实践。Lucene是Apache软件基金会的一个开放源代码项目,它...
《Lucene搜索引擎与Compass框架详解》 在信息化飞速发展的今天,搜索引擎已经成为了我们获取信息的重要工具。Apache Lucene是一个高性能、全文本检索库,它提供了基础的索引和搜索功能,使得开发者能够轻松地在应用...
**LUCENE搜索引擎基本工作原理** Lucene是一个开源的全文搜索引擎库,被广泛应用于构建复杂的搜索引擎系统。它的设计目标是高效、灵活且可扩展。理解Lucene的工作原理有助于开发人员更好地利用这一强大的工具。 **...
本书基于Lucene的当前最新版本(2.1)精解了Lucene搜索引擎的相关知识,从基础知识到应用开发,精炼简洁,恰到好处。 本书包含了必要的理论,但以实践为主。所讲的理论都不是纸上谈兵,都是可以立即付诸实践进行...
《深入理解Lucene搜索引擎项目》 Lucene是一个高性能、全文本搜索库,它为开发者提供了在Java应用程序中实现全文检索的工具集。这个名为“lucene搜索引擎项目”的资源,旨在帮助用户更好地理解和应用Lucene来构建...
文章主要研究和应用了基于Lucene的搜索引擎,其特点是利用开源网络爬虫工具抓取互联网信息,并通过Lucene的API对特定信息进行索引和搜索。下面详细介绍相关知识点。 1. Lucene基础 Lucene是由Apache软件基金会提供...
《Lucene搜索引擎开发权威经典》是一本深入探讨Apache Lucene的专著,作者于天恩在书中详尽地阐述了Lucene的核心概念、工作原理以及实际应用。这本书旨在帮助读者理解如何利用Lucene构建高性能、可扩展的全文搜索...
**Lucene搜索引擎 JSP + JAVA** Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发,它提供了索引和搜索大量文本数据的能力。在这个项目中,Lucene被结合了JSP(JavaServer Pages)和JAVA技术,创建了一个...
**Lucene搜索引擎Demo详解** Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发,是Java编程语言中广泛使用的搜索引擎框架。它提供了强大的索引和搜索功能,使得开发者能够轻松地在应用中集成高级的文本...
**基于Lucene搜索引擎的Java源码详解** Lucene是一个高性能、全文检索库,它由Apache软件基金会开发并维护。此Java源码包提供了一个全面的示例,展示了如何利用Lucene进行索引创建、更新(增量索引)以及搜索操作。...
[Lucene搜索引擎开发权威经典].于天恩著.扫描版.7z.001[Lucene搜索引擎开发权威经典].于天恩著.扫描版.7z.001
《解密搜索引擎技术实战 LUCENE & JAVA(第3版)》是一本深入探讨搜索引擎技术的专业书籍,由罗刚撰写。这本书主要聚焦于LUCENE和JAVA这两种技术在搜索引擎开发中的应用,为读者揭示了搜索引擎背后的复杂机制和实现...
**基于LUCENE的搜索引擎项目详解** Apache Lucene是一个高性能、全文本搜索库,它为开发者提供了构建全文搜索引擎所需要的基础工具。在这个项目例子中,我们将深入探讨如何利用Lucene进行索引构建、查询处理以及...
垂直搜索引擎专注于特定领域的内容,例如电商、新闻、学术论文等,它比通用搜索引擎更能深入地提供与特定主题相关的搜索结果。开发一个垂直搜索引擎的过程包括以下步骤: 1. 确定垂直搜索的领域和需求,包括确定...
《Lucene搜索引擎开发权威经典》是一本由作者于天恩撰写的关于Lucene搜索引擎开发的书籍。这本书以幽默轻松的写作风格,深入浅出地介绍了Lucene的基础知识和实践应用,虽然在深度上可能稍显不足,但其详尽的代码注释...
**基于Lucene的搜索引擎** Lucene是一个开源的全文检索库,由Apache软件基金会开发并维护。它是Java语言实现的,可以被集成到各种应用程序中,为开发者提供了强大的文本搜索功能。在本项目中,我们看到的是一个专门...
在"Lucene搜索引擎1"这个主题中,我们将深入探讨Lucene的基本概念、核心组件以及如何使用它来构建一个简单的搜索引擎。 首先,Lucene的核心功能是索引和搜索。它能够将非结构化的文本数据(如网页、文档等)转化...
**Lucene搜索引擎开发** 在Java世界中,Lucene是一个强大的全文搜索引擎库,它为开发者提供了在应用程序中构建高效、可扩展的搜索功能的能力。Lucene是Apache软件基金会的项目之一,其核心功能包括文本分析、索引...
Solr、Elasticsearch和Lucene是三个在搜索引擎领域中至关重要的技术,它们共同构建了现代数据检索的基础架构。下面将分别对这三个组件进行详细解释,并探讨它们之间的关系。 **Lucene** Lucene是一个高性能、全文本...