各种查询
方式一:使用QueryParser与查询语法。(会使用分词器)

MultiFieldQueryParser
查询字符串 ------------------------> Query对象

例如:
上海 AND 天气
上海 OR 天气
上海新闻 AND site:news.163.com
...

方式二:
直接创建Query的实例(子类的),不会使用分词器
new TermQuery(..);
new BooleanQuery(..);

package cn.itcast.i_query;

import java.util.ArrayList;
import java.util.List; import org.apache.lucene.document.Document;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.FuzzyQuery;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.MatchAllDocsQuery;
import org.apache.lucene.search.NumericRangeQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.search.WildcardQuery;
import org.apache.lucene.search.BooleanClause.Occur;
import org.junit.Test; import cn.itcast._domain.Article;
import cn.itcast._util.ArticleDocumentUtils;
import cn.itcast._util.LuceneUtils; public class TestApp { // 关键词查询
@Test
public void testTermQuery() {
// 对应的查询字符串为:title:lucene
TermQuery query = new TermQuery(new Term("title", "lucene"));
searchAndShowResult(query);
} // 通配符查询
// ? 表示一个任意字符
// * 表示0或多个任意字符
@Test
public void testWildcardQuery() {
// 对应的查询字符串为:title:lu*n?
// WildcardQuery query = new WildcardQuery(new Term("title", "lu*n?")); // 对应的查询字符串为:content:互?网
WildcardQuery query = new WildcardQuery(new Term("content", "互?网"));
searchAndShowResult(query);
} // 查询所有
@Test
public void testMatchAllDocsQuery() {
// 对应的查询字符串为:*:*
MatchAllDocsQuery query = new MatchAllDocsQuery();
searchAndShowResult(query);
} // 模糊查询
@Test
public void testFuzzyQuery() {
// 对应的查询字符串为:title:lucenX~0.9
// 第二个参数是最小相似度,表示有多少正确的就显示出来,比如0.9表示有90%正确的字符就会显示出来。
FuzzyQuery query = new FuzzyQuery(new Term("title", "lucenX"), 0.8F);
searchAndShowResult(query);
} // 范围查询
@Test
public void testNumericRangeQuery() {
// 对应的查询字符串为:id:[5 TO 15]
// NumericRangeQuery query = NumericRangeQuery.newIntRange("id", 5, 15, true, true); // 对应的查询字符串为:id:{5 TO 15}
// NumericRangeQuery query = NumericRangeQuery.newIntRange("id", 5, 15, false, false); // 对应的查询字符串为:id:[5 TO 15}
NumericRangeQuery query = NumericRangeQuery.newIntRange("id", 5, 15, true, false); searchAndShowResult(query);
} // 布尔查询
@Test
public void testBooleanQuery() {
BooleanQuery booleanQuery = new BooleanQuery();
// booleanQuery.add(query, Occur.MUST); // 必须满足
// booleanQuery.add(query, Occur.SHOULD); // 多个SHOULD一起用表示OR的关系
// booleanQuery.add(query, Occur.MUST_NOT); // 非 Query query1 = new TermQuery(new Term("title", "lucene"));
Query query2 = NumericRangeQuery.newIntRange("id", 5, 15, false, true); // // 对应的查询字符串为:+title:lucene +id:{5 TO 15]
// // 对应的查询字符串为(大写的AND):title:lucene AND id:{5 TO 15]
// booleanQuery.add(query1, Occur.MUST);
// booleanQuery.add(query2, Occur.MUST); // 对应的查询字符串为:title:lucene id:{5 TO 15]
// 对应的查询字符串为:title:lucene OR id:{5 TO 15]
// booleanQuery.add(query1, Occur.SHOULD);
// booleanQuery.add(query2, Occur.SHOULD); // 对应的查询字符串为:+title:lucene -id:{5 TO 15]
// 对应的查询字符串为:title:lucene (NOT id:{5 TO 15] )
booleanQuery.add(query1, Occur.MUST);
booleanQuery.add(query2, Occur.MUST_NOT); searchAndShowResult(booleanQuery);
} /**
* 测试搜索的工具方法
*
* @param query
*/
private void searchAndShowResult(Query query) {
try {
// // 准备查询条件
// String queryString = "content:lucene";
// // 1,把查询字符串转为Query对象(从title和content中查询)
// QueryParser queryParser = new MultiFieldQueryParser(Version.LUCENE_30, new String[] { "title", "content" }, LuceneUtils.getAnalyzer());
// Query query = queryParser.parse(queryString); System.out.println("---> // 对应的查询字符串为:" + query + "\n"); // 2,执行查询,得到中间结果
IndexSearcher indexSearcher = new IndexSearcher(LuceneUtils.getDirectory()); // 指定所用的索引库
TopDocs topDocs = indexSearcher.search(query, 100); // 最多返回前n条结果 // 3,处理结果
List<Article> list = new ArrayList<Article>();
for (int i = 0; i < topDocs.scoreDocs.length; i++) {
// 根据编号拿到Document数据
int docId = topDocs.scoreDocs[i].doc; // Document的内部编号
Document doc = indexSearcher.doc(docId);
// 把Document转为Article
Article article = ArticleDocumentUtils.documentToArticle(doc);
list.add(article);
}
indexSearcher.close(); // 显示结果
System.out.println("总结果数:" + list.size());
for (Article a : list) {
System.out.println("------------------------------");
System.out.println("id = " + a.getId());
System.out.println("title = " + a.getTitle());
System.out.println("content = " + a.getContent());
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}

更多查询说明:

1、Lucene实例(各种Query使用的例子)

2、lucene多种查询方式

3、Lucene开发实例(一般企业搜索平台完全够用全程)

lucene 查询的使用的更多相关文章

  1. Lucene 查询工具 LQT

    Lucene Query Tool (lqt) 是一个命令行工具用来执行 Lucene 查询并对结果进行格式化输出. 使用方法: 01 $ ./lqt 02 usage: LuceneQueryToo ...

  2. Lucene查询语法详解

    Lucene查询 Lucene查询语法以可读的方式书写,然后使用JavaCC进行词法转换,转换成机器可识别的查询. 下面着重介绍下Lucene支持的查询: Terms词语查询 词语搜索,支持 单词 和 ...

  3. Lucene查询条数限制

    运用Lucene进行索引,在查询的时候是有条数限制的 public virtual TopFieldDocs Search(Query query, Filter filter, int n, Sor ...

  4. lucene 查询+分页+排序

    lucene 查询+分页+排序 1.定义一个工厂类 LuceneFactory 1 import java.io.IOException; 2 3 import org.apache.lucene.a ...

  5. kibana使用(ELK)、Lucene 查询语法

    Lucene查询 Lucene查询语法以可读的方式书写,然后使用JavaCC进行词法转换,转换成机器可识别的查询. 下面着重介绍下Lucene支持的查询: Terms词语查询 词语搜索,支持 单词 和 ...

  6. Lucene 查询分页技术

    常用的Lucene查询代码如下所示,该代码的作用是将path路径下的所有索引信息返回 public String matchAll(String path) { try { Directory dir ...

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

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

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

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

  9. Lucene 查询原理 传统二级索引方案 倒排链合并 倒排索引 跳表 位图

    提问: 1.倒排索引与传统数据库的索引相比优势? 2.在lucene中如果想做范围查找,根据上面的FST模型可以看出来,需要遍历FST找到包含这个range的一个点然后进入对应的倒排链,然后进行求并集 ...

  10. ELK:kibana使用的lucene查询语法【转载】

    kibana在ELK阵营中用来查询展示数据 elasticsearch构建在Lucene之上,过滤器语法和Lucene相同 全文搜索 在搜索栏输入login,会返回所有字段值中包含login的文档 使 ...

随机推荐

  1. Javascript中typeof instanceof constructor的区别

    typeof typeof,是一个运算符,运算中需要一个操作数,运算的结果就是这个操作数的类型,运算的结果是一个字符串.他有一定的局限性,对于对象类型的值,只能得到一个object结果,却不能精确得到 ...

  2. 【Todo】单例模式各种实现方式及并发安全

    Java 40道面试题不错:http://www.tuicool.com/articles/VRVFZb 其中有一道题目: 单例模式的线程安全性 老生常谈的问题了,首先要说的是单例模式的线程安全意味着 ...

  3. IE6 + png24 透明图片(滤镜)

    IE6 + png24 透明图片(滤镜) .IE6png{_filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true ...

  4. mysql使用笔记(二)

    一.启动和关闭mysql服务 windows下 启动 (方法1)管理员权限进入cmd,执行 net start mysql (方法2)管理员权限进入cmd,执行 mysqld -uroot --con ...

  5. PC上安装多个操作系统

    目 录 第1章 绪论    1 1.1 目标    1 1.2 适宜的读者    1 第2章 制作启动U盘    2 2.1 初级安装    2 2.2 启动分析    3 2.3 高级安装    1 ...

  6. ajax中基本兼容各浏览器的XMLHttpRequest的创建

    function createXHR(){ var xhr = null; if(window.XMLHttpRequest){//判断当前浏览器是否支持XMLHttpRequest xhr = ne ...

  7. 当CanTK遇到PhoneGap

    有朋友问能不能在CanTK和AppBuilder开发的APP里发送UDP数据,HTML5里只能用HTTPS/HTTP/WebSocket几种通讯方式,要使用UDP需要通过phonegap打包成APK等 ...

  8. 学习ASP.NET之前,先了解它

    ASP.NET是一个使用HTML,CSS,JavaScript和服务器脚本构建的网页和网站的开发框架,不是一门编程语言. ASP.NET支持三种不同的开发模式:Web Pages(Web页面),MVC ...

  9. jqury.jqzoom插件--放大镜

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  10. [saiku] 集成单点登录

    思路: 自定义一个loginCallbackFilter用于单点登录成功后执行模拟用户认证授权登录的操作. 当授权成功后所有配置需要授权才能访问的url就再也不会被任何filter拦截,可随意访问了. ...