lucene 查询的使用
各种查询
方式一:使用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);
}
}
}
更多查询说明:
lucene 查询的使用的更多相关文章
- Lucene 查询工具 LQT
Lucene Query Tool (lqt) 是一个命令行工具用来执行 Lucene 查询并对结果进行格式化输出. 使用方法: 01 $ ./lqt 02 usage: LuceneQueryToo ...
- Lucene查询语法详解
Lucene查询 Lucene查询语法以可读的方式书写,然后使用JavaCC进行词法转换,转换成机器可识别的查询. 下面着重介绍下Lucene支持的查询: Terms词语查询 词语搜索,支持 单词 和 ...
- Lucene查询条数限制
运用Lucene进行索引,在查询的时候是有条数限制的 public virtual TopFieldDocs Search(Query query, Filter filter, int n, Sor ...
- lucene 查询+分页+排序
lucene 查询+分页+排序 1.定义一个工厂类 LuceneFactory 1 import java.io.IOException; 2 3 import org.apache.lucene.a ...
- kibana使用(ELK)、Lucene 查询语法
Lucene查询 Lucene查询语法以可读的方式书写,然后使用JavaCC进行词法转换,转换成机器可识别的查询. 下面着重介绍下Lucene支持的查询: Terms词语查询 词语搜索,支持 单词 和 ...
- Lucene 查询分页技术
常用的Lucene查询代码如下所示,该代码的作用是将path路径下的所有索引信息返回 public String matchAll(String path) { try { Directory dir ...
- query_string查询支持全部的Apache Lucene查询语法 低频词划分依据 模糊查询 Disjunction Max
3.3 基本查询3.3.1词条查询 词条查询是未经分析的,要跟索引文档中的词条完全匹配注意:在输入数据中,title字段含有Crime and Punishment,但我们使用小写开头的crime来搜 ...
- 基于Lucene查询原理分析Elasticsearch的性能
前言 Elasticsearch是一个很火的分布式搜索系统,提供了非常强大而且易用的查询和分析能力,包括全文索引.模糊查询.多条件组合查询.地理位置查询等等,而且具有一定的分析聚合能力.因为其查询场景 ...
- Lucene 查询原理 传统二级索引方案 倒排链合并 倒排索引 跳表 位图
提问: 1.倒排索引与传统数据库的索引相比优势? 2.在lucene中如果想做范围查找,根据上面的FST模型可以看出来,需要遍历FST找到包含这个range的一个点然后进入对应的倒排链,然后进行求并集 ...
- ELK:kibana使用的lucene查询语法【转载】
kibana在ELK阵营中用来查询展示数据 elasticsearch构建在Lucene之上,过滤器语法和Lucene相同 全文搜索 在搜索栏输入login,会返回所有字段值中包含login的文档 使 ...
随机推荐
- Linux用户查询
用户列表文件:/etc/passwd 用户组列表文件:/etc/group 查看系统中有哪些用户:cut -d : -f 1 /etc/passwd 查看可以登录系统的用户:cat /etc/pass ...
- 使用Mozilla Firefox插件RestClient测试Http API接口
RESTClient是Mozilla Firefox一个用于测试http请求插件.在火狐附加组件里面查询并安装,非常小巧,界面非常简单,使用非常的方便,看下面这张图你就全明白了,希望对新手有帮助! 1 ...
- jquery的tree table(树表)
因项目需要,需要在表格中加入tree,使用了jquery的tree table,经美化,完美兼容各种框架的table: 请移步下载tree table 的js文件及css文件等,http://ludo ...
- hiho_1057_performance_log
题目大意 给出一个函数调用日志,判断日志是否合法,且求出合法日志中函数调用的时间长度. 题目链接:performance log 题目分析 首先需要清除非法日志的几种情形: (1)日志的时间戳不是按照 ...
- js获取时间格式化
http://www.cnblogs.com/zhangpengshou/archive/2012/07/19/2599053.html
- 十问 Linux 虚拟内存管理 (glibc) (二)
版权声明:本文由陈福荣原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/184 来源:腾云阁 https://www.qclo ...
- Working with Data » Getting started with ASP.NET Core and Entity Framework Core using Visual Studio » 增、查、改、删操作
Create, Read, Update, and Delete operations¶ 5 of 5 people found this helpful By Tom Dykstra The Con ...
- maven工程打包成runnable的jar包,拷贝资源和依赖jar包
eclipse下新建maven工程,生成runnable的jar包.之前一直是手动拷贝依赖的jar包和资源文件,烦得要死.上网可劲查了一下.解决方案如下. 在pom的配置文件中做如下配置: <b ...
- ASP.NET MVC 5改进了基于过滤器的身份验证
ASP.NET MVC 5包含在最近发布的Visual Studio 2013开发者预览版中,它使开发人员可以应用身份验证过滤器,它们提供了使用各种第三方供应商或自定义的身份验证提供程序进行用户身份验 ...
- [HBuilder] 简介
官网首页: http://www.dcloud.io/runtime.html 特点: 编码比其他工具快5倍 代码输入法:按下数字快速选择候选项 可编程代码块:一个代码块,少敲50个按键 内置emme ...