• 使用Query子类查询

MatchAllDocsQuery

TermQuery

NumericRangeQuery

BooleanQuery

  • 使用QueryParser

QueryParser

MulitFieldQueryParser

先抽取公共代码

private void dosearch(Query query) throws IOException {
//给出索引库位置
FSDirectory directory = FSDirectory.open(new File("E:\\upload\\lucene")); //创建indexReader
DirectoryReader reader = IndexReader.open(directory); //创建search对象
IndexSearcher searcher = new IndexSearcher(reader); TopDocs topDocs = searcher.search(query, 10);
System.out.println(query); ScoreDoc[] ScoreDocs = topDocs.scoreDocs;
System.out.println(topDocs.totalHits); //查询命中的条数
for (ScoreDoc scoreDoc:ScoreDocs) {
int id = scoreDoc.doc;//文档的id
Document doc = searcher.doc(id);//获取doc对象 System.out.println(doc.get("id"));
System.out.println(doc.get("name"));
// System.out.println(doc.get("price"));
// System.out.println(doc.get("pic"));
// System.out.print(doc.get("description"));
}
reader.close();
}

第一个MatchAllDoceQuery,是全匹配,匹配的语法是  *:*

@Test
public void doMatchAllDocsQuery() throws Exception {//创建query对象
MatchAllDocsQuery query = new MatchAllDocsQuery(); dosearch(query); }

第二个 是 TermQuery,是精确匹配,  下面匹配的语法是:  description:项目

TermQuery termQuery = new TermQuery(new Term("description","项目"));
dosearch(query);

第三个NumericRangeQuery,数字的匹配,表示区间

第一个参数:域的名称

第二个参数:最小值

第三个参数:最大值

第四个参数:是否包含最小值

第五个参数:是否包含最大值

域名+“:”+[数值 TO 数值]   表示数值范围,并且包括数值。如果不包括数值 用"{}"

比如:

price:[55.0 TO 70.0]  等同于 55=< price <=70

price:{55.0 TO 70.0]  等同于 55 < price <=70

 @Test
public void doNumericRangeQuery() throws Exception {//创建query对象 NumericRangeQuery price =NumericRangeQuery.newFloatRange("price", 55F, 56F, true, true); dosearch(price); }

第四个是BooleanQuery,多条件查询

1、MUST和MUST表示“与”的关系,即“交集”。

2、MUST和MUST_NOT前者包含后者不包含。

3、MUST_NOT和MUST_NOT没意义

4、SHOULD与MUST表示MUST,SHOULD失去意义;

5、SHOUlD与MUST_NOT相当于MUST与MUST_NOT。

6、SHOULD与SHOULD表示“或”的概念。

 @Test
public void doBooleanQuery() throws Exception {//创建query对象 BooleanQuery query = new BooleanQuery();
TermQuery query1 = new TermQuery(new Term("name","java"));
NumericRangeQuery<Float> query2 = NumericRangeQuery.newFloatRange("price", 55F, 56F, true, true);
query.add(query1, BooleanClause.Occur.SHOULD);
query.add(query2, BooleanClause.Occur.SHOULD);
dosearch(query); }

query的子类不需要指定分词器,而且不能指定查询的语法

queryparser 需要指定分词器 ,而且可以指定查询的语法

第五个queryParse

TermQuery 是全匹配搜索,如果要搜索一段文字,需要整体匹配才行,如果要搜索包含在这段文字中的词,需要对这段文字进行分词。才能进行搜索。queryparser就可以指定一个分词器,再进行解析,进行查询。

  @Test
public void doQueryParse() throws Exception {
//创建query对象
Analyzer analyzer=new IKAnalyzer();
QueryParser parser = new QueryParser("name",analyzer);
// Query query = parser.parse("*:*");
// Query query = parser.parse("lucene java");
// Query query = parser.parse("name:java AND name:编程");
Query query = parser.parse("+name:java +name:编程");
dosearch(query);
}

第六个MultiFieldQueryParser,可进行多个域匹配

@Test
public void doMultiFieldQueryParser() throws Exception { Analyzer i=new IKAnalyzer();
String[] fields={"name","description"};
MultiFieldQueryParser queryParser = new MultiFieldQueryParser(fields, i);
Query query = queryParser.parse("lucene");
dosearch(query);
}

数值范围类的查询语法,不支持在queryparser中查询。语法是没有错误的。在solr中可以查询出来。

组合条件查询

Occur.MUST 查询条件必须满足,相当于and

+(加号)

Occur.SHOULD 查询条件可选,相当于or

空(不用符号)

Occur.MUST_NOT 查询条件不能满足,相当于not非

-(减号)

1)+条件1 +条件2:两个条件之间是并且的关系and

例如:+filename:apache +content:apache

2)+条件1 条件2:必须满足第一个条件,忽略第二个条件

例如:+filename:apache content:apache

3)条件1 条件2:两个条件满足其一即可。

例如:filename:apache content:apache

4)-条件1 条件2:必须不满足条件1,要满足条件2

例如:-filename:apache content:apache

第二种写法:

条件1 AND 条件2

条件1 OR 条件2

