`
yangfuchao418
  • 浏览: 163261 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Lucene全功能

阅读更多
package com.diyi.util;
import java.io.File;
import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryParser.MultiFieldQueryParser;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.FuzzyQuery;
import org.apache.lucene.search.Hits;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.MultiSearcher;
import org.apache.lucene.search.PrefixQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.RangeQuery;
import org.apache.lucene.search.Sort;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.WildcardQuery;
import org.apache.lucene.search.highlight.Highlighter;
import org.apache.lucene.search.highlight.QueryScorer;
import org.apache.lucene.search.highlight.SimpleFragmenter;
import org.apache.lucene.search.highlight.SimpleHTMLFormatter;
import org.mira.lucene.analysis.IK_CAnalyzer;

import com.diyi.core.web.BaseAction;
public class LuceneTest extends BaseAction{
    
        private static final long serialVersionUID = 1L;
    /*
     * lucene全功能,几乎包含了大部分查询综合起来。,
     */
        static String path="e:\\Lucene测试\\";
        static String ArticleTitle="ArticleTitle";
        static String ArticleText="ArticleText";
        static String ArticleTime="ArticleTime";
        public static void index() throws Exception {
            /* 创建索引初始化,执行这些语句将创建或清空d:\\save\\目录下所有索引 */
            File file=new File(path);
            if(file.isDirectory())
            {
                file.delete();
            }
            IK_CAnalyzer ikAnalyzer=new IK_CAnalyzer();
            IndexWriter writer1 = new IndexWriter(path,ikAnalyzer, true);
             writer1.close();
//              IndexReader indexReader=IndexReader.open(path);
//              indexReader.deleteDocument(1);
            /*
             * 往创建的初始化索引中添加索引内容,StandardAnalyzer表示用lucene自带的标准分词机制,
             * false表示不覆盖原来该目录的索引,细心的读者可能已经发现, 这句话和上面的那句就这个false不一样
             */
            IndexWriter writer2 = new IndexWriter(path,
                    ikAnalyzer, false);
            /* 创建一份文件 */
            Document doc1 = new Document();
            /*
             * 创建一个域ArticleTitle,并往这个域里面添加内容 "Field.Store.YES"表示域里面的内容将被存储到索引
             * "Field.Index.TOKENIZED"表示域里面的内容将被索引,以便用来搜索
             *  Lucene给文档的字段设定三个布尔变量: 索引(indexed), 存储(stored), 切词(tokenized) ,
             */
            Field field1 = new Field(ArticleTitle, "上海2010年世博会,hot,GOOGLE和Yahoo 赞助,test,中华人民共和国万岁", Field.Store.YES,
                    Field.Index.TOKENIZED);
            /* 往文件里添加这个域 */
            doc1.add(field1);
            /* 同理:创建另外一个域ArticleText,并往这个域里面添加内容 */
            Field field2 = new Field(ArticleText, "这是一届创造绿色环境,点燃激情,影响深远的博览会....god..Hotmail,text,foam,OpenOffica",
                    Field.Store.YES, Field.Index.TOKENIZED);
            doc1.add(field2);
           
            Field field3 = new Field(ArticleTime, "2009",
                    Field.Store.YES, Field.Index.TOKENIZED);
            doc1.add(field3);
            // 在这里还可以添加其他域
            /* 添加这份文件到索引 */
            writer2.addDocument(doc1);

            /* 同理:创建第二份文件 */
            Document doc2 = new Document();
            field1 = new Field(ArticleTitle, "中国获得全球赞誉,世界人民大团结万岁,text", Field.Store.YES,
                    Field.Index.TOKENIZED);
            doc2.add(field1);
            field2 = new Field(ArticleText, "中国上海世博馆雄踞东方,傲视全球........,roams,OpenOffice",
                    Field.Store.YES, Field.Index.TOKENIZED);
            doc2.add(field2);
            field3 = new Field(ArticleTime, "2010",
                    Field.Store.YES, Field.Index.TOKENIZED);
            doc2.add(field3);
          /*
           *
           *
           */
            writer2.addDocument(doc2);

            // 在这里可以添加其他文件
            //writer2.optimize();
            /* 关闭 */
            writer2.close();
        }

        public  String  searchIndex() throws Exception {
             LuceneTest.index();
             String keywords=getRequest().getParameter("serchString");
            /* 创建一个搜索,搜索刚才创建的目录下的索引 */
            IndexSearcher indexSearcher = new IndexSearcher(path);
            /* 在这里我们只需要搜索一个目录 */
            IndexSearcher indexSearchers[] = { indexSearcher };
            /* 我们需要搜索两个域ArticleTitle, ArticleText里面的内容 */
            String[] fields = {ArticleTitle,
                    ArticleText ,ArticleTime};
            /* 下面这个表示要同时搜索这两个域,而且只要一个域里面有满足我们搜索的内容就行
            BooleanClause.Occur[]数组,它表示多个条件之间的关系,BooleanClause.Occur.MUST表示and,
            BooleanClause.Occur.MUST_NOT表示not,BooleanClause.Occur.SHOULD表示or.
            1、MUST和MUST表示“与”的关系,即“并集”。
            2、MUST和MUST_NOT前者包含后者不包含。
            3、MUST_NOT和MUST_NOT没意义
            4、SHOULD与MUST表示MUST,SHOULD失去意义;
            5、SHOUlD与MUST_NOT相当于MUST与MUST_NOT。
            6、SHOULD与SHOULD表示“或”的概念*/
            BooleanClause.Occur[] clauses = { BooleanClause.Occur.SHOULD,
                    BooleanClause.Occur.SHOULD,BooleanClause.Occur.SHOULD};
            /*
             * MultiFieldQueryParser表示多个域解析,
             * 同时可以解析含空格的字符串,如果我们搜索"上海 中国"
             */
            Analyzer analyzer=new  IK_CAnalyzer();
            Query multiFieldQuery = MultiFieldQueryParser.parse(keywords, fields, clauses,
                    analyzer);
            Query termQuery= new TermQuery(new Term(ArticleTitle, keywords));//词语搜索,完全匹配,搜索具体的域
           
            Query wildqQuery=new WildcardQuery(new Term(ArticleTitle,keywords));//通配符查询
           
            Query prefixQuery=new PrefixQuery(new Term(ArticleText,keywords));//字段前缀搜索
           
            Query fuzzyQuery=new FuzzyQuery(new Term(ArticleText,keywords));//相似度查询,模糊查询比如OpenOffica,OpenOffice
             
            Query rangQuery=new RangeQuery(new Term(ArticleTime,keywords), new Term(ArticleTime,keywords), true);//数字范围查询
            /* Multisearcher表示多目录搜索,在这里我们只有一个目录 */
            MultiSearcher searcher = new MultiSearcher(indexSearchers);
            //多条件搜索
            BooleanQuery multiQuery=new BooleanQuery();
           
            multiQuery.add(wildqQuery, BooleanClause.Occur.SHOULD);
            multiQuery.add(multiFieldQuery, BooleanClause.Occur.SHOULD);
            multiQuery.add(termQuery, BooleanClause.Occur.SHOULD);
            multiQuery.add(prefixQuery, BooleanClause.Occur.SHOULD);
            multiQuery.add(fuzzyQuery, BooleanClause.Occur.SHOULD);
            multiQuery.add(rangQuery, BooleanClause.Occur.SHOULD);
           
            Sort sort=new Sort(ArticleTime);//排序
            /* 开始搜索 */
            Hits h = searcher.search(multiQuery,sort);
            String highTitle="";
            String highText="";
            List<String> list=new ArrayList<String>();
             /* 把搜索出来的所有文件打印出来 */
            for (int i = 0; i < h.length(); i++) {
                 //打印出文件里面ArticleTitle域里面的内容
                String title=h.doc(i).get(ArticleTitle);
                // 打印出文件里面ArticleText域里面的内容 
                String text=h.doc(i).get(ArticleText);
                SimpleHTMLFormatter format=new SimpleHTMLFormatter("<b><font color='red'>","</font></b>");
                Highlighter light=new Highlighter(format, new QueryScorer(multiQuery));//高亮
                light.setTextFragmenter(new SimpleFragmenter(200));
                if(title!=null)
                {
                TokenStream stream=analyzer.tokenStream(ArticleTitle, new StringReader(title));
                highTitle=light.getBestFragment(stream, title);
                System.out.println(highTitle);
                }
                if(text!=null)
                {
                TokenStream streamText=analyzer.tokenStream(ArticleText, new StringReader(text));
                highText=light.getBestFragment(streamText, text);
                System.out.println(highText);
                }
              //为了在页面好遍历,把它放入集合中
                if(highTitle!=null)
                {
                    list.add("标题中包含关键字:"+highTitle+"<br/>");
                }
                if(highText!=null)
                {
                    list.add("内容中包含关键字:"+highText+"<br/>");
                }
               
               
            }
            getRequest().setAttribute("list",list);
            /* 关闭 */
            searcher.close();
            return SUCCESS;
        }
        public String goToSearch()
        {
            return SUCCESS;
        }
          
         // 通配符搜索 WildcardQuery    
         // 通配符包括’?’匹配一个任意字符和’*’匹配零个或多个任意字符,例如你搜索’use*’,你可能找到’user’或者’uses’:    
         public static void wildcardSearcher() throws Exception{ 
               index();
                 IndexSearcher searcher = new IndexSearcher(path); 
                  
                 // 与正则一样,*代表0个或多个字母,?代表0个或一个字母 
                 // WildcardQuery与QueryParser不同的是:WildcardQuery的前缀可以为*,而QueryParser不行 
                 Query query = new WildcardQuery(new Term(ArticleText,"te*")); 
                  
                 Hits hits = searcher.search(query); 
                  
                 printResult(hits); 
                  
                 searcher.close(); 
         } 
         public static void printResult(Hits hits) throws IOException{ 
             for(int i = 0; i < hits.length(); i++){ 
                 Document d = hits.doc(i);
                 String title=d.get(ArticleTitle);
                 String text=d.get(ArticleText);
                 String time=d.get(ArticleTime);
                 if(title!=null)
                 {
                     System.out.println(title);
                 }
                 if(text!=null)
                 {
                     System.out.println(text);
                 }
                 if(time!=null)
                 {
                     System.out.println(time);
                 }
              
             } 
         } 
        public static void main(String[] args) throws Exception {
            LuceneTest test=new LuceneTest();
            test.wildcardSearcher();
           LuceneTest .searchIndex();
        }
    }



 

分享到:
评论
2 楼 flyfan 2010-01-04  
代码为什么不用编辑器呢,这样看着不舒服
1 楼 litianyi520 2010-01-04  
很不错啊!

相关推荐

    lucene 全包 包括源码

    除了核心模块,Lucene还提供了一些附加功能,如 SpellChecker(拼写检查)、Highlighter(高亮显示搜索结果)和Remote搜索支持。在源码中,你可以找到对应的实现类,如SpellChecker、Highlighter等。 这个压缩包中...

    使用compass+lucene实现简单的全文检索功能

    首先,Lucene 是一个高性能、全功能的文本分析库,主要用于信息检索。它提供了索引和搜索大量文本数据的能力,包括分词、分析、存储和搜索等功能。Lucene 是纯 Java 库,可以方便地集成到各种 Java 应用中。 ...

    lucene完整包,所有的包都有,非常全的

    总的来说,Lucene 是一个强大的全文搜索工具,提供了完整的搜索解决方案,涵盖了从数据索引到查询执行的全过程。对于开发人员来说,掌握 Lucene 可以帮助构建高效、灵活的搜索功能,提升用户体验。

    lucene.NET 中文分词

    作为一个开源的搜索引擎框架,Lucene.NET为开发者提供了强大的文本搜索功能。而在处理中文文档时,由于中文词汇间的无明显空格分隔,分词成为了一个重要的环节。本文将深入探讨Lucene.NET如何进行中文分词以及高亮...

    lucene 资料全集

    它提供了一个可扩展的、高性能的搜索框架,使得开发者能够快速地在大量数据中实现全文检索功能。Lucene 已经成为了 Java 世界中事实上的搜索引擎标准,被广泛应用在网站、企业信息系统、内容管理系统等领域。 **一...

    lucene in action_中文版(lucene实战)

    它通过浅显的语言、大量的图注、丰富的代码示例,以及清晰的结构为读者呈现出作为优秀开源项目的Lucene 所体现的强大功能。全书共10章,分为两大部分。第1部分Lucene的核心,着重于Lucene的核心API介绍,并按照把...

    最全的lucene-2.4.0jar包

    标题中的“lucene-2.4.0jar包”指的是Lucene的2.4.0版本,这是一个较早的稳定版本,但仍然包含了丰富的功能和示例。 在这个压缩包中,你将找到以下内容: 1. **Lucene核心库**:`lucene-core-2.4.0.jar` 是Lucene...

    Lucene in Action 2nd Edition

    Lucene是一个高性能、全功能的文本分析和搜索库,广泛应用于各种项目,从简单的网站搜索到复杂的商业智能应用。以下是本书可能涵盖的一些核心知识点: 1. **Lucene基础**:介绍Lucene的基本架构和工作原理,包括倒...

    lucene.net 2.9.1 源码

    5. 集成应用:将Lucene.NET集成到ASP.NET、WPF、WinForms等.NET应用程序中,实现全站搜索。 五、未来发展趋势 虽然目前最新的Lucene.NET版本已经更新至4.x,但2.9.1版本仍有其价值,尤其对于维护旧项目的开发者。...

    Lucene.In.Action.2nd.Edition

    Lucene是一个高性能、全功能的文本搜索引擎库,由Java编写,广泛应用于各种Web应用程序和企业级搜索解决方案中。它为开发者提供了构建高效搜索引擎所需的核心工具,包括索引、搜索、排序和结果相关性等功能。以下是...

    Lucene.net 2.0 API + DLL 下载

    6. **扩展性**:Lucene.NET具有良好的扩展性,可以与其他.NET框架和库无缝集成,例如ASP.NET、NHibernate等,方便构建全站搜索或数据库全文索引。 在Lucene.NET 2.0版本中,开发者可以下载到`.DLL`文件,这是编译好...

    lucene2.0与其分词工具包

    总的来说,Lucene 2.0是Java全职搜索引擎的重要里程碑,它的分词工具包则解决了处理中文文本的关键问题。通过深入理解和熟练运用这些工具,开发者可以构建出高效、精准的信息检索系统,满足各种搜索需求。尽管年代...

    盘古PanGu4Lucene_V2.3.1.0

    Lucene.NET是Apache Lucene项目的一个.NET版本,是一个高性能、全功能的全文检索库。它提供了强大的索引和查询能力,但默认并不支持中文分词。通过集成PanGu4Lucene,Lucene.NET可以处理中文文本,实现精确的中文...

    LuceneInAction 第2版 中文版 pdf

    本书深入浅出地介绍了lucene 一个开源的使用java语言编写的全文搜索引擎开发包 它通过浅显的语言 大量的图注 丰富的代码示例 以及清晰的结构为读者呈现出作为优秀开源项目的lucene所体现的强大功能 全书共10章 分为...

    Lucene.Net_2_9_1.zip

    Lucene.Net是一个基于Java Lucene的.NET全功能搜索库,它提供了强大的文本分析、索引和搜索功能。这个版本2.9.1是该库的一个稳定版本,适用于.NET Framework的应用开发。Lucene.Net的核心设计目标是使开发者能够轻松...

    Lucene Hibernate

    **正文** 标题“Lucene Hibernate”揭示了我们讨论的核心主题:如何将Apache ...它不仅展示了Lucene的搜索效能,还体现了Hibernate在数据管理上的便利性,两者结合,为开发高效率、易维护的全功能搜索应用提供了可能。

    基于lucene的索引与搜索

    Lucene是一个开源的Java库,提供了强大的文本分析、索引和搜索功能,被广泛应用于各种信息检索系统中。 第一章 引言 在信息爆炸的时代,搜索引擎成为人们获取信息的重要工具。Apache Lucene作为一款强大的全文搜索...

    lucene 中文分词 庖丁解牛

    Lucene是Java语言编写的一个高性能、可扩展的信息检索库,它提供了完整的搜索功能,包括索引构建、查询解析、评分以及结果排序等。在处理中文文档时,Lucene需要依赖于第三方的分词器,以便对中文文本进行有效的切分...

    Lucene in action 中文版

    Lucene是一个开源的全文检索库,它提供了高级的文本分析和高效的索引功能,常被用于构建复杂的搜索应用。书中的内容涵盖了Lucene的基础概念、核心组件、以及如何在实际项目中有效使用它们。例如,书中会详细介绍如何...

    Lucene中文分词器组件

    1. **IK Analyzer**:IK Analyzer是一个开源的、基于Java实现的中文分词工具,支持多种分词模式,包括精确模式、全模式、最短路径模式等。它可以根据实际需求进行自定义配置,如添加自定义词汇表,以提高分词准确性...

Global site tag (gtag.js) - Google Analytics