Lucene查询

基本查询:

    @Test
public void baseQuery() throws Exception {
//1. 创建查询的核心对象
FSDirectory d = FSDirectory.open(new File("H:\\test"));
IndexReader reader = DirectoryReader.open(d);
IndexSearcher indexSearcher = new IndexSearcher(reader); //2. 执行查询
QueryParser queryParser = new QueryParser("content", new IKAnalyzer());
Query query = queryParser.parse("剑来");
TopDocs topDocs = indexSearcher.search(query, 10); //3. 获取文档id
ScoreDoc[] scoreDocs = topDocs.scoreDocs; //获取得分文档集合
for (ScoreDoc scoreDoc : scoreDocs) {
int id = scoreDoc.doc;//获取文档id
float score = scoreDoc.score;// 返回此文档的匹配度 Document doc = indexSearcher.doc(id);
String docId = doc.get("id");
String content = doc.get("content");
System.out.println(docId + " " + content + " " + "匹配度:" + score);
}
}

多样化查询:

    //提取一个查询的方法
public void query(Query query) throws Exception { //1. 创建 查询的核心对象
IndexReader reader = DirectoryReader.open(FSDirectory.open(new File("H:\\test")));
IndexSearcher indexSearcher = new IndexSearcher(reader); //3. 执行查询
TopDocs topDocs = indexSearcher.search(query, 10); ScoreDoc[] scoreDocs = topDocs.scoreDocs;//获取得分文档的集合
for (ScoreDoc scoreDoc : scoreDocs) {
//获取文档id
int docId = scoreDoc.doc;
//获取文档得分
float score = scoreDoc.score;
//根据id获取文档
Document doc = indexSearcher.doc(docId);
String content = doc.get("content");
String title = doc.get("title");
System.out.println("匹配度:" + score + content + " " + title); }
} // 词条查询
@Test
public void termQuery() throws Exception {
//创建词条对象
//注意: 词条是不可在分割的, 词条可以是一个字, 也可以是一句话
//使用场景: 主要是针对的是不可在分割的字段, 例如id
//由于其不可再分, 可以搜索 全文, 但是不能搜索 全文检索
TermQuery termQuery = new TermQuery(new Term("content", "全文"));
query(termQuery);
} // 通配符查询
@Test
public void wildcardQuery() throws Exception { //通配符:
//*: 代表多个字符
//?: 代表一个占位符
WildcardQuery wildcardQuery = new WildcardQuery(new Term("content", "?uce*"));
query(wildcardQuery); } //模糊查询
@Test
public void fuzzQuery() throws Exception {
/**
* 模糊查询:
* 指的是通过替换, 补位, 移动 能够在二次切换内查询数据即可返回
* 参数1: term 指定查询的字段和内容
* 参数2: int n 表示最大编辑的次数 最大2
*
*/
FuzzyQuery fuzzyQuery = new FuzzyQuery(new Term("content", "lucene"), 1);
query(fuzzyQuery);
} // 数值范围查询
@Test
public void numericRangeQuery() throws Exception {
/**
* 获取NumericRangeQuery的方式:
* 通过提供的静态方法获取:
* NumericRangeQuery.newIntRange()
* NumericRangeQuery.newFloatRange()
* NumericRangeQuery.newDoubleRange()
* NumericRangeQuery.newLongRange()
*
*
* 数值范围查询:
* 参数1: 指定要查询的字段
* 参数2: 指定要查询的开始值
* 参数3: 指定要查询的结束值
* 参数4: 是否包含开始
* 参数5: 是否包含结束
*/ NumericRangeQuery numericRangeQuery = NumericRangeQuery.newIntRange("id", 2, 4, false, false);
query(numericRangeQuery);
} // 组合查询
@Test
public void testBooleanQuery() throws Exception { Query query1 = NumericRangeQuery.newLongRange("id", 2l, 4l, true, true);
Query query2 = NumericRangeQuery.newLongRange("id", 0l, 3l, true, true); // boolean查询本身没有查询条件,它可以组合其他查询
BooleanQuery query = new BooleanQuery();
// 交集: Occur.MUST + Occur.MUST
// 并集:Occur.SHOULD + Occur.SHOULD
// 非:Occur.MUST_NOT
query.add(query1, BooleanClause.Occur.SHOULD);
query.add(query2, BooleanClause.Occur.SHOULD); query(query);
}

Lucene高级内容:

高亮:

    // 高亮显示
