lucene是一个很强大的搜索工具,最近公司项目上用到,结合JAVA1234所讲,对多条件查询做出总结

先描述一下我的多条件需求,如果和您的类似,继续往下看。

1、我的Lucene搜索会在很多地方使用,使用时的条件各不相同

2、只建立一份索引

使用的工具包(点我下载):

一、创建索引文件

import java.io.File;
import java.io.FileReader;
import java.nio.file.Paths; import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.wltea.analyzer.lucene.IKAnalyzer; public class LuceneCreateIndex
{
private IndexWriter indexWriter = null; public LuceneCreateIndex( String indexDir ) throws Exception
{
// IKAnalyzer 有独特之处,同时支持多种语言的分词
Analyzer analyzer = new IKAnalyzer();
Directory directory = FSDirectory.open( Paths.get( indexDir ) );
IndexWriterConfig indexWriterConfig = new IndexWriterConfig( analyzer );
indexWriter = new IndexWriter( directory, indexWriterConfig );
} /**
* 将测试数据文件写入索引
* @param dataDir
* @throws Exception
*/
public void createIndex( String dataDir ) throws Exception
{
File[] files = new File( dataDir ).listFiles();
for ( File file : files )
{
Document document = getDocument( file );
indexWriter.addDocument( document );
System.out.println( "已建立索引文件:" + file.getCanonicalPath() );
}
indexWriter.close();
} public Document getDocument( File file ) throws Exception
{
Document document = new Document();
document.add( new TextField( "contents", new FileReader( file ) ) );
document.add( new TextField( "fileName", file.getName(), Field.Store.YES ) );
document.add( new TextField( "fullPath", file.getCanonicalPath(), Field.Store.YES ) );
return document;
} public static void main( String[] args )
{
String indexDir = "D:\\luceneTest";// 索引文件生成目录
String dataDir = "D:\\luceneTest\\data";// 测试数据目录(测试数据见下图)
try
{
new LuceneCreateIndex( indexDir ).createIndex( dataDir );
}
catch ( Exception e )
{
e.printStackTrace();
}
}
}

运行生成索引文件;测试数据如下

2、测试搜索效果

import java.nio.file.Paths;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.BooleanClause.Occur;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.wltea.analyzer.lucene.IKAnalyzer; public class LuceneTestSearch
{
/**
* 单条件查询
* @param indexDir
* @param q
* @throws Exception
*/
public static void search( String indexDir, String q ) throws Exception
{
Directory directory = FSDirectory.open( Paths.get( indexDir ) );
IndexReader indexReader = DirectoryReader.open( directory );
IndexSearcher indexSearcher = new IndexSearcher( indexReader );
Analyzer analyzer = new IKAnalyzer();
// 搜索目标是 contents
QueryParser parser = new QueryParser( "contents", analyzer );
// 传入关键字,进行分析
Query query = parser.parse( q );
// 分页,这里取前十个
TopDocs topDocs = indexSearcher.search( query, 10 ); for ( ScoreDoc scoreDoc : topDocs.scoreDocs )
{
// 获取搜索结果
Document document = indexSearcher.doc( scoreDoc.doc );
System.out.println( document.get( "fullPath" ) );
} indexReader.close();
} /**
* 多条件查询
* @param indexDir
* @param q
* @throws Exception
*/
public static void searchBooleanQuery( String indexDir, String q ) throws Exception
{
Directory directory = FSDirectory.open( Paths.get( indexDir ) );
IndexReader indexReader = DirectoryReader.open( directory );
IndexSearcher indexSearcher = new IndexSearcher( indexReader );
Analyzer analyzer = new IKAnalyzer();
// 多条件必备神器
BooleanQuery.Builder builder = new BooleanQuery.Builder();
// 实际使用中一般是多目标搜索(根据 姓名、性别、年龄、学校等等),
//QueryParser parser = new MultiFieldQueryParser( new String[]{"contents","fullPath"}, analyzer );
// 条件一
QueryParser parser = new QueryParser( "contents", analyzer );
Query query = parser.parse( q );
// contents必须含有条件一
builder.add( query, Occur.MUST );
// 条件二
QueryParser parser1 = new QueryParser( "fileName", analyzer );
Query query1 = parser1.parse( "b c" );
// fileName必须不能是 b 和 c
builder.add( query1, Occur.MUST_NOT ); TopDocs topDocs = indexSearcher.search( builder.build(), 10 ); for ( ScoreDoc scoreDoc : topDocs.scoreDocs )
{
Document document = indexSearcher.doc( scoreDoc.doc );
System.out.println( document.get( "fullPath" ) );
}
indexReader.close();
} public static void main( String[] args )
{
String indexDir = "D:\\luceneTest";
String q = "1";
try
{
// 搜索contents含有1的文件信息
System.out.println( "单条件查询:" );
search( indexDir, q );
// 搜索contents含有1 但是除开文件b 和 c
System.out.println( "多条件查询:" );
searchBooleanQuery( indexDir, q );
}
catch ( Exception e )
{
e.printStackTrace();
}
}
}

搜索结果如下

单条件查询:
D:\luceneTest\data\d.txt
D:\luceneTest\data\b.txt
D:\luceneTest\data\c.txt
D:\luceneTest\data\a.txt
多条件查询:
D:\luceneTest\data\d.txt
D:\luceneTest\data\a.txt

