Query及Searcher
搜索是全文检索中最重要的一部分,前面HelloWorld中也发现,Query对象只是一个接口,他有很多子类的实现。在前面直接使用QueryParser的Parse方法来创建Query对象的实例,实际他会根据我们传入的搜索关键字自动解析成需要的查询类型,索引在这里我
public class Lucene_query {
// 索引库文件夹的地址
public String path = "C:\\Users\\MacBook\\Desktop\\web4\\Lucene\\index";
// 查询字符形式
public void testSearch(String keyword) throws Exception {
// 用户输入关键字
// String keyword="hello";
// 索引目录
Directory directory = FSDirectory.open(Paths.get(path));
// 索引读取对象
IndexReader r = DirectoryReader.open(directory);
// 获取搜索对象
IndexSearcher indexSearcher = new IndexSearcher(r);
// 分词器 -StandardAnalyzer (标准分词器) 英文
Analyzer analyzer = new StandardAnalyzer();
// 获取解析查询对象
QueryParser queryParser = new QueryParser("content", analyzer);
// 查询关键字在索引库匹配
Query query = queryParser.parse(keyword);
// 查询搜索 5 查询分页
TopDocs topDocs = indexSearcher.search(query, 5);
// 查出来的总数
System.out.println("总条数:" + topDocs.totalHits);
// 循环查出来的对象
for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
int docId = scoreDoc.doc;
// 通过id获取文档对象
Document doc = indexSearcher.doc(docId);
System.out.println("id:" + doc.get("id") + " content:" + doc.get("content"));
}
}
// 通过查询对象来查询
public void testSearch(Query query) throws Exception {
// 用户输入关键字
// String keyword="hello";
// 索引目录
Directory directory = FSDirectory.open(Paths.get(path));
// 索引读取对象
IndexReader r = DirectoryReader.open(directory);
// 获取搜索对象
IndexSearcher indexSearcher = new IndexSearcher(r);
// 分词器 -StandardAnalyzer (标准分词器) 英文
Analyzer analyzer = new StandardAnalyzer();
// 获取解析查询对象
// QueryParser queryParser = new QueryParser("content", analyzer);
// 查询关键字在索引库匹配
// Query query = queryParser.parse(keyword);
// 查询搜索 5 查询分页
TopDocs topDocs = indexSearcher.search(query, 5);
// 查出来的总数
System.out.println("总条数:" + topDocs.totalHits);
// 循环查出来的对象
for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
int docId = scoreDoc.doc;
// 通过id获取文档对象
Document doc = indexSearcher.doc(docId);
System.out.println("id:" + doc.get("id") + " content:" + doc.get("content"));
}
}
// 高级查询
// Term 单词查询
@Test
public void testTerm() throws Exception {
// 简写方式查询
testSearch("content:hello");
System.out.println("===================================");
// 查询对象查询
Query query = new TermQuery(new Term("content", "hello"));
testSearch(query);
}
// 段落查询
// 整体查询 (当成整体查询)
@Test
public void testPhsee() throws Exception {
// 简写方式查询
testSearch("\"hello java\"");
}
// 通配符查询 * n 个 ? 1个
@Test
public void testwild() throws Exception {
// 简写方式查询
testSearch("luce*e");
}
// 模糊查询(容错查询) ~2 代表 容错几个 最多只能2个
@Test
public void testLike() throws Exception {
// 简写方式查询
testSearch("lucexx~2");
}
// 临近查询
@Test
public void testLj() throws Exception {
// 简写方式查询
testSearch("\"hello world\"~2");
}
// + (must) : 对应的单词必须出现
// - (must_not): 不能出现
// 不写 (should): 可能出现
// 关键字之间的逻辑计算是 AND
// 组合查询
@Test
public void testzh() throws Exception {
// 简写方式查询
testSearch("java hello");
}
}
们也可以直接new一个Query实例来达到不同的搜索效