Lucene作为一个开源的搜索工具包,它为开发人员提供了丰富的查询方法,总结如下:
第一种:TermQuery.TermQuery是Lucene里面最基本的一种原子查询。开发人员可以通过它来检索索引中含有指定词条的Document。代码如下:
public static void main(String[] args) throws IOException {
createIndex();
termQuery();
}
private static void createIndex() throws IOException {
IndexWriter writer = new IndexWriter(STORE_PATH,
new StandardAnalyzer(), true);
writer.setUseCompoundFile(false);
Document doc1 = new Document();
Document doc2 = new Document();
Field field = new Field("PostTitle", "Lucene开发浅谈", Field.Store.YES,
Field.Index.TOKENIZED);
Field field1 = new Field("PostContent", "Lucene是一个开源的搜索工具包",
Field.Store.YES, Field.Index.TOKENIZED);
doc1.add(field);
doc1.add(field1);
Field field2 = new Field("PostTitle", "云计算浅谈", Field.Store.YES,
Field.Index.TOKENIZED);
Field field3 = new Field("PostContent",
"云计算是一种基于 Web 的服务,它使得普通计算机拥有超级计算机的能力", Field.Store.NO,
Field.Index.TOKENIZED);
doc2.add(field2);
doc2.add(field3);
writer.addDocument(doc1);
writer.addDocument(doc2);
writer.close();
}
private static void termQuery() throws IOException {
IndexSearcher searcher = new IndexSearcher(STORE_PATH);
Term term = new Term("PostContent", "lucene");
Query termQuery = new TermQuery(term);
Hits hits = searcher.search(termQuery);
System.out.println("TermQuery demo------");
System.out.println("hits.length()==" + hits.length());
for (int i = 0; i < hits.length(); i++) {
System.out.println(hits.doc(i));
}
}
运行结果如下:
TermQuery demo------
hits.length()==1
Document<stored/uncompressed,indexed,tokenized<PostTitle:Lucene开发浅谈> stored/uncompressed,indexed,tokenized<PostContent:Lucene是一个开源的搜索工具包>>
第二种:BooleanQuery。布尔查询其实就是将各种查询的结果再进行布尔运算,最后在得到查询结果。其中具体的组合方式有如下几种:
1 MUST,MUST
2 MUST,MUST_NOT
3 MUST_SHOULD
4 MUST_NOT,SHOULD.
5 SHOULD,SHOULD
6 MUST_NOT,MUST_NOT
具体代码如下:
public static void main(String[] args) throws IOException {
createIndex();
booleanQuery();
}
private static void booleanQuery() throws IOException {
IndexSearcher searcher = new IndexSearcher(STORE_PATH);
Term term1 = new Term("PostTitle", "谈");
Term term2 = new Term("PostContent", "源");
TermQuery termquery1 = new TermQuery(term1);
TermQuery termquery2 = new TermQuery(term2);
BooleanQuery query = new BooleanQuery();
query.add(termquery1, BooleanClause.Occur.MUST);
query.add(termquery2, BooleanClause.Occur.MUST);
Hits hits = searcher.search(query);
System.out.println("BooleanQuery demo with MUST and MUST -------");
System.out.println("hits.length()==" + hits.length());
for (int i = 0; i < hits.length(); i++) {
System.out.println(hits.doc(i));
}
System.out.println("-----------------------------------");
BooleanQuery query1 = new BooleanQuery();
query1.add(termquery1, BooleanClause.Occur.MUST);
query1.add(termquery2, BooleanClause.Occur.MUST_NOT);
Hits hits1 = searcher.search(query1);
System.out.println("BooleanQuery demo with MUST and MUST_NOT -------");
System.out.println("hits.length()==" + hits1.length());
for (int i = 0; i < hits1.length(); i++) {
System.out.println(hits1.doc(i));
}
System.out.println("-----------------------------------");
BooleanQuery query2 = new BooleanQuery();
query2.add(termquery1, BooleanClause.Occur.SHOULD);
query2.add(termquery2, BooleanClause.Occur.MUST_NOT);
Hits hits2 = searcher.search(query2);
System.out.println("BooleanQuery demo with SHOULD and MUST_NOT -------");
System.out.println("hits.length()==" + hits2.length());
for (int i = 0; i < hits2.length(); i++) {
System.out.println(hits2.doc(i));
}
System.out.println("-----------------------------------");
Term term3 = new Term("PostTitle","lucene");
Term term4 = new Term("PostContent","云");
TermQuery termquery3 = new TermQuery(term3);
TermQuery termquery4 = new TermQuery(term4);
BooleanQuery query3 = new BooleanQuery();
query3.add(termquery3, BooleanClause.Occur.SHOULD);
query3.add(termquery4, BooleanClause.Occur.SHOULD);
Hits hits3 = searcher.search(query3);
System.out.println("BooleanQuery demo with SHOULD and SHOULD -------");
System.out.println("hits.length()==" + hits3.length());
for (int i = 0; i < hits3.length(); i++) {
System.out.println(hits3.doc(i));
}
}
运行结果如下:
BooleanQuery demo with MUST and MUST -------
hits.length()==1
Document<stored/uncompressed,indexed,tokenized<PostTitle:Lucene开发浅谈> stored/uncompressed,indexed,tokenized<PostContent:Lucene是一个开源的搜索工具包>>
-----------------------------------
BooleanQuery demo with MUST and MUST_NOT -------
hits.length()==1
Document<stored/uncompressed,indexed,tokenized<PostTitle:云计算浅谈>>
-----------------------------------
BooleanQuery demo with SHOULD and MUST_NOT -------
hits.length()==1
Document<stored/uncompressed,indexed,tokenized<PostTitle:云计算浅谈>>
-----------------------------------
BooleanQuery demo with SHOULD and SHOULD -------
hits.length()==2
Document<stored/uncompressed,indexed,tokenized<PostTitle:Lucene开发浅谈> stored/uncompressed,indexed,tokenized<PostContent:Lucene是一个开源的搜索工具包>>
Document<stored/uncompressed,indexed,tokenized<PostTitle:云计算浅谈>>
其中Should和must组合时,检索结果为must的结果,当于must_not结合时就相当于must和must_not.
第三种:RangeQuery。范围查询顾名思意就是给定一个方位来查询,比如查询用户ID在“10001-10005”之间的用户等。具体的代码如下:
private static void rangeQuery() throws IOException {
IndexWriter writer = new IndexWriter(STORE_PATH,
new StandardAnalyzer(), true);
Field field1 = new Field("userID", "10001", Field.Store.YES,
Field.Index.TOKENIZED);
Field field2 = new Field("userID", "10002", Field.Store.YES,
Field.Index.TOKENIZED);
Field field3 = new Field("userID", "10003", Field.Store.YES,
Field.Index.TOKENIZED);
Field field4 = new Field("userID", "10004", Field.Store.YES,
Field.Index.TOKENIZED);
Field field5 = new Field("userID", "10005", Field.Store.YES,
Field.Index.TOKENIZED);
Document doc1 = new Document();
Document doc2 = new Document();
Document doc3 = new Document();
Document doc4 = new Document();
Document doc5 = new Document();
doc1.add(field1);
doc2.add(field2);
doc3.add(field3);
doc4.add(field4);
doc5.add(field5);
writer.addDocument(doc1);
writer.addDocument(doc2);
writer.addDocument(doc3);
writer.addDocument(doc4);
writer.addDocument(doc5);
writer.close();
IndexSearcher searcher = new IndexSearcher(STORE_PATH);
Term start = new Term("userID", "10001");
Term end = new Term("userID", "10002");
RangeQuery query = new RangeQuery(start, end, true);
Hits hits = searcher.search(query);
System.out.println("RangeQuery demo------");
System.out.println("hits.length()==" + hits.length());
for (int i = 0; i < hits.length(); i++) {
System.out.println(hits.doc(i));
}
}
运行结果如下:
RangeQuery demo------
hits.length()==5
Document<stored/uncompressed,indexed,tokenized<userID:10001>>
Document<stored/uncompressed,indexed,tokenized<userID:10002>>
Document<stored/uncompressed,indexed,tokenized<userID:10003>>
Document<stored/uncompressed,indexed,tokenized<userID:10004>>
Document<stored/uncompressed,indexed,tokenized<userID:10005>>
其中RangeQuery构造函数的第三个参数是用来指定是否包含边界值,如果是true,就是闭区间,如果为false则为开区间。
分享到:
相关推荐
Lucene3.0浅析Lucene3.0浅析Lucene3.0浅析Lucene3.0浅析
**Lucene查询语法详解** Apache Lucene是一款高性能、全文本搜索库,被广泛应用于各种搜索引擎的构建。在使用Lucene进行信息检索时,理解和掌握其查询语法至关重要。本篇文章将深入探讨Lucene的查询语法,帮助你更...
`IndexSearcher`是Lucene中的核心组件之一,用于执行对索引的查询。它允许我们执行匹配文档的搜索,计算评分,并获取匹配的文档ID。为了使用`IndexSearcher`,我们需要创建一个`Directory`对象,该对象指向包含索引...
在Lucene3.0中,查询处理是一个关键环节,涉及多种查询方式和理论模型。以下是对这些概念的详细解释: 1. **查询方式**: - **顺序查询**:是最简单的查询方式,直接遍历索引,效率较低。 - **索引查询**:基于预...
Lucene支持这种多字段查询,你可以通过构建复杂的Query对象来实现。例如,可以创建一个BooleanQuery,将各个字段的Query子句以AND、OR或NOT的关系组合起来。此外,还可以使用MultiFieldQueryParser,它允许指定一组...
而我们可以将这两种方式结合下,每次查询都多缓存一部分的结果集,翻页的时候看看所查询的内容是不是在已经存在在缓存当中,如果已经存在了就直接拿出来,如果不存在,就进行查询后,从缓存中读出来. 比如:现在我们有一个...
Lucene表达式查询是基于Analyzer和QueryParser实现的,它们负责将用户的输入转换为可执行的查询对象。Analyzer用于分词,QueryParser则解析这些词汇并生成对应的查询结构。这种查询方式提供了更大的灵活性和精确性,...
5. **解析查询**:`queryParser.parse()`方法接受用户输入的查询关键字,返回一个Query对象。 6. **创建查询器**:`IndexSearcher`执行查询,传入索引读取器和是否开启多线程。 7. **执行查询**:调用`...
Lucene,作为Apache软件基金会的一个开源项目,是Java平台上的全文检索库,它提供了文本检索的核心工具,使得开发者能够快速地在应用程序中实现高级的搜索功能。本篇文章将详细阐述如何使用Lucene来创建和查询索引,...
在上面的代码中,`DateTools.DateToString`方法将DateTime对象转换为Lucene可理解的字符串格式,然后创建了一个包含这两个时间点的闭合范围查询。这里的“true”参数表示边界是包含的。 接下来,我们需要将这个...
1. **查询解析**:用户输入的查询字符串需要通过 QueryParser 或 MultiFieldQueryParser 转换为 Lucene 查询对象。这些解析器会处理语法,识别短语、布尔运算符、通配符等。 2. **搜索执行**:使用 IndexSearcher ...
lucene 做索引查询流程,来自《lucene in action》
2. **文档对象创建**:为每个数据库记录创建一个 Lucene 的 `Document` 对象,将字段映射到文档的字段中,例如,数据库中的“标题”对应 Lucene 文档的“title”字段。 3. **索引构建**:使用 `IndexWriter` 将 `...
5. **评分(Scoring)**:Lucene会根据查询和文档的相关性给出一个分数,决定搜索结果的排序。TF-IDF(Term Frequency-Inverse Document Frequency)是最常用的评分算法。 现在,我们详细讲解如何在Lucene中进行...
查询阶段,用户输入查询字符串,Lucene将这个字符串转换为查询对象,然后与索引进行匹配。查询操作通常包括以下步骤: - 查询分析(Query Parsing):将用户的输入转换为查询语法,可能涉及短语查询、布尔查询等。 ...
**Lucene Facet查询详解** Lucene是一款强大的全文搜索引擎库,广泛应用于各种信息检索系统。在处理大量数据时,为了帮助用户快速、有效地探索和理解数据,Lucene引入了Facets(方面)功能,它提供了分类浏览和统计...
5. **搜索(Search)**:Lucene 提供了查询解析器(QueryParser)和查询对象(Query)来构造搜索条件。用户可以使用布尔运算符、短语查询、范围查询等多种方式构建复杂的查询。 6. **排序与评分(Scoring)**:...
本文将深入探讨"Lucene5学习之分页查询"这一主题,结合给定的标签"源码"和"工具",我们将讨论如何在Lucene5中实现高效的分页查询,并探讨其背后的源码实现。 首先,理解分页查询的重要性是必要的。在大型数据集的...
在Eclipse环境中运用java,Lucene建索引及查询关键字