Lucene学习笔记之(五)lucene的特殊查询
2016-07-30 10:50
411 查看
步骤一:创建maven现目
步骤二:配置pom.xml文件,代码如下:
步骤三:开始建包写代码
效果显示如下:
写索引成功,那就是根据所以 来进行 特殊查询!代码如下:
图一:
图二:
图四:
步骤二:配置pom.xml文件,代码如下:
<pre name="code" class="java"> <!-- junit包 因为是java程序,,需要用到@Test,这就是他的jar包下载。--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <!-- lucene核心包 以下这三个是用在lucene的全部jar包,core是核心包,queryparser是查询jar包。 查询被索引文件如果是全英文的情况下,pom.xml文件写这三个,就欧了!--> <dependency> <groupId>org.apache.lucene</groupId> <artifactId>lucene-core</artifactId> <version>5.3.1</version> </dependency> <!-- 查询解析器 --> <dependency> <groupId>org.apache.lucene</groupId> <artifactId>lucene-queryparser</artifactId> <version>5.3.1</version> </dependency> <!-- 分析器 --> <dependency> <groupId>org.apache.lucene</groupId> <artifactId>lucene-analyzers-common</artifactId> <version>5.3.1</version> </dependency> <!-- 很明显,这个是查询被检索文件为全中文的情况下, 加上以上的三个,再加上这两个就行了。 值得提一下,“高亮显示”的jar包可加可不加, 在这里面加上,是因为这个在后面会用到。 但是还是建议大家把这个加上,懂得多也不是个错。 --> <!-- 中文分词查询器smartcn --> <dependency> <groupId>org.apache.lucene</groupId> <artifactId>lucene-analyzers-smartcn</artifactId> <version>5.3.1</version> </dependency> <!-- 高亮显示 --> <dependency> <groupId>org.apache.lucene</groupId> <artifactId>lucene-highlighter</artifactId> <version>5.3.1</version> </dependency>
步骤三:开始建包写代码
//显示向文档里写索引 //********Indexer Start************************ import java.nio.file.Paths; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.document.IntField; import org.apache.lucene.document.StringField; 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; public class Indexer { private Integer ids[]={1,2,3}; private String citys[]={"aingdao","banjing","changhai"}; private String descs[]={ "Qingdao is b beautiful city.", "Nanjing is c city of culture.", "Shanghai is d bustling city." }; private Directory dir; /** *实例化indexerWriter * @return * @throws Exception */ private IndexWriter getWriter()throws Exception{ Analyzer analyzer=new StandardAnalyzer(); IndexWriterConfig iwc=new IndexWriterConfig(analyzer); IndexWriter writer=new IndexWriter(dir, iwc); return writer; } /** * 获取indexDir * @param indexDir * @throws Exception */ private void index(String indexDir)throws Exception{ dir=FSDirectory.open(Paths.get(indexDir)); IndexWriter writer=getWriter(); for(int i=0;i<ids.length;i++){ Document doc=new Document(); doc.add(new IntField("id", ids[i], Field.Store.YES)); doc.add(new StringField("city",citys[i],Field.Store.YES)); doc.add(new TextField("desc", descs[i], Field.Store.YES)); writer.addDocument(doc); } writer.close(); } public static void main(String[] args) throws Exception { new Indexer().index("E:\\luceneDemo5"); System.out.println("写索引成功!"); } } //********Indexer End************************
效果显示如下:
写索引成功,那就是根据所以 来进行 特殊查询!代码如下:
import java.nio.file.Paths; import org.apache.lucene.document.Document; import org.apache.lucene.index.DirectoryReader; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.Term; import org.apache.lucene.search.BooleanClause; import org.apache.lucene.search.BooleanQuery; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.NumericRangeQuery; import org.apache.lucene.search.PrefixQuery; import org.apache.lucene.search.ScoreDoc; import org.apache.lucene.search.TermRangeQuery; import org.apache.lucene.search.TopDocs; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; import org.apache.lucene.util.BytesRef; import org.junit.After; import org.junit.Before; import org.junit.Test; public class SearchTest { private Directory dir; private IndexReader reader; private IndexSearcher is; @Before public void setUp() throws Exception { dir=FSDirectory.open(Paths.get("E:\\luceneDemo5")); reader=DirectoryReader.open(dir); is=new IndexSearcher(reader); } @After public void tearDown() throws Exception { reader.close(); } /** * ָ指定项范围查询 TermRangeQuery ;(对应图一) * @throws Exception */ @Test public void testTermRangeQuery()throws Exception{ //核心句 TermRangeQuery query=new TermRangeQuery("desc", new BytesRef("b".getBytes()), new BytesRef("c".getBytes()), true, true); TopDocs hits=is.search(query, 10); for(ScoreDoc scoreDoc:hits.scoreDocs){ Document doc=is.doc(scoreDoc.doc); System.out.println(doc.get("id")); System.out.println(doc.get("city")); System.out.println(doc.get("desc")); } } }效果如下:
图一:
/** * 指定数字范围查询 NumericRangeQuery ;(对应图二) * @throws Exception */ @Test public void testNumericRangeQuery()throws Exception{ //核心句 //第三个参数:是否包含最小开始数;第四个参数:是否包含最大结束数 NumericRangeQuery<Integer> query=NumericRangeQuery.newIntRange("id", 1, 2, true, true); TopDocs hits=is.search(query, 10); for(ScoreDoc scoreDoc:hits.scoreDocs){ Document doc=is.doc(scoreDoc.doc); System.out.println(doc.get("id")); System.out.println(doc.get("city")); System.out.println(doc 4000 .get("desc")); } }
图二:
/** * 指定字符串开头搜索 PrefixQuery ;(对应图三) * @throws Exception */ @Test public void testPrefixQuery()throws Exception{ //运用term来查找 PrefixQuery query=new PrefixQuery(new Term("city","c")); TopDocs hits=is.search(query, 10); for(ScoreDoc scoreDoc:hits.scoreDocs){ Document doc=is.doc(scoreDoc.doc); System.out.println(doc.get("id")); System.out.println(doc.get("city")); System.out.println(doc.get("desc")); } }图三:
/** * 组合查询 BooleanQuery (对应图四) * @throws Exception */ @Test public void testBooleanQuery()throws Exception{ //指定数字范围查询 NumericRangeQuery ; NumericRangeQuery<Integer> query1=NumericRangeQuery.newIntRange("id", 1, 2, true, true); //指定字符串开头搜索 PrefixQuery ; PrefixQuery query2=new PrefixQuery(new Term("city","a")); //核心句 BooleanQuery.Builder booleanQuery=new BooleanQuery.Builder(); //把多条件查询的query都加到BooleanQuery中去 /** * FILTER:是否统计的意思,一般不常用; * MUST:相当于 and,同时满足条件; * MUST_NOT:相当于not; * SHOULD:相当于or,两者满足一个条件即可查出 */ booleanQuery.add(query1,BooleanClause.Occur.MUST); booleanQuery.add(query2,BooleanClause.Occur.MUST); TopDocs hits=is.search(booleanQuery.build(), 10); for(ScoreDoc scoreDoc:hits.scoreDocs){ Document doc=is.doc(scoreDoc.doc); System.out.println(doc.get("id")); System.out.println(doc.get("city")); System.out.println(doc.get("desc")); } }
图四:
相关文章推荐
- 搜狗百度360市值齐跌:搜索引擎们陷入集体焦虑?
- 本人即将筹备败家日志,敬请期待!
- IE:使用搜索助手
- PostgreSQL教程(八):索引详解
- Oracle外键不加索引引起死锁示例
- oracle 索引的相关介绍(创建、简介、技巧、怎样查看) .
- 用SQL建立索引的方法步骤
- SQL2005重新生成索引的的存储过程 sp_rebuild
- SQL效率提升之一些SQL编写建议并有效利用索引
- SQLSERVER的非聚集索引结构深度理解
- SQL Server误区30日谈 第8天 有关对索引进行在线操作的误区
- SQL Server 索引介绍
- SqlServer 索引自动优化工具
- mysql 中存在null和空时创建唯一索引的方法
- 详解sqlserver查询表索引
- C#生成Word文档代码示例
- 如何使用C#从word文档中提取图片
- 优化 SQL Server 索引的小技巧
- sqlserver 索引的一些总结
- MySQL下使用Inplace和Online方式创建索引的教程