lucene 搜索功能介绍(2)

准备工作:数据,生成索引

        private Integer[] ids = {1,2,3};
private String[] citys = {"beijing","shanghai","guangzhou"};
private String[] descs = {
"beijing is a beautiful city",
"shanghai is a city of culture",
"guangzhou is a bulsting city"
};

private Directory dir;

/**
* 获取到IndexWriter的实例
* @return
*/
private IndexWriter getWriter() throws Exception{
// TODO Auto-generated method stub
Analyzer analyzer = new StandardAnalyzer();  //标准分词器
IndexWriterConfig conf = new IndexWriterConfig(analyzer);
IndexWriter writer = new IndexWriter(dir, conf);
return writer;
}

/**
* 生成索引
* @throws Exception
*/
public void index(String indexDir) throws Exception {
//获取到索引输出的目录
dir = FSDirectory.open(Paths.get(indexDir));
IndexWriter writer = getWriter();
//新建document对象  将数据加入
for(int i = 0; i < ids.length; i++){
Document document = new Document();
document.add(new IntField("id", ids[i], Field.Store.YES));
document.add(new StringField("city", citys[i], Field.Store.YES));
document.add(new TextField("desc",descs[i], Field.Store.NO));
writer.addDocument(document);
}
writer.close();
}

public static void main(String[] args) throws Exception {
new Indexer().index("D:\\lucene2");

}

查询方法介绍:指定范围查询 TermRangeQuery

            指定数字范围查询  NumericaRangeQuery

            指定字符串开头查询  PrefixQuery

            组合多条件查询  BooleanQuery

准备工作:

     private Directory dir;
private IndexReader reader;
private IndexSearcher is;

@Before
public void setUp() throws Exception {
dir = FSDirectory.open(Paths.get("D:\\lucene2"));  //索引所在的目录
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(field, lowerTerm, upperTerm, includeLower, includeUpper)
//field  为查询的字段   lowerTerm 为查询的范围最低为    upperTerm 为查询的范围最大为   includeLower  是否包含小写  includeUpper 是否包含大写
TermRangeQuery query = new TermRangeQuery("desc",new BytesRef("a".getBytes()),new BytesRef("c".getBytes()), true, true);

TopDocs hits = is.search(query, 10);
for(ScoreDoc scoreDoc : hits.scoreDocs){
Document document = is.doc(scoreDoc.doc);
System.out.println(document.get("id"));
System.out.println(document.get("city"));
System.out.println(document.get("desc"));
}
}

/**
* 指定数字范围的查询   泛型不匹配时查不到
* @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 document = is.doc(scoreDoc.doc);
System.out.println(document.get("id"));
System.out.println(document.get("city"));
System.out.println(document.get("desc"));
}
}

/**
* 指定字段的以某一个字母开头的查询
* @throws Exception
*/
@Test
public void testPrefixQuery() throws Exception{
PrefixQuery query = new PrefixQuery(new Term("city","s"));
TopDocs hits = is.search(query, 10);
for(ScoreDoc scoreDoc : hits.scoreDocs){
Document document = is.doc(scoreDoc.doc);
System.out.println(document.get("id"));
System.out.println(document.get("city"));
System.out.println(document.get("desc"));
}
}

/**
* 组合多条件查询   MUST为并且   SHOULD为或   MUST_NOT为非
* @throws Exception
*/
@Test
public void testBooleanQuery() throws Exception{
NumericRangeQuery<Integer> query1 = NumericRangeQuery.newIntRange("id", 1, 2, true, true);
PrefixQuery query2 = new PrefixQuery(new Term("city","s"));
BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add(query1, BooleanClause.Occur.MUST);  //两个条件都满足   可以一直加条件
query.add(query2, BooleanClause.Occur.MUST);

TopDocs hits = is.search(query.build(), 10);
for(ScoreDoc scoreDoc : hits.scoreDocs){
Document document = is.doc(scoreDoc.doc);
System.out.println(document.get("id"));
System.out.println(document.get("city"));
System.out.println(document.get("desc"));
}
}

        

猜你喜欢

转载自blog.csdn.net/csdn_wangchen/article/details/79359454