Lucene(5)—索引查询

搜索单个字段

 Path path = Paths.get("D:\\engine");

 Directory directory = FSDirectory.open(path);

 IndexReader reader = DirectoryReader.open(directory);

 IndexSearcher searcher = new IndexSearcher(reader);
 // 分词器必须和创建的时候一样
 Analyzer analyzer = new StandardAnalyzer();
 // 其中 id 为默认搜索域
 QueryParser queryParser = new QueryParser("id",analyzer);

 Query query = queryParser.parse("title:Serving");
 // 一共查询10条
 TopDocs topDocs = searcher.search(query, 10);

 ScoreDoc[] scoreDocs = topDocs.scoreDocs;

 System.out.println(searcher);

 for (ScoreDoc scoreDoc : scoreDocs) {
     Document doc = searcher.doc(scoreDoc.doc);
     System.out.println("docId======>"+ scoreDoc.doc);
     System.out.println("id======>"+ doc.get("id"));
     System.out.println("title======>"+ doc.get("title"));
     System.out.println("content======>"+ doc.get("content"));
     System.out.println("reply======>"+ doc.get("reply"));
 }

搜索多个字段

使用 MultiFieldQueryParser 可进行多个字段查询。

词项搜索

使用 TermQuery 进行查询。

Path path = Paths.get("D:\\engine");

Directory directory = FSDirectory.open(path);

IndexReader reader = DirectoryReader.open(directory);

IndexSearcher searcher = new IndexSearcher(reader);

Term term = new Term("content","with");

TermQuery query = new TermQuery(term);

TopDocs topDocs = searcher.search(query, 10);

ScoreDoc[] scoreDocs = topDocs.scoreDocs;

System.out.println(searcher);

for (ScoreDoc scoreDoc : scoreDocs) {
    Document doc = searcher.doc(scoreDoc.doc);
    System.out.println("docId======>" + scoreDoc.doc);
    System.out.println("id======>" + doc.get("id"));
    System.out.println("title======>" + doc.get("title"));
    System.out.println("content======>" + doc.get("content"));
    System.out.println("reply======>" + doc.get("reply"));
}

布尔搜索

使用 BooleanQuery 进行查询。它是一个组合的查询,使用时可以把各种 Query 对象添加进去并标明它们之间的逻辑关系。

Path path = Paths.get("D:\\engine");

Directory directory = FSDirectory.open(path);

IndexReader reader = DirectoryReader.open(directory);

IndexSearcher searcher = new IndexSearcher(reader);

TermQuery contentTermQuery =new TermQuery(new Term("content","page"));

TermQuery titleTermQuery = new TermQuery(new Term("title","web"));

BooleanClause contentClause = new BooleanClause(contentTermQuery, BooleanClause.Occur.MUST);
BooleanClause titleClause = new BooleanClause(titleTermQuery, BooleanClause.Occur.MUST);

BooleanQuery booleanQuery = new BooleanQuery.Builder().add(contentClause).add(titleClause).build();

TopDocs topDocs = searcher.search(booleanQuery, 10);

ScoreDoc[] scoreDocs = topDocs.scoreDocs;

System.out.println(searcher);

for (ScoreDoc scoreDoc : scoreDocs) {
    Document doc = searcher.doc(scoreDoc.doc);
    System.out.println("docId======>" + scoreDoc.doc);
    System.out.println("id======>" + doc.get("id"));
    System.out.println("title======>" + doc.get("title"));
    System.out.println("content======>" + doc.get("content"));
    System.out.println("reply======>" + doc.get("reply"));
}

范围搜索

使用 IntPoint.newRangeQuery 进行范围查询。

Path path = Paths.get("D:\\engine");

Directory directory = FSDirectory.open(path);

IndexReader reader = DirectoryReader.open(directory);

IndexSearcher searcher = new IndexSearcher(reader);

TermQuery contentTermQuery =new TermQuery(new Term("content","page"));

TermQuery titleTermQuery = new TermQuery(new Term("title","web"));

Query rangeQuery = IntPoint.newRangeQuery("reply", 700, 2000);

BooleanClause contentClause = new BooleanClause(contentTermQuery, BooleanClause.Occur.MUST);
BooleanClause titleClause = new BooleanClause(titleTermQuery, BooleanClause.Occur.MUST);
BooleanClause replyClause = new BooleanClause(rangeQuery, BooleanClause.Occur.MUST);

BooleanQuery booleanQuery = new BooleanQuery.Builder().add(contentClause).add(titleClause).add(replyClause).build();

TopDocs topDocs = searcher.search(booleanQuery, 10);

ScoreDoc[] scoreDocs = topDocs.scoreDocs;

System.out.println(searcher);

for (ScoreDoc scoreDoc : scoreDocs) {
    Document doc = searcher.doc(scoreDoc.doc);
    System.out.println("docId======>" + scoreDoc.doc);
    System.out.println("id======>" + doc.get("id"));
    System.out.println("title======>" + doc.get("title"));
    System.out.println("content======>" + doc.get("content"));
    System.out.println("reply======>" + doc.get("reply"));
}

使用 如下方式创建索引

StoredField replyField = new StoredField("reply_copy", ne.getReply());
IntPoint intPoint = new IntPoint("reply", ne.getReply());

前缀搜索

使用 PrefixQuery 进行前缀搜索。用来查询以什么开头的。

多关键字搜索

使用 PhraseQuery 进行多关键字搜索。

模糊搜索

使用 FuzzyQuery 进行模糊搜索。

通配符搜索

使用 WildcardQuery 进行通配符搜索。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值