您的位置:首页 > 其它

Lucene学习笔记之(五)lucene的特殊查询

2016-07-30 10:50 411 查看
步骤一:创建maven现目



步骤二:配置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"));
}
}


图四:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息