知识点
相关文章
更多最近更新
更多Lucene学习笔记之十二:lucene几种搜索方式
2019-03-11 09:42|来源: 网路
精确匹配搜索
查出在某个域中,含有某个词的指定文档数,要用到的方法是TermQuery
public void searchByTerm(String field,String name,int num) { try { IndexSearcher searcher = getSearcher(); Query query = new TermQuery(new Term(field,name)); TopDocs tds = searcher.search(query, num); System.out.println("一共查询了:"+tds.totalHits); for(ScoreDoc sd:tds.scoreDocs) { Document doc = searcher.doc(sd.doc); System.out.println(doc.get("id")+"---->"+ doc.get("name")+"["+doc.get("email")+ "]-->"+doc.get("id")+","+ doc.get("attach")+","+doc.get("date")); } searcher.close(); } catch (CorruptIndexException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } @Test public void searchByTerm() { su.searchByTerm("content","football",3); } |
范围搜索
用到的方法是
Query query = new TermRangeQuery(field,start,end,true, true);
其中第四个参数如果是为true,表示包含start,否则不包含。第五个参数的意思和第四个一样,只是指定的是end
public void searchByTermRange(String field, String start, String end, int num) { try { IndexSearcher searcher = getSearcher(); Query query = new TermRangeQuery(field, start, end, true, true); TopDocs tds = searcher.search(query, num); System.out.println("一共查询了:" + tds.totalHits); for (ScoreDoc sd : tds.scoreDocs) { Document doc = searcher.doc(sd.doc); System.out.println(doc.get("id") + "---->" + doc.get("name") + "[" + doc.get("email") + "]-->" + doc.get("id") + "," + doc.get("attach") + "," + doc.get("date")); } searcher.close(); } catch (CorruptIndexException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } @Test public void searchByTermRange() { //查询ID从1到3的 su.searchByTermRange("id", "1", "3", 10); //查询name以a开头和s结尾的 su.searchByTermRange("name","a","s",10); //由于attachs是数字类型,使用TermRange无法查询 su.searchByTermRange("attach","2","10", 5); } |
数字范围,使用NumericRangeQuery,方法和前面的一样,只是创建Query对象不一样:
Query query = NumericRangeQuery
.newIntRange(field,start, end,true,true);
测试示例:
public voidsearchByNumRange() {
su.searchByNumricRange("attach",2,10,5);
}
前缀搜索
方法和前面的一样,只是创建Query对象不一样:
Query query = new PrefixQuery(new Term(field,value));
测试方法
@Test
public voidsearchByPrefix() {
su.searchByPrefix("content","s",10);
}
通配符搜索
在传入的value中可以使用通配符:?和*,?表示匹配一个字符,*表示匹配任意多个字符
Query query = new WildcardQuery(new Term(field,value));
测试方法
@Test
public voidsearchByWildcard() {
//匹配@itat.org结尾的所有字符
su.searchByWildcard("email","*@itat.org", 10);
//匹配j开头的有三个字符的name
su.searchByWildcard("name", "j???", 10);
}
多条件搜索
BooleanQuery可以连接多个子查询
Occur.MUST表示必须出现
Occur.SHOULD表示可以出现
Occur.MUSE_NOT表示不能出现
BooleanQuery query = new BooleanQuery(); query.add(new TermQuery(new Term("name","zhangsan")), Occur.MUST_NOT); query.add(new TermQuery(new Term("content","game")),Occur.SHOULD); |
本文链接:Lucene学习笔记之十二:lucene几种搜索方式,领悟书生学习笔记,转载请注明出处:http://www.656463.com/article/449
相关问答
更多-
lucene怎么用[2022-07-03]
Lucene是一个全文检索系统框架,开源的。 用起来比较方便,去Lucene的官网上下一个包并导入到你的工程中就可以调用包里面的类了。 一般的书里面介绍的版本都是1.4.3或者稍微高级一点的,不过现在lucene3.0正式发布,一些函数调用方法已经改变了,你可以下载一个版本低一点的Lucene比较适合学习~ 当然你直接从3.0入手的话网上资料也是非常丰富的~ -
关于Lucene怎么使用SpanQuery进行模糊搜索[2023-05-23]
SpanQuery是按照词在文章中的距离或者查询几个相邻词的查询。 打个比方:如“中华人民共和国” 用“中国“做为关键字, 跨度为某个值,如5。跨度代表 中 和国之间的长度。。 lucene的: SpanQuery包括以下几种: SpanTermQuery:词距查询的基础,结果和TermQuery相似,只不过是增加了查询结果中单词的距离信息。 SpanFirstQuery:在指定距离可以找到第一个单词的查询。 SpanNearQuery:查询的几个语句之间保持者一定的距离。 SpanOrQuery:同时查询 ... -
Lucene 怎样实现这样的模糊搜索?[2022-06-11]
如何用java实现lucene(只使用,不求甚解版-_-") 1.前提 lucene有7个包需要导入:analysis,document,index,queryParser,search,store,util 2.建立索引 IndexWriter writer = new IndexWriter("E:/index", new StandardAnalyze(),true,MaxFieldLength.UNLIMITED); //true代表覆盖原先数据,maxFieldLength用来限制F ... -
Lucene如何只搜索词组[2023-01-20]
可以使用PhraseQuery ,如: PhraseQuery query = new PhraseQuery(); query.setSlop(0); query.add(new Term("contents",“故障”)); //contents为索引搜索字段名 query.add(new Term("contents",“原”)); query.add(new Term("contents",“因”)); TopDocs topDocs = searcher.search(query, 10); -
关于lucene的一个问题[2022-11-22]
这不是很简单的问题?把HTML目录设置成lucene的索引目录,再用程序读出HTML文件代码,再索引HTML文件内容 -
Lucene具体作用...是否有学习资料[2023-07-15]
基于Java的全文检索引擎. 参考资料: Apache: Lucene Project http://jakarta.apache.org/lucene/ Lucene开发/用户邮件列表归档 Lucene-dev@jakarta.apache.org Lucene-user@jakarta.apache.org The Lucene search engine: Powerful, flexible, and free http://www.javaworld.com/javaworld/jw-09-200 ... -
Lucene搜索结果(Lucene search result)[2022-07-08]
您可以使用WildCardQuery ,因为单词expense包含在所有四个文档中,因此您可以将搜索字符串作为*expense*传递,这将返回name字段中具有费用的所有文档。 不要忘记设置QueryParser以允许带有以下内容的前导通配符: QueryParser.setAllowLeadingWildcard(true) 在代码中进行以下更改: nameQParser.setAllowLeadingWildcard(true); Query query = nameQParser.parse("*e ... -
在更新安装期间,系统管理员已在服务器配置中指定了Lucene索引的相对路径 ,然后启动应用服务器。 首次启动后,我们的应用程序在数据库中对数据进行完全索引,然后每两小时增加一次索引。 我们的服务器每晚都通过chron任务重启,因此在自动重启后, Lucene索引的相对路径会发生变化 。 下一个增量索引在不同文件夹中创建新索引文件并保存更改。 当我向系统管理员询问索引文件时,他们给我第一个创建的大索引,我将对它们进行分析,但实际上,服务器使用不同的索引文件。 所以,答案是:需要指定Lucene索引文件夹的完整 ...
-
如何使用lucene进行搜索(How to use lucene to search)[2022-12-21]
分析器旨在将字符串拆分为标记。 SmartChineseAnalyzer将“和试天下”分为“和”,“试”和“天下”,就像StandardAnalyzer将“谁获得世界”分为“谁”,“获取”和“世界”一样。 如果你想搜索一个短语,你的查询应该引用: qp.parse("\"且试天下\""); 如果您不希望分析该字段,请将其索引为StringField (或使用KeywordAnalyzer )。 Analyzers are intended to split strings into tokens. The ... -
Java中的最高整数相当高,您可以使用Integer.MAX_VALUE作为限制。 在实际达到2 ^ 31-1(2,147,483,647)个文件的限制之前,我打赌其他东西会中断。 :-) 或者,您可以使用HitCollector : search(Query query, HitCollector results)或search(Query query, Filter filter, HitCollector results) ; 文档说: 应用程序只应在需要所有匹配文档时使用 The highest i ...