搜索单个字段
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
进行通配符搜索。