PhraseQuery:短语查询,就是查询文档中是否包含指定的一个Term或多个Term,多个Term之间可以指定间隔即slop参数,官方API解释如图:
使用示例代码,如下:
package com.yida.framework.lucene5.query; import java.io.IOException; 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.TextField; import org.apache.lucene.index.DirectoryReader; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.IndexWriterConfig; import org.apache.lucene.index.IndexWriterConfig.OpenMode; import org.apache.lucene.index.Term; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.PhraseQuery; import org.apache.lucene.search.ScoreDoc; import org.apache.lucene.search.TopDocs; import org.apache.lucene.store.Directory; import org.apache.lucene.store.RAMDirectory; public class PhraseQueryTest { public static void main(String[] args) throws IOException { Directory dir = new RAMDirectory(); Analyzer analyzer = new StandardAnalyzer(); IndexWriterConfig iwc = new IndexWriterConfig(analyzer); iwc.setOpenMode(OpenMode.CREATE); IndexWriter writer = new IndexWriter(dir, iwc); Document doc = new Document(); doc.add(new TextField("text", "quick brown fox", Field.Store.YES)); writer.addDocument(doc); doc = new Document(); doc.add(new TextField("text", "jumps over lazy broun dog", Field.Store.YES)); writer.addDocument(doc); doc = new Document(); doc.add(new TextField("text", "jumps over extremely very lazy broxn dog", Field.Store.YES)); writer.addDocument(doc); writer.close(); IndexReader reader = DirectoryReader.open(dir); IndexSearcher searcher = new IndexSearcher(reader); String term1 = "dog"; String term2 = "jumps"; PhraseQuery phraseQuery = new PhraseQuery(); phraseQuery.add(new Term("text",term1)); phraseQuery.add(new Term("text",term2)); phraseQuery.setSlop(15); TopDocs results = searcher.search(phraseQuery, null, 100); ScoreDoc[] scoreDocs = results.scoreDocs; for (int i = 0; i < scoreDocs.length; ++i) { //System.out.println(searcher.explain(query, scoreDocs[i].doc)); int docID = scoreDocs[i].doc; Document document = searcher.doc(docID); String path = document.get("text"); System.out.println("text:" + path); } } }
pharseQuery.add(term),每次都是add到末尾,当然你也可以用add(term,position)明确指定add到哪个位置,示例代码中add了两个Term,则我们的查询短语是dog jumps,他们的间隔为0,然后我们设置slop值为5,
第2个索引文档里单词jumps往右移动5次刚好可以得到我们的查询短语dog jumps,因此它符合要求被返回了,而第1个索引文档直接不包含单词dog不符合要求,第3个索引文档需要移动7次才能得到dog jumps,所以最后返回的只有第2个索引文档。
如果我把代码变一下,改成这样:
String term1 = "dog"; String term2 = "jumps"; PhraseQuery phraseQuery = new PhraseQuery(); phraseQuery.add(new Term("text",term1),0); phraseQuery.add(new Term("text",term2),2); phraseQuery.setSlop(6); TopDocs results = searcher.search(phraseQuery, null, 100);
这时候我们的查询短语就是dog xxx jumps,意思就是我们要查询包含dog和jumps字符的文档而且dog和jumps之间要有一个字符间隔(不包含停用词),这时候我们的slop就要加1了,即我们需要再多移动一次,所以这次slop值应该为6.
PharseQuery下还有一个子类NGramPhraseQuery,这个子类涉及到N-Gram模型,算法之类的我就略过了。
如果你还有什么问题请加我Q-Q:7-3-6-0-3-1-3-0-5,
或者加裙
一起交流学习!
相关推荐
Lucene是一个功能强大的搜索引擎库,提供了多种查询方式,其中SpanQuery和PhraseQuery是两个重要的查询类型。本文将详细介绍SpanQuery和PhraseQuery的使用和区别。 一、SpanQuery SpanQuery是一个抽象类,提供了...
首先,短语搜索是Lucene中的一种高级查询类型,它允许用户搜索包含特定词汇顺序的短语。例如,如果用户想搜索"大数据分析",而不是仅仅搜索"大数据"或"分析",那么短语搜索就显得尤为重要,因为它可以排除掉那些词汇...
- **短语查询**:`PhraseQuery`查找文档中包含特定顺序词汇的短语。 - **模糊查询**:`FuzzyQuery`允许搜索近似匹配的词。 #### 3.3 QueryParser - 自动生成`Query`对象,支持多种匹配模式(AND、OR、NOT等)。 ##...
Lucene支持多种查询类型,如布尔查询、短语查询、范围查询等。 5. **评分(Scoring)**:Lucene会根据查询和文档的相关性给出一个分数,决定搜索结果的排序。TF-IDF(Term Frequency-Inverse Document Frequency)...
以上是对 Lucene 3.5 的学习笔记总结,涵盖了从索引构建到查询操作的基础和高级功能。通过深入理解这些概念和实践应用,可以帮助开发者更好地利用 Lucene 和 Solr 构建高效且功能强大的搜索应用。
《Lucene开发指南》是一份综合性的学习资料,旨在帮助开发者深入理解和熟练运用Apache Lucene这一强大的全文搜索引擎库。Lucene是Java语言实现的开源项目,广泛应用于信息检索、数据分析和大数据处理等领域。本指南...
Lucene提供了多种查询类型,如TermQuery、PhraseQuery、WildcardQuery等,可以根据需求选择合适的查询方式。接着,使用`IndexSearcher`执行查询,并通过`TopDocs`获取排名最高的搜索结果。 **4. 高级搜索特性** ...
此外,还可以使用PhraseQuery或MultiFieldQueryParser来跨多个字段执行短语查询。 除了基础查询,Lucene还支持更复杂的表达式,例如使用FunctionQuery进行基于文档属性的排序,或者使用CustomScoreQuery自定义评分...
标题:Lucene学习笔记 描述:Lucene学习笔记,Lucene入门必备材料 知识点: 一、Lucene概述与文档管理策略 Lucene是一款高性能、全功能的文本搜索引擎库,广泛应用于文档检索、全文搜索等场景。为了提升搜索效率...
3. **查询解析与执行**:用户输入的查询字符串会被解析成查询对象,Lucene提供多种查询类型,如布尔查询(BooleanQuery)、短语查询(PhraseQuery)和模糊查询(FuzzyQuery)。查询执行过程中,Lucene会根据倒排索引...
3. **查询类型**:Lucene支持多种查询类型,包括布尔查询(BooleanQuery)、短语查询(PhraseQuery)、范围查询(RangeQuery)等,可以根据实际需求构造复杂的查询表达式。 4. **排序与评分**:Lucene不仅可以找到...
2. **查询优化**: 使用过滤器(Filter)、布尔查询(BooleanQuery)和短语查询(PhraseQuery)等提高查询效率。 3. **缓存策略**: 利用Lucene的缓存机制,如BitSetDocValues缓存,提升搜索速度。 4. **结果相关性*...
2. **查询处理**:Lucene支持多种查询类型,如布尔查询、短语查询、模糊查询、范围查询等。用户可以通过QueryParser类来构建复杂的查询表达式,3.6.0版本对查询语法进行了优化,提升了查询性能。 3. **分析器...
TermQuery匹配单个词项,PhraseQuery用于短语匹配,BooleanQuery可以组合多个查询条件。查询执行后,通过Scorer和Collector进行文档评分和收集,决定哪些文档应该返回给用户。 5. **高级特性** Lucene还提供了高级...
- **查询(Query)**:Lucene 支持多种查询类型,包括 TermQuery、PhraseQuery、BooleanQuery 等。用户可以通过 `QueryParser` 创建查询对象,或者直接构造 `Query` 对象。 - **搜索(Search)**:使用 `...
4. **查询与排序**:Lucene支持多种查询类型,如标准查询解析器(StandardQueryParser)、短语查询(PhraseQuery)、范围查询(RangeQuery)等。同时,我们还可以使用评分函数(ScoreFunction)和自定义比较器...
Lucene 3.6.1是其历史版本之一,虽然现在有更新的版本,但3.6.1仍具有重要的学习价值,尤其对于那些需要维护旧系统的开发者来说。本文将围绕Lucene 3.6.1的API进行详细解析,帮助读者深入理解其核心概念和功能。 ...
此外,还可以手动构造复杂的查询,如布尔查询、短语查询、范围查询等,通过`BooleanQuery`, `TermQuery`, `PhraseQuery`等类实现。 5. **搜索过程**:`Searcher`类负责执行搜索操作,其中`IndexSearcher`是最常用的...
Query对象包括TermQuery(单个词元查询)、BooleanQuery(布尔组合查询)、PhraseQuery(短语查询)等,它们在查询过程中扮演重要角色。 7. **过滤器与高亮显示**:Filter可以限制搜索结果,如通过TermFilter筛选...
最后,Lucene 2.4.0还支持多种高级特性,如命中高亮(Highlighting)、近似搜索(Fuzzy Search)、短语查询(Phrase Query)和多字段搜索。这些功能通过`Highlighter`、`FuzzyQuery`、`PhraseQuery`等类实现,极大地...