@Test
public void testHighlighter() throws Exception {
// 目录对象
Directory directory = FSDirectory.open(new File("H:\\test"));
// 创建读取工具
IndexReader reader = DirectoryReader.open(directory);
// 创建搜索工具
IndexSearcher searcher = new IndexSearcher(reader); QueryParser parser = new QueryParser("title", new IKAnalyzer());
Query query = parser.parse("谷歌地图"); // 格式化器
Formatter formatter = new SimpleHTMLFormatter("<em>", "</em>");
Scorer scorer = new QueryScorer(query);
// 准备高亮工具
Highlighter highlighter = new Highlighter(formatter, scorer);
// 搜索
TopDocs topDocs = searcher.search(query, 10);
System.out.println("本次搜索共" + topDocs.totalHits + "条数据"); ScoreDoc[] scoreDocs = topDocs.scoreDocs;
for (ScoreDoc scoreDoc : scoreDocs) {
// 获取文档编号
int docID = scoreDoc.doc;
Document doc = reader.document(docID);
System.out.println("id: " + doc.get("id")); String title = doc.get("title");
// 用高亮工具处理普通的查询结果,参数:分词器,要高亮的字段的名称,高亮字段的原始值
String hTitle = highlighter.getBestFragment(new IKAnalyzer(), "title", title); System.out.println("title: " + hTitle);
// 获取文档的匹配度
System.out.println("匹配度:" + scoreDoc.score);
}
}

排序:

    // 排序
@Test
public void testSortQuery() throws Exception {
// 目录对象
Directory directory = FSDirectory.open(new File("H:\\test"));
// 创建读取工具
IndexReader reader = DirectoryReader.open(directory);
// 创建搜索工具
IndexSearcher searcher = new IndexSearcher(reader); QueryParser parser = new QueryParser("title", new IKAnalyzer());
Query query = parser.parse("谷歌地图"); // 创建排序对象,需要排序字段SortField,参数:字段的名称、字段的类型、是否反转如果是false,升序。true降序
Sort sort = new Sort(new SortField("id", Type.LONG, true));
// 搜索
TopDocs topDocs = searcher.search(query, 10,sort);
System.out.println("本次搜索共" + topDocs.totalHits + "条数据"); ScoreDoc[] scoreDocs = topDocs.scoreDocs;
for (ScoreDoc scoreDoc : scoreDocs) {
// 获取文档编号
int docID = scoreDoc.doc;
Document doc = reader.document(docID);
System.out.println("id: " + doc.get("id"));
System.out.println("title: " + doc.get("title"));
}
}

分页:

    @Test
public void testPageQuery() throws Exception {
// 实际上Lucene本身不支持分页。因此我们需要自己进行逻辑分页。我们要准备分页参数:
int pageSize = 2;// 每页条数
int pageNum = 3;// 当前页码
int start = (pageNum - 1) * pageSize;// 当前页的起始条数
int end = start + pageSize;// 当前页的结束条数(不能包含) // 目录对象
Directory directory = FSDirectory.open(new File("H:\\test"));
// 创建读取工具
IndexReader reader = DirectoryReader.open(directory);
// 创建搜索工具
IndexSearcher searcher = new IndexSearcher(reader); QueryParser parser = new QueryParser("title", new IKAnalyzer());
Query query = parser.parse("谷歌地图"); // 创建排序对象,需要排序字段SortField,参数:字段的名称、字段的类型、是否反转如果是false,升序。true降序
Sort sort = new Sort(new SortField("id", Type.LONG, false));
// 搜索数据,查询0~end条
TopDocs topDocs = searcher.search(query, end,sort);
System.out.println("本次搜索共" + topDocs.totalHits + "条数据"); ScoreDoc[] scoreDocs = topDocs.scoreDocs;
for (int i = start; i < end; i++) {
ScoreDoc scoreDoc = scoreDocs[i];
// 获取文档编号
int docID = scoreDoc.doc;
Document doc = reader.document(docID);
System.out.println("id: " + doc.get("id"));
System.out.println("title: " + doc.get("title"));
}
}

加权因子:

  • Lucene会对搜索的结果的匹配度进行一个加分, 用来表示数据和词条关联性的强弱, 得分越高, 表示匹配度越高, 排名越靠前

  • Lucene支持对某一个字段设置加权因子, 来提高其打分, 使其排名更加靠前, 这样当用户搜索的时候, 便可以将此词条对应的文档展示在最前面

TextField textField = new TextField("content","lucene加权因子", Store.YES);
textField.setBoost(10);

