`

lucene 查询

 
阅读更多

实体类:

 

package com.nanjing.chaoxing.lucene.model;

import java.io.File;
import java.io.Reader;

public class Book {
    private String bookid;
    private String bookname;
    private String author;
    private String subject;
    private Reader bookReader;
    private int year;

    public Book(){

    }

    public Book(String bookid, String bookname, String author, String subject, int year,Reader bookReader) {
        this.bookid = bookid;
        this.bookname = bookname;
        this.author = author;
        this.subject = subject;
        this.year = year;
        this.bookReader = bookReader;
    }

    public String getBookid() {
        return bookid;
    }

    public void setBookid(String bookid) {
        this.bookid = bookid;
    }

    public String getBookname() {
        return bookname;
    }

    public void setBookname(String bookname) {
        this.bookname = bookname;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public String getSubject() {
        return subject;
    }

    public void setSubject(String subject) {
        this.subject = subject;
    }

    public Reader getBookReader() {
        return bookReader;
    }

    public void setBookReader(Reader bookReader) {
        this.bookReader = bookReader;
    }

    public int getYear() {
        return year;
    }

    public void setYear(int year) {
        this.year = year;
    }

    @Override
    public String toString() {
        return "Book{" +
                "bookid='" + bookid + '\'' +
                ", bookname='" + bookname + '\'' +
                ", author='" + author + '\'' +
                ", subject='" + subject + '\'' +
                ", bookReader=" + bookReader +
                ", year='" + year + '\'' +
                '}';
    }
}

 

操作类:

 

package com.nanjing.chaoxing.lucene.model;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.Fieldable;
import org.apache.lucene.document.NumericField;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;

import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class BookUtil {
    public static File indexFile = new File("E:\\test\\indexFile");
    private Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_36);
    public static List<Book> bookList = new ArrayList<Book>();
    private IndexWriter indexWriter;

    public void createDocument() throws IOException {

        Book book1 = new Book("6270000080", "core java 1", "jams", "java book", 2001, new FileReader("E:\\test\\dataSourceFile\\1.txt"));
        Book book2 = new Book("6270000081", "core java 2", "jams", "java book", 2010, new FileReader("E:\\test\\dataSourceFile\\2.txt"));
        Book book3 = new Book("6270000082", "Thinking in java1", "tom", "java book", 2012, new FileReader("E:\\test\\dataSourceFile\\3.txt"));
        Book book4 = new Book("6270000083", "Thinking in java2", "tom", "java book", 2005, new FileReader("E:\\test\\dataSourceFile\\4.txt"));
        Book book5 = new Book("6270000084", "Thinking in java3", "tom", "java book", 2011, new FileReader("E:\\test\\dataSourceFile\\5.txt"));
        Book book6 = new Book("6270000085", "Thinking in java4", "tom", "java book", 1994, new FileReader("E:\\test\\dataSourceFile\\6.txt"));
        bookList.add(book1);
        bookList.add(book2);
        bookList.add(book3);
        bookList.add(book4);
        bookList.add(book5);
        bookList.add(book6);

        for (Book book : bookList) {
            Document doc = new Document();
            doc.add(new Field("bookid", book.getBookid(), Field.Store.YES, Field.Index.NOT_ANALYZED));
            doc.add(new Field("bookname", book.getBookname(), Field.Store.YES, Field.Index.NOT_ANALYZED));
            doc.add(new Field("author", book.getAuthor(), Field.Store.YES, Field.Index.NOT_ANALYZED));
            doc.add(new Field("subject", book.getSubject(), Field.Store.YES, Field.Index.NOT_ANALYZED));
            doc.add(new NumericField("year",Field.Store.YES, true).setIntValue(book.getYear()));
            doc.add(new Field("content", book.getBookReader()));
            indexWriter.addDocument(doc);
        }

        indexWriter.close();
    }

    public void createIndexWriter() throws IOException {
        Directory directory = FSDirectory.open(indexFile);
        IndexWriterConfig indexWriterConfig = new IndexWriterConfig(Version.LUCENE_36, analyzer);
        indexWriterConfig.setOpenMode(IndexWriterConfig.OpenMode.CREATE);
        indexWriter = new IndexWriter(directory, indexWriterConfig);
    }
}

 

测试类:

 

package com.nanjing.chaoxing.lucene;

import com.nanjing.chaoxing.lucene.model.Book;
import com.nanjing.chaoxing.lucene.model.BookUtil;
import org.apache.log4j.Logger;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.*;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import org.junit.BeforeClass;
import org.junit.Test;

import java.io.IOException;

public class LuceneQueryTest {
    private Logger logger = Logger.getLogger(LuceneQueryTest.class);

    @BeforeClass
    public static void init() throws IOException {
        BookUtil bookUtil = new BookUtil();
        bookUtil.createIndexWriter();
        bookUtil.createDocument();
    }

//    @Test
    public void test() throws IOException, ParseException {
        termQuery("6270000081");
        termRangeQuery();
        numbericRangeQuery();
        prefixQuery();
        booleanQuery();
        wildcardQuery();
        queryParse();
    }

    /**
     * 关键字查询--完全匹配
     *
     * @param bookid
     * @throws IOException
     */
    public void termQuery(String bookid) throws IOException {
        TermQuery termQuery = new TermQuery(new Term("bookname", "Thinking in java1"));
        outResult(termQuery, "term  query");
    }

    /**
     * 字符串范围查询
     * @throws IOException
     */
    public void termRangeQuery() throws IOException {
        TermRangeQuery termRangeQuery = new TermRangeQuery("bookname", "c", "j", true, true);
        outResult(termRangeQuery, "prefic query");
    }

    /**
     * 数字范围查询
     * @throws IOException
     */
    public void numbericRangeQuery() throws IOException {
        NumericRangeQuery numericRangeQuery = NumericRangeQuery.newIntRange("year", 2008, 2012, true, true);
        IndexReader indexReader = IndexReader.open(FSDirectory.open(BookUtil.indexFile));
        outResult(numericRangeQuery, "number query");
    }

    /**
     * 字符串开头的搜索
     */
    public void prefixQuery() throws IOException {
        PrefixQuery prefixQuery = new PrefixQuery(new Term("bookname", "Thinking in"));
        outResult(prefixQuery, "prefic query");
    }

    /**
     * 组合查询,其中BooleanClause.Occur.MUST是与,BooleanClause.Occur.SHOULD是或,BooleanClause.Occur.MUST_NOT是非
     */
    public void booleanQuery() throws IOException {
        TermQuery termQuery = new TermQuery(new Term("author", "tom"));
        NumericRangeQuery numericRangeQuery = NumericRangeQuery.newIntRange("year", 2011, 2012, true, false);
        BooleanQuery booleanQuery = new BooleanQuery();
        booleanQuery.add(termQuery, BooleanClause.Occur.MUST);
        booleanQuery.add(numericRangeQuery, BooleanClause.Occur.MUST);
        outResult(booleanQuery, "boolean query");

    }

    /**
     * 通配符查询:*--0或者多个字符,?--0或1个字符,
     */
    public void wildcardQuery() throws IOException {
        WildcardQuery wildcardQuery = new WildcardQuery(new Term("bookname", "?or*"));
        outResult(wildcardQuery, "wildcard query");
    }

    /**
     * 通配符查询:*--0或者多个字符,?--0或1个字符,
     */
//    @Test
    public void fuzzyQuery() throws IOException {
        FuzzyQuery fuzzyQuery = new FuzzyQuery(new Term("author", "jam"));
        outResult(fuzzyQuery, "fuzzy query");
    }

    /**
     *  用queryParse进行范围选择 a AND b=+a+b; a OR b=a b; a AND NOT b=+a-b;
     *  模糊匹配可以用~表示
     */
    @Test
    public void queryParse() throws ParseException, IOException {
        QueryParser queryParser=new QueryParser(Version.LUCENE_36,"bookid",new StandardAnalyzer(Version.LUCENE_36));
//        Query query=queryParser.parse("bookid:(6270000081 6270000082) AND author:tom");
//        Query query=queryParser.parse("bookid:(6270000081 6270000082)  -author:tom");
//        Query query=queryParser.parse("bookid:(6270000081 OR 6270000082)  author:tom");
        Query query=queryParser.parse("author:jam~");
        outResult(query,"query parse range");
    }
    /**
     * 输出匹配的结果
     *
     * @param query
     * @param queryInfo
     * @throws IOException
     */
    public void outResult(Query query, String queryInfo) throws IOException {
        IndexReader indexReader = IndexReader.open(FSDirectory.open(BookUtil.indexFile));
        IndexSearcher indexSearcher=new IndexSearcher(indexReader);
        logger.info(queryInfo + " begin....");
        TopDocs topDocs = indexSearcher.search(query, 1000);
        ScoreDoc[] scoreDocs = topDocs.scoreDocs;
        for (int i = 0; i < scoreDocs.length; i++) {
            ScoreDoc scoreDoc = scoreDocs[i];
            int doc = scoreDoc.doc;
            for (Book book : BookUtil.bookList) {
                if (indexSearcher.doc(doc).get("bookid").equals(book.getBookid())) {
                    logger.info(book);
                }
            }
        }
        logger.info(queryInfo + " end....\n");
    }
}

分享到:
评论

相关推荐

    lucene查询工具类和IndexSearcher分页查询示例

    在本文中,我们将深入探讨如何使用Lucene查询工具类和`IndexSearcher`进行分页查询,这在处理大量数据时尤其有用。Lucene是一个强大的全文搜索引擎库,它提供了高效、可扩展的文本检索功能。在Java开发环境中,...

    lucene的查询语法事例

    **Lucene查询语法详解** Apache Lucene是一款高性能、全文本搜索库,被广泛应用于各种搜索引擎的构建。在使用Lucene进行信息检索时,理解和掌握其查询语法至关重要。本篇文章将深入探讨Lucene的查询语法,帮助你更...

    对内存中Lucene查询的集合进行分页

    这篇博客文章“对内存中Lucene查询的集合进行分页”探讨的是如何在处理大量数据时,有效地对Lucene查询结果进行分页显示,以提高用户体验并减轻服务器负担。 首先,理解Lucene的基本工作原理至关重要。Lucene通过...

    Lucene查询工具LQT.zip

    Lucene Query Tool (lqt) 是一个命令行工具用来执行 Lucene 查询并对结果进行格式化输出。 使用方法: $ ./lqt usage: LuceneQueryTool [options] --analyzer &lt;arg&gt; for query, (KeywordAnalyzer | ...

    Lucene查询语法

    ### Lucene查询语法详解 #### 一、Lucene概述 Lucene是一款高性能、全功能的文本搜索引擎库,被广泛应用于各种需要实现全文检索的应用场景之中。Lucene支持复杂的查询语法,能够灵活地处理多样化的查询需求,使得...

    lucene 查询 学习

    根据提供的标题、描述、标签及部分内容,我们可以提炼出与Lucene查询学习相关的知识点。下面将对这些知识点进行详细的阐述。 ### Lucene概述 Lucene是一款高性能、全功能的文本搜索引擎库,由Java语言编写而成。它...

    lucene查询结果集分页代码

    在lucene搜索分页过程中,可以有两种方式 一种是将搜索结果集直接放到session中,但是假如结果集非常大,同时又存在大并发访问的时候,很可能造成服务器的内存不足,而使服务器宕机 还有一种是每次都重新进行搜索,这样...

    Lucene 索引的简单使用

    本篇文章将详细阐述如何使用Lucene来创建和查询索引,帮助你深入理解其核心概念和操作流程。 ### 1. Lucene基本概念 - **文档(Document)**:在Lucene中,一个文档代表你要索引的信息单元,它可以包含多个字段...

    lucene做索引查询流程

    lucene 做索引查询流程,来自《lucene in action》

    lucene-query-string-builder:使用基本功能构建复杂的Lucene查询字符串

    Lucene查询字符串生成器 使用小型纯函数轻松构建您的Lucene字符串查询。 想象一下,有一个利用Lucene在(索引的)数据库上执行查询的API。 在这种情况下,您可能希望在客户端/前端上生成lucene查询字符串。 用法...

    lucene-query-parser:Lucene查询字符串解析器用作Web api查询或过滤器字符串

    Lucene查询解析器 Lucene查询字符串解析器,用作Web api查询或过滤器字符串。 基本代码来自 使用这种语言的示例查询: name: apple price: &gt; 100 price: &gt; 100 AND active: = 1 product.price: &gt; 100 AND ...

    lucene创建修改删除组合条件查询

    **组合条件查询**是Lucene查询的强大之处。你可以使用`BooleanQuery`来构造复杂的布尔逻辑,比如AND、OR、NOT操作。例如,可以创建两个`Query`对象,一个用于匹配关键词,另一个用于时间范围,然后通过`...

    luceneDemo

    3. **查询解析**: 后端服务接收到查询后,使用 QueryParser 将查询字符串解析为 Lucene 查询对象。 4. **执行搜索**: 使用 Searcher 执行查询,获取匹配的文档。 5. **返回结果**: 将搜索结果的文档得分、标题等信息...

    用 Lucene 加速 Web 搜索应用程序的开发

    学习如何解析用户输入的查询并转化为Lucene查询对象,以及如何使用Searcher执行查询。 4. **结果排序与优化:** Lucene提供了一种叫做TF-IDF的评分机制来决定搜索结果的相关性。了解如何自定义评分函数以满足特定...

    Lucene的一个毕业设计

    1. **查询解析**:用户输入的查询字符串需要通过 QueryParser 或 MultiFieldQueryParser 转换为 Lucene 查询对象。这些解析器会处理语法,识别短语、布尔运算符、通配符等。 2. **搜索执行**:使用 IndexSearcher ...

    Lucene5.3.1 中文完整Jar包

    2. **查询解析**:Lucene 提供了查询解析器,可以将用户的输入转换为索引理解的查询表达式,支持布尔运算、短语查询、近似查询等多种复杂查询模式。 3. **搜索执行**:基于倒排索引,Lucene 可以快速找到包含查询词...

    lucene.net+完全入门教程

    3. **查询解析**: 用户输入的查询字符串会被转换为Lucene查询语法,QueryParser类负责这个过程。它可以处理各种查询类型,如布尔查询、短语查询、前缀查询等。 4. **文档检索**: 使用IndexReader和IndexSearcher类...

    全文搜索-Lucene

    2. **查询处理**:用户输入查询字符串,查询解析器将它转化为 Lucene 查询对象。 3. **评分与排序**:搜索器根据查询对象和索引进行匹配,计算每个匹配文档的相关性分数,如 TF-IDF。 4. **结果返回**:按相关性...

    lucene检索新闻数据演示

    5. **查询解析**:用户输入的查询需要被解析成Lucene可以理解的格式。这可能涉及到查询分析,比如同义词扩展、短语匹配等。 6. **搜索执行**:通过Lucene的Query类构建查询对象,然后使用IndexSearcher进行搜索。...

    Lucene教程

    查询解析器(QueryParser)将用户的查询字符串转换成Lucene查询对象。它处理查询语法,支持布尔运算符、通配符、短语搜索等。 ## 3. Lucene实战 在实际项目中,开发者通常需要自定义分析器以适应特定的语言或领域...

Global site tag (gtag.js) - Google Analytics