关于更多lucene的学习,欢迎和博主交流

Lucene5多条件查询的更多相关文章

  1. jqGrid jqGrid分页参数+条件查询

    HTML <div class="row"> <div class="col-sm-20"> <form id="for ...

  2. Rafy 中的 Linq 查询支持(根据聚合子条件查询聚合父)

    为了提高开发者的易用性,Rafy 领域实体框架在很早开始就已经支持使用 Linq 语法来查询实体了.但是只支持了一些简单的.常用的条件查询,支持的力度很有限.特别是遇到对聚合对象的查询时,就不能再使用 ...

  3. Oracle学习总结_day03_day04_条件查询_排序_函数_子查询

    本文为博主辛苦总结,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用. 转载请注明 出自 : luogg的博客园 谢谢配合! day03_条件查询_排序_函数 清空回收站: PUR ...

  4. [NHibernate]条件查询Criteria Query

    目录 写在前面 文档与系列文章 条件查询 一个例子 总结 写在前面 上篇文章介绍了HQL查询,我个人觉得使用ORM框架就是为了让少些sql,提高开发效率,而再使用HQL就好像还是使用sql,就觉得有点 ...

  5. PHP-----练习-------租房子-----增删改查,多条件查询

    练习-------租房子-----增删改查,多条件 一 .题目要求: 二 .做法: [1]建立数据库 [2]封装类文件------DBDA.class.php <?php class DBDA ...

  6. 【Java EE 学习 17 下】【数据库导出到Excel】【多条件查询方法】

    一.导出到Excel 1.使用DatabaseMetaData分析数据库的数据结构和相关信息. (1)测试得到所有数据库名: private static DataSource ds=DataSour ...

  7. SpringMVC整合Hibernate实现增删改查之按条件查询

    首先我贴出我项目的结构,只完成了条件查询的相关代码,增删改没有写. 1.新建一个动态Web工程,导入相应jar包,编写web.xml配置文件 <context-param> <par ...

  8. EasyUI ComboGrid的绑定,上下键和回车事件,输入条件查询

    首先我们先看一下前台的绑定事件 1.先定义标签 <input id="cmbXm" type="text" style="width: 100p ...

  9. MySQL数据库6 -查询基础,简单查询,条件查询,对查询结果排序

    一.SELECT语句 SELECT COL1,COL2,....COLn FROM TABLE1,TABLE2,....TABLEn [WHERE CONDITIONS] -- 查询条件 [GROUP ...

随机推荐

  1. 4.String字符串类型操作

    String类型操作 1.set key value 设置key对应的值为string类型的value  2.mset key1 value1 … keyN valueN 一次设置多个key的值 3. ...

  2. 发光加载环动画-纯CSS动画效果-如何创建CSS3旋转预加载器(参照https://www.bilibili.com/video/BV1V4411C7z5?from=search&seid=9741275927942612817)

    //css部分 body{ margin:; padding:; background: #262626; } .ring{ position: absolute; top:50%; left: 50 ...

  3. 【C++】运算符优先级和结合性

    从上表可以大致总结这样一个规律: 优先级 运算符 高 初等运算符 | 单目运算符 | 算术运算符(先乘除,后加减) | 关系运算符 | 逻辑运算符(不包括!) | 条件运算符 ↓ 赋值运算符 低 逗号 ...

  4. jchdl - GSL实例 - Add

    https://mp.weixin.qq.com/s/6xcYYdYZTBPTf25xFluzBQ   使用FullAdder级联实现加法器   参考链接: https://github.com/wj ...

  5. Java实现 LeetCode 803 打砖块 (DFS)

    803. 打砖块 我们有一组包含1和0的网格:其中1表示砖块. 当且仅当一块砖直接连接到网格的顶部,或者它至少有一块相邻(4 个方向之一)砖块不会掉落时,它才不会落下. 我们会依次消除一些砖块.每当我 ...

  6. Java实现 LeetCode 332 重新安排行程

    332. 重新安排行程 给定一个机票的字符串二维数组 [from, to],子数组中的两个成员分别表示飞机出发和降落的机场地点,对该行程进行重新规划排序.所有这些机票都属于一个从JFK(肯尼迪国际机场 ...

  7. Java实现 蓝桥杯VIP 算法训练 数组查找及替换问题

    描述 给定某整数数组和某一整数b.要求删除数组中可以被b整除的所有元素,同时将该数组各元素按从小到大排序.如果数组元素数值在A到Z的ASCII之间,替换为对应字母.元素个数不超过100,b在1至100 ...

  8. Java实现 LeetCode 151 翻转字符串里的单词

    151. 翻转字符串里的单词 给定一个字符串,逐个翻转字符串中的每个单词. 示例 1: 输入: "the sky is blue" 输出: "blue is sky th ...

  9. java实现巧排扑克牌

    ** 巧排扑克牌** 小明刚上小学,学会了第一个扑克牌"魔术",到处给人表演.魔术的内容是这样的: 他手里握着一叠扑克牌:A,2,-J,Q,K 一共13张.他先自己精心设计它们的顺 ...

  10. 09_EM算法

    今天是2020年3月5日星期四.预计开学时间不会早于四月初,真是好消息,可以有大把的时间整理知识点(实际上发文章的时间都6月6号了,希望9月份能开学啊,不耽误找工作~).每次导师找,整个人会变的特别烦 ...