博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Lucene提供的条件判断查询
阅读量:5967 次
发布时间:2019-06-19

本文共 3681 字,大约阅读时间需要 12 分钟。

作者:    发布时间: 2009-12-08 17:46  阅读: 5227 次  推荐: 2          

第一、按词条搜索 - TermQuery

query = new TermQuery(new Term("name","word1"));
hits = searcher.search(query);

这样就可以把 field 为 name 的所有包含 word1 的文档检索出来了。

第二、“与或”搜索 - BooleanQuery

它实际是一个组合 query 看看下面的代码: 

query1 = new TermQuery(new Term("name","word1"));
query2 = new TermQuery(new Term("name","word2"));
BooleanQuery query=new BooleanQuery();
query.add(query1, BooleanClause.Occur.MUST);
query.add(query2, BooleanClause.Occur.MUST);
hits = searcher.search(query);

其中的MUST、SHOULD、MUST_NOT表示与、或、非 ,从字面意思很容易理解

Lucene 可以最多支持连续 1024 的 query 的组合。

第三、 在某一范围内搜索 - RangeQuery

IndexSearcher searcher = new IndexSearcher("F:\资源\lucene研究\test");
Term beginTime = new Term("time","200001");
Term endTime = new Term("time","200005");
Hits hits = null;
RangeQuery query = null;
query = new RangeQuery(beginTime, endTime, false);
hits = searcher.search(query);

RangeQuery 的构造函数的参数分别代表起始、结束、是否包括边界。这样我们就可以按照要求检索了。

第四、 使用前缀检索 - PrefixQuery

这个检索的机制有点类似于 indexOf() 从前缀查找。这个常在英文中使用,中文中就很少使用了。代码如下:

IndexSearcher searcher = new IndexSearcher("F:\资源\lucene研究\test");
Term pre1 = new Term("name", "Da");
query = new PrefixQuery(pre1);
hits = searcher.search(query);

第五、 多关键字的搜索 - PhraseQuery

可以多个关键字同时查询。使用如下:

query = new PhraseQuery();
query.add(word1);
query.add(word2);
query.setSlop(0);
hits = searcher.search(query);
printResult(hits, "'david' 与 'mary' 紧紧相隔的 Document");
query.setSlop(2);
hits = searcher.search(query);
printResult(hits, "'david' 与 'mary' 中相隔两个词的短语 ");

这里我们要注意 query.setSlop(); 这个方法的含义。 

query.setSlop(0); 紧紧相连 (这个的条件比较苛刻) 
query.setSlop(2); 相隔。

第六、 使用短语缀搜索 - PharsePrefixQuery 

使用 PharsePrefixQuery 可以很容易的实现相关短语的检索功能。 
实例:

query = new PhrasePrefixQuery();
// 加入可能的所有不确定的词
Term word1 = new Term("content", "david");
Term word2 = new Term("content", "mary");
Term word3 = new Term("content", "smith");
Term word4 = new Term("content", "robert");
query.add(new Term[]{word1, word2});
// 加入确定的词
query.add(word4);
query.setSlop(2);
hits = searcher.search(query);
printResult(hits, " 存在短语 'david robert' 或 'mary robert' 的文档 ");

第七、 相近词语的搜索 - fuzzyQuery 

可以通俗的说它是一种模糊查询。 
实例:

Term word1 = new Term("content", "david");
Hits hits = null;
FuzzyQuery query = null;
query = new FuzzyQuery(word1);
hits = searcher.search(query);
printResult(hits," 与 'david' 相似的词 ");

第八、 使用通配符搜索 - WildcardQuery 

实例:

IndexSearcher searcher = new IndexSearcher("F:\资源\lucene研究\test");
Term word1 = new Term("content", "*ever");
Term word2 = new Term("content", "wh?ever");
Term word3 = new Term("content", "h??ever");
Term word4 = new Term("content", "ever*");
WildcardQuery query = null;
Hits hits = null;
query = new WildcardQuery(word1);
hits = searcher.search(query);
printResult(hits, "*ever");
query = new WildcardQuery(word2);
hits = searcher.search(query);
printResult(hits, "wh?ever");
query = new WildcardQuery(word3);
hits = searcher.search(query);
printResult(hits, "h??ever");
query = new WildcardQuery(word4);
hits = searcher.search(query);
printResult(hits, "ever*");

由上可以看出通配符?代便 1 个字符, * 代表 0 到多个字符。 

Lucene 现在支持以上八中的搜索方式,我们可以根据需要选择适合自己的搜索方式。当然上面提供的一些可能对英文还是比较有效,中文就不可取了,所以我们开始想想百度,我们只在一个输入框中搜索结果。有了这个疑问我们揭开下一章的讨论吧!

查询字符串的解析:这个就是我们经常在一个输入框中输入我们要检索的文字,交给搜索引擎去帮我们分词。 

QueryParser 类就是对查询字符串的解析类。 

看看它的用法:

query = QueryParser.parse(key1, "name", new StandardAnalyzer());
hits = searcher.search(query);

它直接返回一个 Query 对象。需要传入的参数分别是: 

用户需要查询的字符串、需要检索的对应字段名称、采用的分词类。

Analyzer analyzer = new CJKAnalyzer();
String[] fields = {"filename", "content"};
Query query = MultiFieldQueryParser.parse(searchword, fields, analyzer);
Hits hits = searcher.search(query);

QueryParser 的“与” 和 “或”: 

QueryParser 之间默认是或,我们想改变为与的话加入以下代码: 
QueryParser.setOperator(QueryParser.DEFAULT_OPERATOR_AND); 
就可以了。

转载地址:http://ymvax.baihongyu.com/

你可能感兴趣的文章
大型网站系统架构的演化
查看>>
JQuery 如何选择带有多个class的元素
查看>>
The absolute uri: http://java.sun.com/jsp/jstl/core cannot be resolved in either web.xml or the jar
查看>>
VS快速生成JSON数据格式对应的实体
查看>>
Word2vec 模型载入(tensorflow)
查看>>
Linux内核——定时器和时间管理
查看>>
J2EE之初识JSP
查看>>
RabbitMq消息序列化简述
查看>>
i.e., e.g., etc.
查看>>
火炬之光模型导出(Unity载入火炬之光的模型)
查看>>
git忽略文件【转】
查看>>
Web上的支持的图片格式以及它们之间的区别
查看>>
随意而为
查看>>
jQuery监听文本框值改变触发事件(propertychange)
查看>>
Json——使用Json jar包实现Json字符串与Java对象或集合之间的互相转换
查看>>
HDU--2040
查看>>
zepto返回顶部动画
查看>>
CVBS视频信号解析
查看>>
必要时进行保护性拷贝
查看>>
Codeforces Round #356 (Div. 1) D. Bear and Chase 暴力
查看>>