Lucene 自身内置了许多查询对象,常用的有TermQuery、TermRangeQuery、NumericRangeQuery、PrefixQuery、WildcardQuery、FuzzyQuery、BooleanQuery、PhraseQuery.它们分别提供了不同形式的查询方式.分别看一下它们是如何使用的:
创建一个测试索引
public static void index(boolean hasIndex) { int[] ids = {0,1,2,3,4,5}; String[] emails = {"lfd@foxmail.com","lfd@qq.com","lfx@qq.com","lfx@foxmail.com","hll@gcp.edu","zzp@gcp.edu"}; String[] contents = { "incididunt ut labore et dolore magna aliqua. Ut enim ad lorem. ", "Lorem ipsum dolor sit amet lorem consectetur adipisicing", "dolor in reprehenderit in voluptate velit esse cillum nostrud exercitation ullamco laboris. ", "dolor in reprehenderit in voluptate velit esse cillum nostrud exercitation ullamco laboris. ", "Lorem ipsum dolor sit amet, consectetur adipisicing elit", "Consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna " }; String[] names = {"zzp","lfd","lfx","tom","huanglili","tzp"}; IndexWriter writer = null ; Directory directory = null ; try { directory = FSDirectory.open(new File("D:/Lucene")) ; //directory = new RAMDirectory() ; //索引文件在内存 writer = new IndexWriter(directory, new IndexWriterConfig(Version.LUCENE_46, new StandardAnalyzer(Version.LUCENE_46))) ; //是否重新构建索引 if(hasIndex) { writer.deleteAll() ; } int count = names.length ; for(int i=0; i<count; i++) { Document doc = new Document() ; /* 首先是一个不变的属性值,这类字段还有一个主要用途, * 就是可以用于对搜索的返回结果集排序或是按范 * 围查询FloatField DoubleField IntField LongField BinaryDocValuesField NumericDocValuesField SortedDocValuesField SortedSetDocValuesField StoredField 整个域要存储的 StringField 是一个不需要分词,而直接用于索引的字符串 TextField 是一大块需要经过分词的文本 FieldType fieldType = new FieldType(); fieldType.setIndexed(true);//set 是否索引 fieldType.setStored(true);//set 是否存储 fieldType.setTokenized(false);//set 是否分词*/ doc.add(new IntField("id", ids[i], Store.YES)) ; doc.add(new StringField("email", emails[i], Store.YES)); doc.add(new TextField("content", contents[i], Store.YES)) ; FieldType type = new FieldType() ; type.setIndexed(true) ; type.setStored(true) ; doc.add(new Field("name", names[i], type)) ; writer.addDocument(doc) ; } writer.commit() ; } catch (IOException e) { e.printStackTrace(); } finally { try { if(writer != null) { writer.close() ; writer = null ; } } catch (IOException e) { e.printStackTrace(); } } }
为子方便,这里提取了一个方法获取IndexSearcher
private static IndexSearcher getSearcher(Directory directory) { try { if(reader == null) { reader = DirectoryReader.open(directory) ; } else { DirectoryReader ir = DirectoryReader.openIfChanged(reader) ; if(ir != null) { reader.close() ; reader = ir ; } } } catch (IOException e) { e.printStackTrace(); } IndexSearcher searcher = new IndexSearcher(reader) ; return searcher ; }
这里的openIfChanged方法:判断索引是否发生改变,如果发生变化则重新生成DirectoryReader.
TermQuery对象介绍:搜索指定Field中配置的内容.
public static void searcher01() { IndexSearcher searcher = getSearcher(directory) ; Query query = new TermQuery(new Term("content", "visited")) ; try { TopDocs topDocs = searcher.search(query, 10) ; ScoreDoc[] scores = topDocs.scoreDocs ; int length = scores.length ; for(int i=0; i<length; i++) { Document doc = searcher.doc(scores[i].doc) ; System.out.println("id:" + doc.get("id") + " email:" + doc.get("email") + " content:" + doc.get("content") + " name:" + doc.get("name")); } } catch (IOException e) { e.printStackTrace(); } }
new TermQuery(new Term("content", "visited")) ; 传入一个Term,搜索Field为"content"中含有"visited"的内容
TermRangeQuery对象介绍:搜索字符边界
public static void searcher02() { Query query = new TermRangeQuery("name", new BytesRef("a") , new BytesRef("i"), true, true) ; IndexSearcher searcher = getSearcher(directory) ; try { TopDocs docs = searcher.search(query, 100) ; ScoreDoc[] scores = docs.scoreDocs ; for(ScoreDoc score : scores) { Document doc = searcher.doc(score.doc) ; System.out.println("id:" + doc.get("id") + " email:" + doc.get("email") + " content:" + doc.get("content") + " name:" + doc.get("name")); } } catch (IOException e) { e.printStackTrace(); } }
new TermRangeQuery("name", new BytesRef("a") , new BytesRef("i"), true, true) ;搜索Field为"name",字符开头从a到i的内容.后边两个true分别表示是否包含开始字符,是否包含结束字符.
NumericRangeQuery对象介绍:搜索数字的开始和结束内容.
public static void searcher03() { Query query = NumericRangeQuery.newIntRange("id", 1, 4, true, true) ; IndexSearcher searcher = getSearcher(directory) ; try { TopDocs docs = searcher.search(query, 100) ; ScoreDoc[] scores = docs.scoreDocs ; for(ScoreDoc score : scores) { Document doc = searcher.doc(score.doc) ; System.out.println("id:" + doc.get("id") + " email:" + doc.get("email") + " content:" + doc.get("content") + " name:" + doc.get("name")); } } catch (IOException e) { e.printStackTrace(); } }
NumericRangeQuery.newIntRange("id", 1, 4, true, true) ;搜索Field为"id"标识从1到4的内容,后面两个true分别表示是否包含1,是否包含4
PrefixQuery查询对象:匹配单词的开始
//单词的开始 public static void searcher04() { Query query = new PrefixQuery(new Term("content", "in")) ; IndexSearcher searcher = getSearcher(directory) ; try { TopDocs docs = searcher.search(query, 100) ; ScoreDoc[] scores = docs.scoreDocs ; for(ScoreDoc score : scores) { Document doc = searcher.doc(score.doc) ; System.out.println("id:" + doc.get("id") + " email:" + doc.get("email") + " content:" + doc.get("content") + " name:" + doc.get("name")); } } catch (IOException e) { e.printStackTrace(); } }
new PrefixQuery(new Term("content", "in")) ; 搜索Fiild为"content"中单词开始为"in"的内容.
WildcardQuery查询对象:单词通配符搜索
public static void searcher05() { Query query = new WildcardQuery(new Term("content", "*tate")) ; IndexSearcher searcher = getSearcher(directory) ; try { TopDocs docs = searcher.search(query, 100) ; ScoreDoc[] scores = docs.scoreDocs ; for(ScoreDoc score : scores) { Document doc = searcher.doc(score.doc) ; System.out.println("id:" + doc.get("id") + " email:" + doc.get("email") + " content:" + doc.get("content") + " name:" + doc.get("name")); } } catch (IOException e) { e.printStackTrace(); } }
WildcardQuery(new Term("content", "*tate")."*"表示任意内容.即搜索Field为"content"中单词以tate结束的内容
FuzzyQuery查询对象:模糊匹配
相关推荐
总结来说,Lucene 4.6是搜索技术的重要里程碑,其强大的索引和查询能力、优化的性能以及丰富的社区支持,使其成为开发全局搜索应用的首选工具。在实际开发中,充分利用Lucene 4.6的功能,能够帮助我们构建出高效、...
《深入理解Lucene 4.6:索引构建、查询执行与近实时搜索》 Lucene是一个开源全文搜索引擎库,广泛应用于各种信息检索系统。在本文中,我们将深入探讨Lucene 4.6版本,包括如何创建索引、执行查询以及实现近实时搜索...
Lucene 4.6对查询执行的内部算法进行了优化,比如跳过、排序和缓存策略,这直接提升了查询速度和响应时间。同时,内存管理也得到了改进,减少了垃圾回收的压力。 6. **新API和接口**: 构造函数的变化是4.6版本的...
《Lucene4.6实战应用》一书主要探讨了Apache Lucene 4.6版本在实际项目中的应用和深入理解。Lucene是一个高性能、全文检索库,它为开发者提供了强大的文本搜索功能。作为开源项目,Lucene被广泛应用于各种信息检索...
18.lucene4.6索引的相关操作 19.lucene4.6的各种Query(1) 20.lucene4.6的各种Query(2) 21.lucene4.6的各种Query(3) 22.solr4.6的快速搭建 23.solr4.6索引的相关操作 24.solr4.6搜索的相关参数功能(1) 25.solr4.6搜索...
- 搜索:使用`IndexSearcher`执行查询,`QueryParser`解析用户输入的查询字符串,生成`Query`对象。`TopDocs`返回匹配的文档及其相关度信息。 - 高亮显示:为了增强用户体验,可以使用`Highlighter`高亮显示查询词...
Lucene是一套用于全文检索和搜寻的开源程式库,由Apache软件基金会支持和提供。Lucene提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻。 从之前发布其他chm文件下载用户的反映看,有不少朋友反映下载后...
整个项目的构建全部采用最新技术,包括但不限于以下技术:struts 2.3.16 +spring 4.0.1 +hibernate 4.3.1+jquery-easyui 1.3.5+lucene 4.6.0+solr 4.6.0+Heritrix1.14并对其做了二次封装。为了增进学员的理解,课程...
通过对Lucene 4.6源代码的研读,我们可以学习到如何构建高效的全文搜索引擎,如何处理复杂的查询表达式,以及如何优化搜索结果的相关性和性能。此外,还可以了解到软件设计模式、数据结构和算法在实际项目中的应用,...
在本篇文章中,我们将深入探讨如何在Lucene 4.6中实现自定义查询评分规则。此技术允许用户根据特定需求调整文档的相关性评分,从而更精确地满足搜索需求。 ### Lucene 4.6 自定义查询评分规则 #### 一、背景与概述...
1. **查询解析**:Lucene 4.6 支持更复杂的查询语法,包括短语查询、布尔查询和范围查询。 2. **分词器**:提供了多种分词器,如标准分词器(StandardAnalyzer),适用于大多数英文文本,以及中文分词器,如IK ...
在本主题中,我们将深入探讨如何使用Lucene进行创建、删除、修改和组合条件查询,以及如何实现类似MySQL中的LIKE、IN、OR和时间范围条件查询。 首先,**创建索引**是使用Lucene的第一步。创建索引涉及到读取数据源...
Lucene4.6版本,适用于Lucene的所有研究,以及中文分词功能
- **QueryParser**:将用户的非格式化查询转换为Query对象,支持自动分词和分析。 - **Hits**:存储查询结果的集合,按相关性排序,方便结果展示和处理。 5. **查询类型**: - **TermQuery**:是最基本的查询...
在本教程中,我们将深入探讨Lucene中的分组查询,这是一种强大的功能,允许我们对搜索结果进行分类或分组,从而提供更有结构化的展示。在"一步一步跟我学习lucene(12)---lucene搜索之分组处理group查询"中,我们将...
这个过程涉及到的关键知识点包括:Lucene.NET的安装与引用、索引的创建与更新、查询的构建与执行以及结果的处理。通过熟练掌握这些,你将能构建出强大的搜索系统,满足用户对快速、精准搜索的需求。
2. **查询解析**:Lucene提供了`QueryParser`类用于将用户输入的文本转换为查询对象。3.0.3版本中,你可以了解到标准查询解析器的工作原理,以及如何自定义查询解析规则。 3. **搜索执行**:通过`Searcher`类,你...