基于lucene的案例开发:查询语句创建PackQuery
转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/44656141
http://www.llwjy.com/blogdetail/162e5e70516d7ddfb6df8f77e6b13a2b.html
个人博客站已经上线了,网址 www.llwjy.com
~欢迎各位吐槽
-----------------------------------------------------------------------------------------------------------
在之前的《基于lucene的案例开发:Query查询》这篇博客中对实际开发过程中比较常见的Query做了简单的介绍,这里就介绍下具体的代码实现。查看最新代码点击这里或访问 http://www.llwjy.com/source/com.lulei.lucene.query.PackQuery.html
- /**
- *@Description: 创建查询Query
- */
- package com.lulei.lucene.query;
- import java.io.IOException;
- import java.io.StringReader;
- import java.util.ArrayList;
- import org.apache.lucene.analysis.Analyzer;
- import org.apache.lucene.analysis.TokenStream;
- import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
- import org.apache.lucene.index.Term;
- import org.apache.lucene.queryparser.classic.MultiFieldQueryParser;
- import org.apache.lucene.queryparser.classic.ParseException;
- 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.NumericRangeQuery;
- import org.apache.lucene.search.PhraseQuery;
- import org.apache.lucene.search.PrefixQuery;
- import org.apache.lucene.search.Query;
- import org.apache.lucene.search.TermQuery;
- import org.apache.lucene.search.TermRangeQuery;
- import org.apache.lucene.search.WildcardQuery;
- import org.apache.lucene.util.Version;
- import com.lulei.lucene.index.manager.IndexManager;
- public class PackQuery {
- //分词器
- private Analyzer analyzer;
- //使用索引中的分词器
- public PackQuery(String indexName) {
- analyzer = IndexManager.getIndexManager(indexName).getAnalyzer();
- }
- //使用自定义分词器
- public PackQuery(Analyzer analyzer) {
- this.analyzer = analyzer;
- }
- /**
- * @param key
- * @param fields
- * @return Query
- * @throws ParseException
- * @Author: lulei
- * @Description: 查询字符串匹配多个查询域
- */
- public Query getMultiFieldQuery(String key, String[] fields) throws ParseException{
- MultiFieldQueryParser parse = new MultiFieldQueryParser(Version.LUCENE_43, fields, analyzer);
- Query query = null;
- query = parse.parse(key);
- return query;
- }
- /**
- * @param key
- * @param field
- * @return Query
- * @throws ParseException
- * @Author: lulei
- * @Description: 查询字符串匹配单个查询域
- */
- public Query getOneFieldQuery(String key, String field) throws ParseException{
- if (key == null || key.length() < 1){
- return null;
- }
- QueryParser parse = new QueryParser(Version.LUCENE_43, field, analyzer);
- Query query = null;
- query = parse.parse(key);
- return query;
- }
- /**
- * @param key
- * @param fields
- * @param occur
- * @return Query
- * @throws IOException
- * @Author: lulei
- * @Description: 查询字符串、多个查询域以及查询域在查询语句中的关系
- */
- public Query getBooleanQuery(String key, String[] fields, Occur[] occur) throws IOException{
- if (fields.length != occur.length){
- System.out.println("fields.length isn't equals occur.length, please check params!");
- return null;
- }
- BooleanQuery query = new BooleanQuery();
- TokenStream tokenStream = analyzer.tokenStream("", new StringReader(key));
- ArrayList<String> analyzerKeys = new ArrayList<String>();
- while(tokenStream.incrementToken()){
- CharTermAttribute term = tokenStream.getAttribute(CharTermAttribute.class);
- analyzerKeys.add(term.toString());
- }
- for(int i = 0; i < fields.length; i++){
- BooleanQuery queryField = new BooleanQuery();
- for(String analyzerKey : analyzerKeys){
- TermQuery termQuery = new TermQuery(new Term(fields[i], analyzerKey));
- queryField.add(termQuery, Occur.SHOULD);
- }
- query.add(queryField, occur[i]);
- }
- return query;
- }
- /**
- * @param querys
- * @param occur
- * @return Query
- * @Author: lulei
- * @Description: 组合多个查询,之间的关系由occur确定
- */
- public Query getBooleanQuery(ArrayList<Query> querys, ArrayList<Occur> occurs){
- if (querys.size() != occurs.size()){
- System.out.println("querys.size() isn't equals occurs.size(), please check params!");
- return null;
- }
- BooleanQuery query = new BooleanQuery();
- for (int i = 0; i < querys.size(); i++){
- query.add(querys.get(i), occurs.get(i));
- }
- return query;
- }
- /**
- * @param fieldName
- * @param value
- * @return
- * @Author: lulei
- * @Description: StringField属性的搜索
- */
- public Query getStringFieldQuery(String value, String fieldName){
- Query query = null;
- query = new TermQuery(new Term(fieldName, value));
- return query;
- }
- /**
- * @param fields
- * @param values
- * @return
- * @Author: lulei
- * @Description: 多个StringField属性的搜索
- */
- public Query getStringFieldQuery(String[] values, String[] fields, Occur occur){
- if (fields == null || values == null || fields.length != values.length){
- return null;
- }
- ArrayList<Query> querys = new ArrayList<Query>();
- ArrayList<Occur> occurs = new ArrayList<Occur>();
- for (int i = 0; i < fields.length; i++){
- querys.add(getStringFieldQuery(values[i], fields[i]));
- occurs.add(occur);
- }
- return getBooleanQuery(querys, occurs);
- }
- /**
- * @param key
- * @param field
- * @param lucene43
- * @return
- * @throws ParseException
- * @Author: lulei
- * @Description: 查询字符串和单个查询域 QueryParser是否使用4.3
- */
- public Query getOneFieldQuery(String key, String field, boolean lucene43) throws ParseException{
- if (key == null || key.length() < 1){
- return null;
- }
- if (lucene43){
- return getOneFieldQuery(key, field);
- }
- @SuppressWarnings("deprecation")
- QueryParser parse = new QueryParser(Version.LUCENE_30, field, analyzer);
- Query query = null;
- query = parse.parse(key);
- return query;
- }
- /**
- * @param key
- * @param field
- * @Author: lulei
- * @Description: key开头的查询字符串,和单个域匹配
- */
- public Query getStartQuery(String key, String field) {
- if (key == null || key.length() < 1){
- return null;
- }
- Query query = new PrefixQuery(new Term(field, key));
- return query;
- }
- /**
- * @param key
- * @param fields
- * @param occur
- * @Author: lulei
- * @Description: key开头的查询字符串,和多个域匹配,每个域之间的关系由occur确定
- */
- public Query getStartQuery(String key, String []fields, Occur occur){
- if (key == null || key.length() < 1){
- return null;
- }
- ArrayList<Query> querys = new ArrayList<Query>();
- ArrayList<Occur> occurs = new ArrayList<Occur>();
- for (String field : fields) {
- querys.add(getStartQuery(key, field));
- occurs.add(occur);
- }
- return getBooleanQuery(querys, occurs);
- }
- /**
- * @param key
- * @param fields
- * @Author: lulei
- * @Description: key开头的查询字符串,和多个域匹配,每个域之间的关系Occur.SHOULD
- */
- public Query getStartQuery(String key, String []fields) {
- return getStartQuery(key, fields, Occur.SHOULD);
- }
- /**
- * @param key
- * @param field
- * @param slop
- * @return
- * @Author:lulei
- * @Description: 自定每个词元之间的最大距离
- */
- public Query getPhraseQuery(String key, String field, int slop) {
- if (key == null || key.length() < 1){
- return null;
- }
- StringReader reader = new StringReader(key);
- PhraseQuery query = new PhraseQuery();
- query.setSlop(slop);
- try {
- TokenStream tokenStream = this.analyzer.tokenStream(field, reader);
- tokenStream.reset();
- CharTermAttribute term = tokenStream.getAttribute(CharTermAttribute.class);
- while(tokenStream.incrementToken()){
- query.add(new Term(field, term.toString()));
- }
- reader.close();
- } catch (IOException e) {
- e.printStackTrace();
- return null;
- }
- return query;
- }
- /**
- * @param key
- * @param fields
- * @param slop
- * @param occur
- * @return
- * @Author:lulei
- * @Description: 自定每个词元之间的最大距离,查询多个域,每个域之间的关系由occur确定
- */
- public Query getPhraseQuery(String key, String[] fields, int slop, Occur occur) {
- if (key == null || key.length() < 1){
- return null;
- }
- ArrayList<Query> querys = new ArrayList<Query>();
- ArrayList<Occur> occurs = new ArrayList<Occur>();
- for (String field : fields) {
- querys.add(getPhraseQuery(key, field, slop));
- occurs.add(occur);
- }
- return getBooleanQuery(querys, occurs);
- }
- /**
- * @param key
- * @param fields
- * @param slop
- * @return
- * @Author:lulei
- * @Description: 自定每个词元之间的最大距离,查询多个域,每个域之间的关系是Occur.SHOULD
- */
- public Query getPhraseQuery(String key, String[] fields, int slop) {
- return getPhraseQuery(key, fields, slop, Occur.SHOULD);
- }
- /**
- * @param key
- * @param field
- * @return
- * @Author:lulei
- * @Description: 通配符检索 eg:getWildcardQuery("a*thor", "field")
- */
- public Query getWildcardQuery(String key, String field) {
- if (key == null || key.length() < 1){
- return null;
- }
- return new WildcardQuery(new Term(field, key));
- }
- /**
- * @param key
- * @param fields
- * @param occur
- * @return
- * @Author:lulei
- * @Description: 通配符检索,域之间的关系为occur
- */
- public Query getWildcardQuery(String key, String[] fields, Occur occur) {
- if (key == null || key.length() < 1){
- return null;
- }
- ArrayList<Query> querys = new ArrayList<Query>();
- ArrayList<Occur> occurs = new ArrayList<Occur>();
- for (String field : fields) {
- querys.add(getWildcardQuery(key, field));
- occurs.add(occur);
- }
- return getBooleanQuery(querys, occurs);
- }
- /**
- * @param key
- * @param fields
- * @return
- * @Author:lulei
- * @Description: 通配符检索,域之间的关系为Occur.SHOULD
- */
- public Query getWildcardQuery(String key, String[] fields) {
- return getWildcardQuery(key, fields, Occur.SHOULD);
- }
- /**
- * @param keyStart
- * @param keyEnd
- * @param field
- * @param includeStart
- * @param includeEnd
- * @return
- * @Author:lulei
- * @Description: 范围搜索
- */
- public Query getRangeQuery (String keyStart, String keyEnd, String field, boolean includeStart, boolean includeEnd) {
- return TermRangeQuery.newStringRange(field, keyStart, keyEnd, includeStart, includeEnd);
- }
- /**
- * @param min
- * @param max
- * @param field
- * @param includeMin
- * @param includeMax
- * @return
- * @Author:lulei
- * @Description: 范围搜索
- */
- public Query getRangeQuery (int min, int max, String field, boolean includeMin, boolean includeMax) {
- return NumericRangeQuery.newIntRange(field, min, max, includeMin, includeMax);
- }
- /**
- * @param min
- * @param max
- * @param field
- * @param includeMin
- * @param includeMax
- * @return
- * @Author:lulei
- * @Description: 范围搜索
- */
- public Query getRangeQuery (float min, float max, String field, boolean includeMin, boolean includeMax) {
- return NumericRangeQuery.newFloatRange(field, min, max, includeMin, includeMax);
- }
- /**
- * @param min
- * @param max
- * @param field
- * @param includeMin
- * @param includeMax
- * @return
- * @Author:lulei
- * @Description: 范围搜索
- */
- public Query getRangeQuery (double min, double max, String field, boolean includeMin, boolean includeMax) {
- return NumericRangeQuery.newDoubleRange(field, min, max, includeMin, includeMax);
- }
- public static void main(String[] args) throws IOException {
- }
- }
PackQuery类的构造方法,可以手动指定分词器也可以使用索引的分词器。个人建议,在项目中使用索引中的分词器,这样就不会因为分词器的不同造成不知名的错误。
----------------------------------------------------------------------------------------------------
ps:最近发现其他网站可能会对博客转载,上面并没有源链接,如想查看更多关于 基于lucene的案例开发 请点击这里。或访问网址http://blog.csdn.net/xiaojimanman/article/category/2841877
基于lucene的案例开发:查询语句创建PackQuery的更多相关文章
- 基于lucene的案例开发:纵横小说分布式採集
转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/46812645 http://www.llwjy.com/blogdetail/9 ...
- C#编写了一个基于Lucene.Net的搜索引擎查询通用工具类:SearchEngineUtil
最近由于工作原因,一直忙于公司的各种项目(大部份都是基于spring cloud的微服务项目),故有一段时间没有与大家分享总结最近的技术研究成果的,其实最近我一直在不断的深入研究学习Spring.Sp ...
- SqlServer ----- 根据查询语句创建视图
我们都知道视图的本质就是查询语句,那么就可以根据查询语句创建视图, 前提 知道视图的组成,已经写好的sql 语句,多表或单表的查询语句,将查询语句变成视图. 所以视图可以由单表,多表或视图加表构成. ...
- create table 使用select查询语句创建表的方法分享
转自:http://www.maomao365.com/?p=6642 摘要:下文讲述使用select查询语句建立新的数据表的方法分享 ---1 mysql create table `新数据表名` ...
- WebGIS中兴趣点简单查询、基于Lucene分词查询的设计和实现
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.前言 兴趣点查询是指:输入框中输入地名.人名等查询信息后,地图上可 ...
- Orcle 查询语句
首先,以超级管理员的身份登录oracle sqlplus sys/bjsxt as sysdba --然后,解除对scott用户的锁 alter user scott ac ...
- mysql-数据库查询语句汇总
目录 数据库查询语句 ***** 添加数据补充: 所有的select 关键字 where 条件 distinct 去除重复记录 指定字段 取别名 group by having order limit ...
- Apache Solr采用Java开发、基于Lucene的全文搜索服务器
http://docs.spring.io/spring-data/solr/ 首先介绍一下solr: Apache Solr (读音: SOLer) 是一个开源.高性能.采用Java开发.基于Luc ...
- 一种安全云存储方案设计(下)——基于Lucene的云端搜索与密文基础上的模糊查询
一种安全的云存储方案设计(未完整理中) 一篇老文了,现在看看错漏颇多,提到的一些技术已经跟不上了.仅对部分内容重新做了一些修正,增加了一些机器学习的内容,然并卵. 这几年来,云产品层出不穷,但其安全性 ...
随机推荐
- php json_decode 后,数字对象转换成了 科学计数法 的解决方案
php json_decode 后,数字对象转换成了 科学计数法 $obj='{"order_id":213477815351175,"buyer":10000 ...
- Python一路走来 DAY15 Javascript
JavaScript是一门编程语言,浏览器内置了JavaScript语言的解释器,所以在浏览器上按照JavaScript语言的规则编写相应代码之,浏览器可以解释并做出相应的处理. 一 如何编写 ...
- k-means均值聚类算法(转)
4.1.摘要 在前面的文章中,介绍了三种常见的分类算法.分类作为一种监督学习方法,要求必须事先明确知道各个类别的信息,并且断言所有待分类项都有一个类别与之对应.但是很多时候上述条件得不到满足,尤其是在 ...
- uC/OS 的任务调度解析 (转)
uC/OS 的任务调度解析 1.任务调度器启动之后(初始化,主要是TCB的初始化),就可以创建任务,开始任务调度了,实际上第一个任务准确的说不是进行任务切换,而是进行启动当前最高优先级任务.uC/OS ...
- 『信息收集』GoogleHacking快速定位目标网站
第一次接触到“GoogleHacking”是在学校初次Geek大赛上. 很有意思的一道题目,网页中原题大致是这样的: 下面是数学之美(吴军著)的封面,请找出这本书的ISBN码(这一关的Key值) 很不 ...
- JavsScript的基本特点
1.简单性Javascript是一种脚本语言,它采用小程序段的方式实现编程它同样也是一种解释性语言.2.动态性Javascript是动态的,它可以直接对用户或者客户输入做出相应,无须经过Web服务程序 ...
- 深入理解7816(1)---- 关于F/D和etu
对于刚接触智能卡的工程师来说,在阅读7816-3规范的时候,常常被其中的一些术语迷惑,读起来会觉得有些别扭.尤其是在看到复位应答中的F和D设置,以及对应的etu的时候,会觉得有些复杂和难以理解. 其实 ...
- [置顶] 【原创分享】嵌入式linux应用之内核移植定制篇-前篇(linux-3.8.12 mini2440)--20130824
移植的话其实很早就做过了,不过那时用的友善定制的老版本2.6.32 驱动什么的全部弄好了,仅仅用默认配置而已.基本不用改动什么,很简单. 内核更新其实非常的快,今天我就用个3.8.12来移植. 当然, ...
- baike并行计算概念
并行计算 概论 ▪ 高性能计算 ▪ 计算机集群 ▪ 分布式计算 ▪ 网格计算 ▪ 云端运算 方式 ▪ Bit-level parallelism ▪ Instruction level ...
- (2)自己写一个简单的servle容器
自己写一个简单的servlet,能够跑一个简单的servlet,说明一下逻辑. 首先是写一个简单的servlet,这就关联到javax.servlet和javax.servlet.http这两个包的类 ...