TermQuery是最简单、也是最常用的Query。TermQuery可以理解成为“词条搜索”,在搜索引擎中最基本的搜索就是在索引中搜索某一词条,而TermQuery就是用来完成这项工作的。

  在Lucene中词条是最基本的搜索单位,从本质上来讲一个词条其实就是一个名/值对。只不过这个“名”是字段名,而“值”则表示字段中所包含的某个关键字。

  TermQuery是lucene查询中最基本的一种原子查询,从它的名字Term我们可以看出,它只能针对一个字段进行查询。

例:

@Test
public void  testGovenQuery(){
    try {
        String  keyword="java";
        Directory dic=new SimpleFSDirectory(new File("x:xxx"));
        IndexSearcher searcher=new IndexSearcher(dic);
        //------------TermQuery  单个关键字查询
        Query query=new TermQuery(new Term("contents",keyword));
        TopDocs tops=searcher.search(query, 10);
        System.out.println(tops.totalHits);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
};

讲解

要使用TermQuery进行搜索首先需要构造一个Term对象,示例代码如下:

Term aTerm = new Term("contents", "java");

然后使用aTerm对象为参数来构造一个TermQuery对象,代码设置如下:

Query query = new TermQuery(aTerm);

这样所有在“contents”字段中包含有“java”的文档都会在使用TermQuery进行查询时作为符合查询条件的结果返回。

package ch11;

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TermQuery; public class TermQueryTest { public static void main(String[] args) throws Exception { // 生成Document对象 Document doc1 = new Document(); // 添加“name”字段的内容 doc1.add(Field.Text("name", "word1 word2 word3")); // 添加“title”字段的内容 doc1.add(Field.Keyword("title", "doc1")); // 生成索引书写器 IndexWriter writer = new IndexWriter("c://index",
new StandardAnalyzer(), true); // 将文档添加到索引中 writer.addDocument(doc1); // 关闭索引 writer.close(); // 生成查询对象query Query query = null; // 生成hits结果对象,保存返回的检索结果 Hits hits = null; // 生成检索器 IndexSearcher searcher = new IndexSearcher("c://index"); // 构造一个TermQuery对象 query = new TermQuery(new Term("name", "word1")); // 开始检索,并返回检索结果到hits中 hits = searcher.search(query); // 输出检索结果中的相关信息 printResult(hits, "word1"); // 再次构造一个TermQuery对象,只不过查询的字段变成了"title" query = new TermQuery(new Term("title", "doc1")); // 开始第二次检索,并返回检索结果到hits中 hits = searcher.search(query); // 输出检索结果中的相关信息 printResult(hits, "doc1"); } public static void printResult(Hits hits, String key) throws Exception { System.out.println("查找 /"" + key + "/" :"); if (hits != null) { if (hits.length() == 0) { System.out.println("没有找到任何结果"); } else { System.out.println("找到" + hits.length() + "个结果"); for (int i = 0; i < hits.length(); i++) { Document d = hits.doc(i); String dname = d.get("title"); System.out.print(dname + " "); } System.out.println(); System.out.println(); } } }
}

注意:字段值是区分大小写的,因此在查询时必须注意大小写的匹配。

在代码中通过构建TermQuery的对象,两次完成了对关键字的查找。两次查找过程中不同的是,第一次构建的TermQuery是查找“name”这个字段,而第二次构建的TermQuery则查找的是“title”这个字段。

lucene-查询query->TermQuery按词条搜索的更多相关文章

  1. Lucene 查询(Query)子类

    QueryParser(单域查询) QueryParser子类对单个域查询时创建查询query,构造方法中需要传入Lucene版本号,检索域名和分词器. QueryParser parser = ne ...

  2. Lucene 查询方式

    QueryParser类 QueryParser类对输入字符串的解析 格    式 含    义 “David” 在默认的字段中检索“David”关键字 “content:David” 在“conte ...

  3. 基于Lucene查询原理分析Elasticsearch的性能

    前言 Elasticsearch是一个很火的分布式搜索系统,提供了非常强大而且易用的查询和分析能力,包括全文索引.模糊查询.多条件组合查询.地理位置查询等等,而且具有一定的分析聚合能力.因为其查询场景 ...

  4. lucene 查询的使用

    各种查询方式一:使用QueryParser与查询语法.(会使用分词器) MultiFieldQueryParser查询字符串 ------------------------> Query对象 ...

  5. lucene 查询 (转载)

    原网址:http://hi.baidu.com/lszhuhaichao/blog/item/ccffc7cb858f1514bf09e66f.html Lucene3.0之查询处理(1):原理201 ...

  6. lucene查询索引库、分页、过滤、排序、高亮

    2.查询索引库 插入测试数据 xx.xx. index. ArticleIndex @Test public void testCreateIndexBatch() throws Exception{ ...

  7. query_string查询支持全部的Apache Lucene查询语法 低频词划分依据 模糊查询 Disjunction Max

    3.3 基本查询3.3.1词条查询 词条查询是未经分析的,要跟索引文档中的词条完全匹配注意:在输入数据中,title字段含有Crime and Punishment,但我们使用小写开头的crime来搜 ...

  8. lucene查询解析器语法

    注意:使用QueryParser查询,关键词是会被分词的,如果不需要分词,可以选择使用Lucene提供的API查询类. Lucene提供了丰富的API来组合定制你所需要的查询器,同时也可以利用Quer ...

  9. 使用 Apache Lucene 和 Solr 4 实现下一代搜索和分析

    使用 Apache Lucene 和 Solr 4 实现下一代搜索和分析 使用搜索引擎计数构建快速.高效和可扩展的数据驱动应用程序 Apache Lucene™ 和 Solr™ 是强大的开源搜索技术, ...

随机推荐

  1. Unity 5 WebGL vs Web Player

    起原 Unity5.3中看到Web Player未来将到被取消,根据Unity官方blog中称Unity5.4中将会移除web player. 本文从我知道的知识比较一下webPlayer和WebGL ...

  2. Unity 5.3 安装完没有Android(安卓)或IOS Module(模块)?

    Unity5.3 模块独立 Unity5.3把各个模块分开来了,主程序安装包更轻巧,在官网下载的话,能下载到 Unity安装程序,Unity编辑器等一些资源package,其它的模块可以通过Unity ...

  3. IOS第五课——Gesture and TableView

    这一次我们要学习Gesture.TableView.AlertView三种技术. 一.Gesture 在iOS中,可以使用系统内置的手势识别(GestureRecognizer),也可以创建自己的手势 ...

  4. 集合中Set接口与Collection接口,常用子类TreeSet,HashSet.

    Set接口与List接口的不同之处在于: 不允许有重复的数据. 定义如下: public interface Set<E>extends Collection<E> 主要方法与 ...

  5. HTML 学习笔记 CSS3 (2D转换)

    2.scaleX(<number>) : 使用 [sx,1] 缩放矢量执行缩放操作,sx为所需参数.scaleX表示元素只在X轴(水平方向)缩放元素,他的默认值是(1,1),其基点一样是在 ...

  6. js的client详解

    clientWidth:可视区宽       说明:样式宽+padding clientHeight:可视区高       说明:样式高+padding elem.clientWidth //获取元素 ...

  7. html5游戏-包围盒检测算法

    矩形包围盒算法:检测2个矩形是否重叠,在这样情况下要判断2个矩形是否碰撞只需要比较两个矩形顶点的坐标即可.假设矩形A用(x1,y1)表示左上角,(x2,y2)表示右下角,矩形B用(x3,y3)表示左上 ...

  8. toodifficult 题解

    名字听起来十分厉害啊...一道lzz的提交答案题. 提答题,我们看看题目,给出一个解密程序,叫你加密. 每个点有一个加密的sample和一些要加密的文本. 从题目中我们可以得到一些信息: 加密后一般为 ...

  9. Web安全测试之跨站请求伪造(CSRF)篇

    跨站请求伪造(即CSRF)被Web安全界称为诸多漏洞中“沉睡的巨人”,其威胁程度由此“美誉”便可见一斑.本文将简单介绍该漏洞,并详细说明造成这种漏洞的原因所在,以及针对该漏洞的黑盒测试与灰盒子测试具体 ...

  10. JavaScript继承与原型链

    对于那些熟悉基于类的面向对象语言(Java 或者 C++)的开发者来说,JavaScript 的语法是比较怪异的,这是由于 JavaScript 是一门动态语言,而且它没有类的概念( ES6 新增了c ...