条件1 NOT 条件2

注意:

Search方法需要指定匹配记录数量n:indexSearcher.search(query, n)

TopDocs.totalHits:是匹配索引库中所有记录的数量

TopDocs.scoreDocs:匹配相关度高的前边记录数组,scoreDocs的长度小于等于search方法指定的参数n

lucene搜索之高级查询的更多相关文章

  1. lucene搜索之facet查询原理和facet查询实例——TODO

    转自:http://www.lai18.com/content/7084969.html Facet说明 我们在浏览网站的时候,经常会遇到按某一类条件查询的情况,这种情况尤以电商网站最多,以天猫商城为 ...

  2. Lucene系列六:Lucene搜索详解(Lucene搜索流程详解、搜索核心API详解、基本查询详解、QueryParser详解)

    一.搜索流程详解 1. 先看一下Lucene的架构图 由图可知搜索的过程如下: 用户输入搜索的关键字.对关键字进行分词.根据分词结果去索引库里面找到对应的文章id.根据文章id找到对应的文章 2. L ...

  3. Lucene 的四大索引查询 ——bool 域搜索 通配符 范围搜索

    Lucene 的四大索引查询  清单1:使用布尔操作符 Java代码      //Test boolean operator blic void testOperator(String indexD ...

  4. Lucene核心--构建Lucene搜索(上篇,理论篇)

    2.1构建Lucene搜索 2.1.1 Lucene内容模型 一个文档(document)就是Lucene建立索引和搜索的原子单元,它由一个或者多个字段(field)组成,字段才是Lucene的真实内 ...

  5. Lucene搜索方式大合集

    package junit; import java.io.File; import java.io.IOException; import java.text.ParseException; imp ...

  6. lucene 搜索demo

    package com.ljq.utils; import java.io.File; import java.util.ArrayList; import java.util.List; impor ...

  7. Winform开发框架之通用高级查询模块

    最近一直忙于公司的事情,虽然一直在做一些相关的技术研究,但是很久没能静下心来好好写写博客文章了,想想也有半个月之多了,这半个月来,也一直致力于改善我的WInform开发框架,使得自己及客户使用起来更加 ...

  8. SQL server 创建 修改表格 及表格基本增删改查 及 高级查询 及 (数学、字符串、日期时间)函数[转]

    SQL server 创建 修改表格 及表格基本增删改查 及 高级查询 及 (数学.字符串.日期时间)函数   --创建表格 create table aa ( UserName varchar(50 ...

  9. Lucene学习笔记: 五,Lucene搜索过程解析

    一.Lucene搜索过程总论 搜索的过程总的来说就是将词典及倒排表信息从索引中读出来,根据用户输入的查询语句合并倒排表,得到结果文档集并对文档进行打分的过程. 其可用如下图示: 总共包括以下几个过程: ...

随机推荐

  1. 配置DTP

    拓扑一  结果:NO 默认auto(被动)模式 Switch>show interfaces fastEthernet / switchPort Name: Fa0/ Switchport: E ...

  2. MongoDB慢查询性能分析

    最近,长期运营后的港台服出现一个问题,web充值很慢,用gm指令查询玩家信息也很慢.最后定位到MongoDB查询也很慢.   刚开始定位的时候,运营SA直接查指定的玩家,并反映很慢,就猜测是索引的问题 ...

  3. [ 随手记6 ] C/C++ 形参、实参、按值传参、指针传参、引用传参

    个人原创: 1. 形参:形式上的参数,一般多在函数声明.函数定义的参数上: 2. 实参:实体参数,有实际的值,在运算上被循环使用的值: 3. 按值传参:按值,就是把实际的值传给函数内部: 4. 指针传 ...

  4. asp.net开启多线程异步处理

    protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { try { Thread categoryThrea ...

  5. Qt 学习-----helloword

    (参考:http://www.qter.org/portal.php?mod=view&aid=27&page=3) 1. 打开“文件→新建文件或项目”菜单项(也可以直接按下Ctrl+ ...

  6. js立即执行函数用法

    js立即执行函数可以让你的函数在创建后立即执行,js立即执行函数模式是一种语法,可以让你的函数在定义后立即被执行,这种模式本质上就是函数表达式(命名的或者匿名的),在创建后立即执行. 一.JS立即执行 ...

  7. String对象的属性和方法

    String对象的属性和方法   创建字符串的两种方法: 1.直接量:var str = ""; 2.字符串对象创建: new String(""); Stri ...

  8. Unity安卓打包遇到的问题。

    1, android asset packinging tool failed. "路径" package -v -f -F assets.ap_ - Assets found X ...

  9. 3,列表的 深 浅 copy

    如果列表只有一层,深浅copy是一样一样的,没有什么区别,你修改了copy后的列表,copy前的列表并不会随之改变. 如果列表中嵌套这列表,这是你修改了copy后第二层列表里面的元素,copy前第二层 ...

  10. macbook远程连接报错no matching cipher found

    在.ssh/目录下添加config文件 Host xxx.xxx.xxx.xxx Ciphers 3des-cbc KexAlgorithms +diffie-hellman-group1-sha1 ...