`
lxwt909
  • 浏览: 572798 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Lucene5学习之PhraseQuery短语查询

阅读更多

    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,

或者加裙
一起交流学习!

  • 大小: 84.1 KB
分享到:
评论

相关推荐

    lucene中的SpanQuery和PhraseQuery详解(有图示)

    Lucene是一个功能强大的搜索引擎库,提供了多种查询方式,其中SpanQuery和PhraseQuery是两个重要的查询类型。本文将详细介绍SpanQuery和PhraseQuery的使用和区别。 一、SpanQuery SpanQuery是一个抽象类,提供了...

    Lucene 搜索方法(短语搜索)

    首先,短语搜索是Lucene中的一种高级查询类型,它允许用户搜索包含特定词汇顺序的短语。例如,如果用户想搜索"大数据分析",而不是仅仅搜索"大数据"或"分析",那么短语搜索就显得尤为重要,因为它可以排除掉那些词汇...

    Lucene 3.6 学习笔记

    - **短语查询**:`PhraseQuery`查找文档中包含特定顺序词汇的短语。 - **模糊查询**:`FuzzyQuery`允许搜索近似匹配的词。 #### 3.3 QueryParser - 自动生成`Query`对象,支持多种匹配模式(AND、OR、NOT等)。 ##...

    Lucene分词与查询详解

    Lucene支持多种查询类型,如布尔查询、短语查询、范围查询等。 5. **评分(Scoring)**:Lucene会根据查询和文档的相关性给出一个分数,决定搜索结果的排序。TF-IDF(Term Frequency-Inverse Document Frequency)...

    lucene3.5学习笔记

    以上是对 Lucene 3.5 的学习笔记总结,涵盖了从索引构建到查询操作的基础和高级功能。通过深入理解这些概念和实践应用,可以帮助开发者更好地利用 Lucene 和 Solr 构建高效且功能强大的搜索应用。

    Lucene开发指南

    《Lucene开发指南》是一份综合性的学习资料,旨在帮助开发者深入理解和熟练运用Apache Lucene这一强大的全文搜索引擎库。Lucene是Java语言实现的开源项目,广泛应用于信息检索、数据分析和大数据处理等领域。本指南...

    lucene实现企业产品检索

    Lucene提供了多种查询类型,如TermQuery、PhraseQuery、WildcardQuery等,可以根据需求选择合适的查询方式。接着,使用`IndexSearcher`执行查询,并通过`TopDocs`获取排名最高的搜索结果。 **4. 高级搜索特性** ...

    lucene高级智能查询小案例

    此外,还可以使用PhraseQuery或MultiFieldQueryParser来跨多个字段执行短语查询。 除了基础查询,Lucene还支持更复杂的表达式,例如使用FunctionQuery进行基于文档属性的排序,或者使用CustomScoreQuery自定义评分...

    lucene学习笔记

    标题:Lucene学习笔记 描述:Lucene学习笔记,Lucene入门必备材料 知识点: 一、Lucene概述与文档管理策略 Lucene是一款高性能、全功能的文本搜索引擎库,广泛应用于文档检索、全文搜索等场景。为了提升搜索效率...

    Lucene视频教程_讲解部分源码

    3. **查询解析与执行**:用户输入的查询字符串会被解析成查询对象,Lucene提供多种查询类型,如布尔查询(BooleanQuery)、短语查询(PhraseQuery)和模糊查询(FuzzyQuery)。查询执行过程中,Lucene会根据倒排索引...

    简单的lucene demo

    3. **查询类型**:Lucene支持多种查询类型,包括布尔查询(BooleanQuery)、短语查询(PhraseQuery)、范围查询(RangeQuery)等,可以根据实际需求构造复杂的查询表达式。 4. **排序与评分**:Lucene不仅可以找到...

    lucene站内搜索

    2. **查询优化**: 使用过滤器(Filter)、布尔查询(BooleanQuery)和短语查询(PhraseQuery)等提高查询效率。 3. **缓存策略**: 利用Lucene的缓存机制,如BitSetDocValues缓存,提升搜索速度。 4. **结果相关性*...

    lucene-3.6.0

    2. **查询处理**:Lucene支持多种查询类型,如布尔查询、短语查询、模糊查询、范围查询等。用户可以通过QueryParser类来构建复杂的查询表达式,3.6.0版本对查询语法进行了优化,提升了查询性能。 3. **分析器...

    lucene-4.6.0官方文档

    TermQuery匹配单个词项,PhraseQuery用于短语匹配,BooleanQuery可以组合多个查询条件。查询执行后,通过Scorer和Collector进行文档评分和收集,决定哪些文档应该返回给用户。 5. **高级特性** Lucene还提供了高级...

    lucene-初级学习资料.ppt

    - **查询(Query)**:Lucene 支持多种查询类型,包括 TermQuery、PhraseQuery、BooleanQuery 等。用户可以通过 `QueryParser` 创建查询对象,或者直接构造 `Query` 对象。 - **搜索(Search)**:使用 `...

    基于lucene的开发JavaEE项目

    4. **查询与排序**:Lucene支持多种查询类型,如标准查询解析器(StandardQueryParser)、短语查询(PhraseQuery)、范围查询(RangeQuery)等。同时,我们还可以使用评分函数(ScoreFunction)和自定义比较器...

    lucene_3.6.1_API

    Lucene 3.6.1是其历史版本之一,虽然现在有更新的版本,但3.6.1仍具有重要的学习价值,尤其对于那些需要维护旧系统的开发者来说。本文将围绕Lucene 3.6.1的API进行详细解析,帮助读者深入理解其核心概念和功能。 ...

    Lucene3.0.1 官方api

    此外,还可以手动构造复杂的查询,如布尔查询、短语查询、范围查询等,通过`BooleanQuery`, `TermQuery`, `PhraseQuery`等类实现。 5. **搜索过程**:`Searcher`类负责执行搜索操作,其中`IndexSearcher`是最常用的...

    lucene5.5.0源码

    Query对象包括TermQuery(单个词元查询)、BooleanQuery(布尔组合查询)、PhraseQuery(短语查询)等,它们在查询过程中扮演重要角色。 7. **过滤器与高亮显示**:Filter可以限制搜索结果,如通过TermFilter筛选...

    lucene-2.4.0-src.zip

    最后,Lucene 2.4.0还支持多种高级特性,如命中高亮(Highlighting)、近似搜索(Fuzzy Search)、短语查询(Phrase Query)和多字段搜索。这些功能通过`Highlighter`、`FuzzyQuery`、`PhraseQuery`等类实现,极大地...

Global site tag (gtag.js) - Google Analytics