0 0

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个答案 按时间排序 按投票排序

0 0

其实这个问题真的没有那么复杂,我们直接上源代码

  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搜索引擎开发权威经典(附盘源码)【于天恩】.zip

    《Lucene搜索引擎开发权威经典》是由于天恩编著的一本深入探讨Lucene搜索引擎开发的专业书籍,这本书结合源码分析,旨在帮助读者掌握Lucene的核心技术和应用实践。Lucene是Apache软件基金会的一个开放源代码项目,它...

    lucene 搜索引擎 compass

    《Lucene搜索引擎与Compass框架详解》 在信息化飞速发展的今天,搜索引擎已经成为了我们获取信息的重要工具。Apache Lucene是一个高性能、全文本检索库,它提供了基础的索引和搜索功能,使得开发者能够轻松地在应用...

    LUCENE搜索引擎基本工作原理

    **LUCENE搜索引擎基本工作原理** Lucene是一个开源的全文搜索引擎库,被广泛应用于构建复杂的搜索引擎系统。它的设计目标是高效、灵活且可扩展。理解Lucene的工作原理有助于开发人员更好地利用这一强大的工具。 **...

    Lucene搜索引擎开发权威经典随书资源1-6章

    本书基于Lucene的当前最新版本(2.1)精解了Lucene搜索引擎的相关知识,从基础知识到应用开发,精炼简洁,恰到好处。  本书包含了必要的理论,但以实践为主。所讲的理论都不是纸上谈兵,都是可以立即付诸实践进行...

    lucene搜索引擎项目

    《深入理解Lucene搜索引擎项目》 Lucene是一个高性能、全文本搜索库,它为开发者提供了在Java应用程序中实现全文检索的工具集。这个名为“lucene搜索引擎项目”的资源,旨在帮助用户更好地理解和应用Lucene来构建...

    基于Lucene的搜索引擎的研究与应用

    文章主要研究和应用了基于Lucene的搜索引擎,其特点是利用开源网络爬虫工具抓取互联网信息,并通过Lucene的API对特定信息进行索引和搜索。下面详细介绍相关知识点。 1. Lucene基础 Lucene是由Apache软件基金会提供...

    [Lucene搜索引擎开发权威经典].zip

    《Lucene搜索引擎开发权威经典》是一本深入探讨Apache Lucene的专著,作者于天恩在书中详尽地阐述了Lucene的核心概念、工作原理以及实际应用。这本书旨在帮助读者理解如何利用Lucene构建高性能、可扩展的全文搜索...

    Lucene搜索引擎 JSP + JAVA

    **Lucene搜索引擎 JSP + JAVA** Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发,它提供了索引和搜索大量文本数据的能力。在这个项目中,Lucene被结合了JSP(JavaServer Pages)和JAVA技术,创建了一个...

    lucene搜索引擎demo

    **Lucene搜索引擎Demo详解** Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发,是Java编程语言中广泛使用的搜索引擎框架。它提供了强大的索引和搜索功能,使得开发者能够轻松地在应用中集成高级的文本...

    基于lucene搜索引擎的java源码

    **基于Lucene搜索引擎的Java源码详解** Lucene是一个高性能、全文检索库,它由Apache软件基金会开发并维护。此Java源码包提供了一个全面的示例,展示了如何利用Lucene进行索引创建、更新(增量索引)以及搜索操作。...

    [Lucene搜索引擎开发权威经典].于天恩著.扫描版.7z.002

    [Lucene搜索引擎开发权威经典].于天恩著.扫描版.7z.001[Lucene搜索引擎开发权威经典].于天恩著.扫描版.7z.001

    解密搜索引擎技术实战 LUCENE & JAVA(第3版)PDF

    《解密搜索引擎技术实战 LUCENE & JAVA(第3版)》是一本深入探讨搜索引擎技术的专业书籍,由罗刚撰写。这本书主要聚焦于LUCENE和JAVA这两种技术在搜索引擎开发中的应用,为读者揭示了搜索引擎背后的复杂机制和实现...

    一个基于LUCENE搜索引擎项目例子

    **基于LUCENE的搜索引擎项目详解** Apache Lucene是一个高性能、全文本搜索库,它为开发者提供了构建全文搜索引擎所需要的基础工具。在这个项目例子中,我们将深入探讨如何利用Lucene进行索引构建、查询处理以及...

    开发自己的搜索引擎 lucene + heritrix

    垂直搜索引擎专注于特定领域的内容,例如电商、新闻、学术论文等,它比通用搜索引擎更能深入地提供与特定主题相关的搜索结果。开发一个垂直搜索引擎的过程包括以下步骤: 1. 确定垂直搜索的领域和需求,包括确定...

    Lucene搜索引擎开发权威经典

    《Lucene搜索引擎开发权威经典》是一本由作者于天恩撰写的关于Lucene搜索引擎开发的书籍。这本书以幽默轻松的写作风格,深入浅出地介绍了Lucene的基础知识和实践应用,虽然在深度上可能稍显不足,但其详尽的代码注释...

    基于Lucene的搜索引擎

    **基于Lucene的搜索引擎** Lucene是一个开源的全文检索库,由Apache软件基金会开发并维护。它是Java语言实现的,可以被集成到各种应用程序中,为开发者提供了强大的文本搜索功能。在本项目中,我们看到的是一个专门...

    Lucene搜索引擎1

    在"Lucene搜索引擎1"这个主题中,我们将深入探讨Lucene的基本概念、核心组件以及如何使用它来构建一个简单的搜索引擎。 首先,Lucene的核心功能是索引和搜索。它能够将非结构化的文本数据(如网页、文档等)转化...

    Lucene搜索引擎开发

    **Lucene搜索引擎开发** 在Java世界中,Lucene是一个强大的全文搜索引擎库,它为开发者提供了在应用程序中构建高效、可扩展的搜索功能的能力。Lucene是Apache软件基金会的项目之一,其核心功能包括文本分析、索引...

    Solr Elasticsearch lucene 搜索引擎

    Solr、Elasticsearch和Lucene是三个在搜索引擎领域中至关重要的技术,它们共同构建了现代数据检索的基础架构。下面将分别对这三个组件进行详细解释,并探讨它们之间的关系。 **Lucene** Lucene是一个高性能、全文本...

Global site tag (gtag.js) - Google Analytics