实体类:
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是一个强大的全文搜索引擎库,它提供了高效、可扩展的文本检索功能。在Java开发环境中,...
**Lucene查询语法详解** Apache Lucene是一款高性能、全文本搜索库,被广泛应用于各种搜索引擎的构建。在使用Lucene进行信息检索时,理解和掌握其查询语法至关重要。本篇文章将深入探讨Lucene的查询语法,帮助你更...
这篇博客文章“对内存中Lucene查询的集合进行分页”探讨的是如何在处理大量数据时,有效地对Lucene查询结果进行分页显示,以提高用户体验并减轻服务器负担。 首先,理解Lucene的基本工作原理至关重要。Lucene通过...
Lucene Query Tool (lqt) 是一个命令行工具用来执行 Lucene 查询并对结果进行格式化输出。 使用方法: $ ./lqt usage: LuceneQueryTool [options] --analyzer <arg> for query, (KeywordAnalyzer | ...
### Lucene查询语法详解 #### 一、Lucene概述 Lucene是一款高性能、全功能的文本搜索引擎库,被广泛应用于各种需要实现全文检索的应用场景之中。Lucene支持复杂的查询语法,能够灵活地处理多样化的查询需求,使得...
根据提供的标题、描述、标签及部分内容,我们可以提炼出与Lucene查询学习相关的知识点。下面将对这些知识点进行详细的阐述。 ### Lucene概述 Lucene是一款高性能、全功能的文本搜索引擎库,由Java语言编写而成。它...
在lucene搜索分页过程中,可以有两种方式 一种是将搜索结果集直接放到session中,但是假如结果集非常大,同时又存在大并发访问的时候,很可能造成服务器的内存不足,而使服务器宕机 还有一种是每次都重新进行搜索,这样...
本篇文章将详细阐述如何使用Lucene来创建和查询索引,帮助你深入理解其核心概念和操作流程。 ### 1. Lucene基本概念 - **文档(Document)**:在Lucene中,一个文档代表你要索引的信息单元,它可以包含多个字段...
lucene 做索引查询流程,来自《lucene in action》
Lucene查询字符串生成器 使用小型纯函数轻松构建您的Lucene字符串查询。 想象一下,有一个利用Lucene在(索引的)数据库上执行查询的API。 在这种情况下,您可能希望在客户端/前端上生成lucene查询字符串。 用法...
Lucene查询解析器 Lucene查询字符串解析器,用作Web api查询或过滤器字符串。 基本代码来自 使用这种语言的示例查询: name: apple price: > 100 price: > 100 AND active: = 1 product.price: > 100 AND ...
**组合条件查询**是Lucene查询的强大之处。你可以使用`BooleanQuery`来构造复杂的布尔逻辑,比如AND、OR、NOT操作。例如,可以创建两个`Query`对象,一个用于匹配关键词,另一个用于时间范围,然后通过`...
3. **查询解析**: 后端服务接收到查询后,使用 QueryParser 将查询字符串解析为 Lucene 查询对象。 4. **执行搜索**: 使用 Searcher 执行查询,获取匹配的文档。 5. **返回结果**: 将搜索结果的文档得分、标题等信息...
学习如何解析用户输入的查询并转化为Lucene查询对象,以及如何使用Searcher执行查询。 4. **结果排序与优化:** Lucene提供了一种叫做TF-IDF的评分机制来决定搜索结果的相关性。了解如何自定义评分函数以满足特定...
1. **查询解析**:用户输入的查询字符串需要通过 QueryParser 或 MultiFieldQueryParser 转换为 Lucene 查询对象。这些解析器会处理语法,识别短语、布尔运算符、通配符等。 2. **搜索执行**:使用 IndexSearcher ...
2. **查询解析**:Lucene 提供了查询解析器,可以将用户的输入转换为索引理解的查询表达式,支持布尔运算、短语查询、近似查询等多种复杂查询模式。 3. **搜索执行**:基于倒排索引,Lucene 可以快速找到包含查询词...
3. **查询解析**: 用户输入的查询字符串会被转换为Lucene查询语法,QueryParser类负责这个过程。它可以处理各种查询类型,如布尔查询、短语查询、前缀查询等。 4. **文档检索**: 使用IndexReader和IndexSearcher类...
2. **查询处理**:用户输入查询字符串,查询解析器将它转化为 Lucene 查询对象。 3. **评分与排序**:搜索器根据查询对象和索引进行匹配,计算每个匹配文档的相关性分数,如 TF-IDF。 4. **结果返回**:按相关性...
5. **查询解析**:用户输入的查询需要被解析成Lucene可以理解的格式。这可能涉及到查询分析,比如同义词扩展、短语匹配等。 6. **搜索执行**:通过Lucene的Query类构建查询对象,然后使用IndexSearcher进行搜索。...
查询解析器(QueryParser)将用户的查询字符串转换成Lucene查询对象。它处理查询语法,支持布尔运算符、通配符、短语搜索等。 ## 3. Lucene实战 在实际项目中,开发者通常需要自定义分析器以适应特定的语言或领域...