Lucene的查询及高级内容的更多相关文章

  1. 全文检索Lucene框架---查询索引

    一. Lucene索引库查询 对要搜索的信息创建Query查询对象,Lucene会根据Query查询对象生成最终的查询语法,类似关系数据库Sql语法一样Lucene也有自己的查询语法,比如:“name ...

  2. Lucene学习总结之八:Lucene的查询语法,JavaCC及QueryParser

    一.Lucene的查询语法 Lucene所支持的查询语法可见http://lucene.apache.org/java/3_0_1/queryparsersyntax.html (1) 语法关键字 + ...

  3. Hibernate Search集与lucene分词查询

    lucene分词查询参考信息:https://blog.csdn.net/dm_vincent/article/details/40707857

  4. Lucene的查询语法,JavaCC及QueryParser(1)

    http://www.cnblogs.com/forfuture1978/archive/2010/05/08/1730200.html 一.Lucene的查询语法 Lucene所支持的查询语法可见h ...

  5. Centos中查询目录中内容命名ls

    首先解释下这块, root代表当前登录用户,localhost代表主机名, ~代表当前主机目录,  #代表用户权限   #表示超级用户,$表示普通用户: 查询目录中内容命令 ls  (list缩写) ...

  6. Centos中查询目录中内容命名ls(六)

    首先解释下这块, root代表当前登录用户,localhost代表主机名, ~代表当前主机目录,#代表用户权限 #表示超级用户,$表示普通用户: 查询目录中内容命令 ls  (list缩写) 格式 l ...

  7. Lucene学习总结之八:Lucene的查询语法,JavaCC及QueryParser 2014-06-25 14:25 722人阅读 评论(1) 收藏

    一.Lucene的查询语法 Lucene所支持的查询语法可见http://lucene.apache.org/java/3_0_1/queryparsersyntax.html (1) 语法关键字 + ...

  8. (四)Centos之查询目录中内容命名ls

    一.查询目录中内容命名ls 1.1 root代表当前登录用户,localhost代表主机名, ~代表当前主机目录,#代表用户权限 #表示超级用户,$表示普通用户: 1.2 查询目录中内容命令 ls   ...

  9. mybatis关联查询基础----高级映射

    本文链接地址:mybatis关联查询基础----高级映射(一对一,一对多,多对多) 前言: 今日在工作中遇到了一个一对多分页查询的问题,主表一条记录对应关联表四条记录,关联分页查询后每页只显示三条记录 ...

随机推荐

  1. exec 和 exec_

    exec_ 是six里面针对py2 , py3 兼容,  而做的重新定义.  和 exec 功能一样. 关键一点是:   exec 是一个语法声明,不是一个函数.  也就是说和if,for一样. ex ...

  2. 看了redis想一下

    redis总结 要想在python中使用redis,要先在本地安装redis,并开启redis-server,然后再导入python的redis包,pip install redis 怎么在Linux ...

  3. VLOOKUP函数使用

    跟财务老婆学习了个excel函数 -- vlookup函数,记录一下,省得下次用忘了. 需求:有两张表,将第一张表的第二个字段g2去搜索第二张表的字段d2,如果相等,将第二张表的第三个字段追加到第一张 ...

  4. Python学习总结之一 -- 基础篇

    Python学习第一篇 一:写在前面 啊,最近我的新博客一直都没有更新学习内容了,只是最近一直都在忙着寻找实习机会(或许这只是一个借口,真实原因是我太懒惰了,改改改!).终于今天又投递了几个新的实习职 ...

  5. websphere删除概要文件(profiles)的方式

    [b]删除概要文件:[/b]方案一:1.找到profileRegistry.xml,在目录IBM\WebSphere\AppServer\properties里,去掉想删除的profile的配置即可. ...

  6. 手动封装OpenCV1.0的IplImage读取保存功能遇到的小问题

    最近准备重新学习图像处理的知识,主要目的是自己实现一遍图像处理的算法,所以除了读取.保存图像外的操作都自己写,没想到直接封装OpenCV的读取.保存功能的第一步就出错.关键代码如下 void MyIm ...

  7. GOF23设计模式之责任链模式(chain of responsibility)

    一.责任链模式概述 将能够处理同一类请求的对象连成一条链,所提交的请求沿着链传递,链上的对象逐个判断是否有能力处理该请求. 如果能则处理,否则传递给链上的下一个对象去处理. 定义责任链 (1)通过链表 ...

  8. mysql命令之二:查看mysql版本的四种方法

    1:在终端下:mysql -V. 以下是代码片段: [shengting@login ~]$ mysql -V mysql Ver 14.7 Distrib 4.1.10a, for redhat-l ...

  9. jquery Autocomplete函数

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

  10. 第三章 Istio基本介绍

    3.1 Istio的核心组件及其功能 Istio总体分两部分:控制面和数据面. 数据面(sidecar):sidecar通过注入的方式和业务容器共存于一个pod,会劫持业务容器的流量,并接受控制面组件 ...