`
jialisoft126
  • 浏览: 36257 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

用lucene实现在一个(或者多个)字段中查找多个关键字

    博客分类:
  • java
阅读更多

最近跟着师兄们做个项目,我的任务就是负责做个“全文检索”的小模块。用到了Lucene的索引,下面的是其中的用Lucene实现在索引的一个字段(比如文章内容字段)进行查找多个关键字的实例代码。

  1.Lucene说明

  Lucene是非常优秀的成熟的开源的免费的纯java语言的全文索引检索工具包。

  Lucene的的强项在“建立索引”和”搜索“,而不是实现具体的”分词“。Lucene支持对生成索引的进行”增,删,改,查“操作,这比自己建立的索引有了很大的进步。

  可以使用专门的分词程序进行分词,在分词的结果上用Lucene建立索引。

  2.用Lucene实现在一个或者多个字段中的检索

  主要是函数:MultiFieldQueryParser.parse(String[] query,String[] field,Occur[] occ,Analyzer analyzer);

      1)query:要查找的字符串数组

      2)field:要查找的字符串数组对应的字段(当然有可以相同的)

      3)occ:表示对应字段的限制。有三种:Occur.MUST(必须有), Occur.MUST_NOT(必须没有),Occur.SHOULD(应该)

      4)analyzer:对查询数据的分析器,最好与建立索引时用的分析器一致

  3.代码示例

  下面这个程序可以实现在一个字段“contents”中查找多个关键字。稍加修改也可以在多个字段查找多个关键字。

复制代码
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.queryParser.MultiFieldQueryParser;
import org.apache.lucene.search.BooleanClause.Occur;
import org.apache.lucene.search.Hits;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;

public class MultiPhraseQuerySearcher {
    private static String indexPath = "E:\\Lucene\\index";    // 索引保存目录
    
    public static void createIndex(){    // 建立索引
       IndexWriter writer;
       try {
            writer = new IndexWriter(indexPath,new StandardAnalyzer(),true);
           
            Field fieldB1 = new Field("contents","今晚的辩题很道地:在我们这些人当中?",Field.Store.YES,Field.Index.TOKENIZED);
            Field fieldB2 = new Field("contents","我们为电影《今朝》是一部不错的影片。",Field.Store.YES,Field.Index.TOKENIZED);
            Field fieldB3 = new Field("contents","我们到底是啥意思呢?",Field.Store.YES,Field.Index.TOKENIZED);
            Document doc1 = new Document();
            Document doc2 = new Document();
            Document doc3 = new Document();
            doc1.add(fieldB1);
            doc2.add(fieldB2);
            doc3.add(fieldB3);
           
            writer.addDocument(doc1);
            writer.addDocument(doc2);
            writer.addDocument(doc3);
            writer.close();
       } 
       catch (Exception e) {
           e.printStackTrace();
       } 
    }
    
    public static void main(String[] args) {    //contests字段上查找含有"我们","今晚"这两个字段的Doument
       Query query;
       IndexSearcher searcher;
        try {
            //生成索引
            createIndex();
            searcher = new IndexSearcher(indexPath);
            //要查找的字符串数组
            String [] stringQuery={"我们","今晚"};
            //待查找字符串对应的字段
            String[] fields={"contents","contents"};
            //Occur.MUST表示对应字段必须有查询值, Occur.MUST_NOT 表示对应字段必须没有查询值
            Occur[] occ={Occur.MUST,Occur.MUST};
            
            query=MultiFieldQueryParser.parse(stringQuery,fields,occ,new StandardAnalyzer());
            Hits hits = searcher.search(query);
            for(int i=0;i<hits.length();i++)
                 System.out.println("Document内容为 : "+hits.doc(i));
            System.out.println("共检索出符合条件的Document "+hits.length()+" 个。");
       } 
       catch (Exception e) {} 
    }
}
复制代码
分享到:
评论

相关推荐

    lucene2.4+nutch学习笔记三:lucene 在多个文本文档里找出包含一些关键字的文档

    Lucene是一个高性能、全文本搜索引擎库,它为开发者提供了在Java应用程序中实现全文搜索功能的基本工具。Nutch则是一个开源的网络爬虫项目,用于抓取互联网上的网页并建立索引。在这篇学习笔记中,我们将探讨如何...

    基于LUCENE的搜索引擎的设计与实现源代码

    - **文档**:在LUCENE中,每个文档对应一个独立的信息单元,可以是网页、文本文件等,文档由多个字段(Field)组成,如标题、正文等。 - **字段**:字段是文档的组成部分,具有特定的属性,如是否可被搜索或存储。...

    用Lucene检索数据库

    每个`Document`对象可以包含多个`Field`对象,每个`Field`对象代表了文档中的一个字段。例如: ```java Document doc = new Document(); doc.add(new Field("NAME", "USERNAME", Field.Store.YES, Field.Index.UN_...

    lucene 全文检索数据库

    标题和描述中提到的知识点是关于Lucene全文检索数据库的应用示例,特别是在处理大量数据和多表查询时的性能优化。下面将详细阐述Lucene的基本概念、如何在Java环境中使用Lucene进行全文检索,以及结合MySQL数据库的...

    Lucene项目(华电内部文档搜索系统)

    - **文档(Document)**: 在Lucene中,每个文档表示一个独立的信息单元,可以包含多个字段(Field),如标题、正文等。 - **字段(Field)**: 文档由多个字段组成,每个字段都有特定的类型,如“text”用于全文本...

    JAVA_lucene全文检索工具包的理解与使用.rar_java_全文检索

    2. **文档(Document)**:在Lucene中,文档是存储和检索的基本单位,可以包含多个字段(Field),如标题、内容、作者等。每个字段都有自己的名称和值,并可以选择是否参与索引和搜索。 3. **字段(Field)**:字段...

    Lucene+3.0+原理与代码分析完整版

    1. **“中华AND共和国”与“中华共和国”的区别**:由于Lucene默认使用标准分词器,它会将连续的字母数字序列视为一个词条,因此“中华AND共和国”会被分词为“中华”、“AND”和“共和国”,而“中华共和国”则被...

    lucene索引的简单使用

    1. **文档(Document)**:在Lucene中,每个需要被搜索的信息单元被视为一个文档。文档由多个字段(Field)组成,每个字段具有特定的名称和内容,例如标题、正文、作者等。 2. **字段(Field)**:字段是文档的组成...

    Lucene 开发实例

    2. **字段与文档**:在 Lucene 中,每个文档可以包含多个字段,比如标题、内容、作者等。每个字段可以有不同的分析器(Analyzer),用于不同的处理规则。 3. **查询解析**:用户输入的查询字符串会被解析成 Lucene ...

    lucene全文搜索

    - **Field**:存储在Document中的键值对,每个Field包含一个字符串键和一个字符串值。 3. **互联网搜索结构**: - 用户通过搜索引擎访问的是索引库而非直接的网页。 - 索引库包含索引号和文档摘要。 - 用户首次...

    全文检索Lucene

    - **文档(Document)**: Lucene中的文档相当于存储信息的基本单元,可以包含多个字段(Field),每个字段有自己的名称和内容,比如标题、正文、作者等。 - **字段(Field)**: 字段是文档的组成部分,具有特定的...

    Lucene相关资料

    - **多字段搜索**:可以同时在多个字段上进行查询。 - **模糊查询**:支持通配符、短语查询和近似查询。 - **评分系统**:根据查询词在文档中的频率和位置计算相关性得分。 - **高亮显示**:对搜索结果的关键词...

    JAVA lucene全文检索工具包的理解与使用.doc

    每个Document可以包含多个Field,每个Field对应于原始记录中的一个属性,如标题、正文或日期等。Field有两种主要属性: - **存储**:控制是否将Field的值存储在索引文件中,以便于检索时能够直接获取。 - **索引...

    lucence.net查询

    传入一个或多个字段名和查询字符串,QueryParser会自动处理布尔运算符、短语匹配等。例如,`QueryParser.Parse("字段1:关键字1 AND 字段2:关键字2")`将返回一个表示两个条件的布尔查询。 2. **...

    Luence和ElasticSearch面试准备.docx

    Lucene是一个高性能、全文本搜索库,而Elasticsearch则是在Lucene的基础上构建的一个分布式、RESTful风格的搜索和数据分析引擎。两者在面试中常常被提及,以下是对这两个技术的关键知识点的深入解析。 首先,Lucene...

    Lucene+原理与代码

    具体来说,每个词项都会关联一个文档列表(称为**倒排列表**),列表中的每个条目包含了该词项在文档中出现的位置等信息。此外,索引还可能包含其他元数据,如词频、文档长度等。 ##### 如何创建索引? 1. **原始...

    lucene课件

    Lucene 是一个实现了全文检索概念的Java库,提供了一套完整的文本检索框架。它支持索引创建、更新和查询,并且可以与其他系统集成。使用Lucene,开发者可以通过API实现对索引库的CRUD操作。 ### 4. Lucene 结构 ...

    Lucene学习程序

    1. **索引**: Lucene首先对文档进行索引,这个过程相当于创建一个倒排索引,它将文档中的词与对应的文档位置关联起来,便于快速查找。 2. **分词器**: 在索引过程中,分词器(Analyzer)负责将输入文本拆分成有意义...

Global site tag (gtag.js) - Google Analytics