Lucene的检索
程序员文章站
2022-05-17 19:39:48
...
Lucene检索
IndexReader:一个抽象类,提供访问索引的接口。检索一个索引是完全通过这个抽象借口来完成的。所以其所有的实现子类都是可搜索的。
其具体子类一般通过调用它的静态方法open来实现。
从性能考虑,在这个API,document会经常通过document号来访问,这个号是一个非负整数,但这些数是暂时的,它们会随着document的添加或删除而改变。所以客户端不应该企图在两个session中用相同的号取得document。
即使一个IndexWriter已经打开,也能再同样的目录上打开IndexReader,但是不能删除document。
IndexReader是线程安全的。
IndexSearcher:应用程序通常只需要调用内部方法search(Query,int)或者search(Query,Filter,int)。从性能方面考虑,如果索引是不经常改变的,你可以共享一个IndexSearcher而不是每次检索都创建一个。如果索引是经常改变的,并且还希望检索改变后的索引,应该调用IndexReader.reopen()获得一个新的reader,然后以此创建一个新的IndexSearcher。当然,为了降低延迟,可以使用实时reader(IndexReader.open(IndexWriter, boolean))。
IndexSearcher是线程安全的。
Term:代表文本中的一个词。它是搜索单元,它由两个元素组成,所搜索的词和这个词可能出现的域(field)
检索可以分为两类:简单搜索和分析搜索
简单搜索就是你所输入的关键词不需要使用分词器进行处理。程序会把所输入的关键字作为一个Term进行搜索。简单搜索的类主要是 Query的实现子类:TermQuery、BooleanQuery、WildcardQuery、PrefixQuery、FuzzyQuery、TermRangeQuery、NumericRangeQuery。
分析搜索就是把所输入的关键词进行分词处理,然后在某个域中查找含有已进行分词处理的关键字的document。PhraseQuery、MultiPhraseQuery。
TermQuery:
检索一个document的某个filed含有关键字
IndexSearcher searcher = new IndexSearcher(FSDirectory.open(new File("D:\\lucene")));
Query query = new TermQuery(new Term("title", keyword));
topDocs = searcher.search(query, searcher.maxDoc());
PrefixQuery:
带前缀搜索,比如输入一个ti,就可以搜索出title的数据
IndexSearcher searcher = new IndexSearcher(FSDirectory.open(new File("D:\\lucene")));
Query query = new PrefixQuery(new Term("title", keyword));
topDocs = searcher.search(query, searcher.maxDoc());
WildcardQuery:
通配符搜索,*代表0个或多个字符,?代表单个字符
IndexSearcher searcher = new IndexSearcher(FSDirectory.open(new File("D:\\lucene")));
Query query = new WildcardQuery(new Term("title", keyword));
topDocs = searcher.search(query, searcher.maxDoc());
FuzzyQuery:
模糊查询,这种查询有个相识度匹配,默认情况下要把keyword检索出来至少需要输入keywo,而输入keyw则不可以
IndexSearcher searcher = new IndexSearcher(FSDirectory.open(new File("D:\\lucene")));
Query query = new FuzzyQuery(new Term("title", keyword));
topDocs = searcher.search(query, searcher.maxDoc());
TermRangeQuery:
查询位于两个term之间的值,比如有titla、titlb、titlc、title。如果起始为titla,结束为title则会把上面的记录都搜索出来
IndexSearcher searcher = new IndexSearcher(FSDirectory.open(new File("D:\\lucene")));
//两个true表示包含起始和结束位置的term
Query query = new TermRangeQuery("title",keyword1, keyword2, true, true);
topDocs = searcher.search(query, searcher.maxDoc());
PhraseQuery:匹配输入特定term序列,有PhraseQuery构建。
NumericRangeQuery:在一个指定的范围内进行数字匹配。这个类只能进行数字检索。如果要进行文字检索则使用TermRangeQuery
BooleanQuery:用于在多个Query语句之间进行有效的配合搜索。
IndexSearcher searcher = new IndexSearcher(FSDirectory.open(new File("D:\\lucene")));
BooleanQuery query = new BooleanQuery();
Query query1 = new TermQuery(new Term("title", keyword));
Query query2 = new TermQuery(new Term("content", keyword));
query.add(query1, BooleanClause.Occur.MUST);
query.add(query2, BooleanClause.Occur.SHOULD);
topDocs = searcher.search(query, searcher.maxDoc());
BooleanClause.Occur.MUST表示所搜索的关键字必须在此子句中出现。
BooleanClause.Occur.SHOULD表示所搜索的关键字可以在此子句中出现。
BooleanClause.Occur.MUST_NOT表示所搜索的关键字不能在此子句中出现。
经过分析器的搜索
在单一域中搜索
IndexReader indexReader = IndexReader.open(FSDirectory.open(new File("D:\\lucene")));
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
QueryParser parser = new QueryParser(Version.LUCENE_34, "title", new StandardAnalyzer(Version.LUCENE_34));
Query query = parser.parse(title);
System.out.println("query:" + query.toString());
topDocs = indexSearcher.search(query, indexSearcher.maxDoc());
在多个域中搜索
IndexSearcher searcher = new IndexSearcher(FSDirectory.open(new File("D:\\lucene")));
//在多个Field中搜索
QueryParser parser = new MultiFieldQueryParser(Version.LUCENE_34, new String[] {"content","title"}, new StandardAnalyzer(Version.LUCENE_34));
Query query = parser.parse(title);
topDocs = searcher.search(query, searcher.maxDoc());
IndexReader:一个抽象类,提供访问索引的接口。检索一个索引是完全通过这个抽象借口来完成的。所以其所有的实现子类都是可搜索的。
其具体子类一般通过调用它的静态方法open来实现。
从性能考虑,在这个API,document会经常通过document号来访问,这个号是一个非负整数,但这些数是暂时的,它们会随着document的添加或删除而改变。所以客户端不应该企图在两个session中用相同的号取得document。
即使一个IndexWriter已经打开,也能再同样的目录上打开IndexReader,但是不能删除document。
IndexReader是线程安全的。
IndexSearcher:应用程序通常只需要调用内部方法search(Query,int)或者search(Query,Filter,int)。从性能方面考虑,如果索引是不经常改变的,你可以共享一个IndexSearcher而不是每次检索都创建一个。如果索引是经常改变的,并且还希望检索改变后的索引,应该调用IndexReader.reopen()获得一个新的reader,然后以此创建一个新的IndexSearcher。当然,为了降低延迟,可以使用实时reader(IndexReader.open(IndexWriter, boolean))。
IndexSearcher是线程安全的。
Term:代表文本中的一个词。它是搜索单元,它由两个元素组成,所搜索的词和这个词可能出现的域(field)
检索可以分为两类:简单搜索和分析搜索
简单搜索就是你所输入的关键词不需要使用分词器进行处理。程序会把所输入的关键字作为一个Term进行搜索。简单搜索的类主要是 Query的实现子类:TermQuery、BooleanQuery、WildcardQuery、PrefixQuery、FuzzyQuery、TermRangeQuery、NumericRangeQuery。
分析搜索就是把所输入的关键词进行分词处理,然后在某个域中查找含有已进行分词处理的关键字的document。PhraseQuery、MultiPhraseQuery。
TermQuery:
检索一个document的某个filed含有关键字
IndexSearcher searcher = new IndexSearcher(FSDirectory.open(new File("D:\\lucene")));
Query query = new TermQuery(new Term("title", keyword));
topDocs = searcher.search(query, searcher.maxDoc());
PrefixQuery:
带前缀搜索,比如输入一个ti,就可以搜索出title的数据
IndexSearcher searcher = new IndexSearcher(FSDirectory.open(new File("D:\\lucene")));
Query query = new PrefixQuery(new Term("title", keyword));
topDocs = searcher.search(query, searcher.maxDoc());
WildcardQuery:
通配符搜索,*代表0个或多个字符,?代表单个字符
IndexSearcher searcher = new IndexSearcher(FSDirectory.open(new File("D:\\lucene")));
Query query = new WildcardQuery(new Term("title", keyword));
topDocs = searcher.search(query, searcher.maxDoc());
FuzzyQuery:
模糊查询,这种查询有个相识度匹配,默认情况下要把keyword检索出来至少需要输入keywo,而输入keyw则不可以
IndexSearcher searcher = new IndexSearcher(FSDirectory.open(new File("D:\\lucene")));
Query query = new FuzzyQuery(new Term("title", keyword));
topDocs = searcher.search(query, searcher.maxDoc());
TermRangeQuery:
查询位于两个term之间的值,比如有titla、titlb、titlc、title。如果起始为titla,结束为title则会把上面的记录都搜索出来
IndexSearcher searcher = new IndexSearcher(FSDirectory.open(new File("D:\\lucene")));
//两个true表示包含起始和结束位置的term
Query query = new TermRangeQuery("title",keyword1, keyword2, true, true);
topDocs = searcher.search(query, searcher.maxDoc());
PhraseQuery:匹配输入特定term序列,有PhraseQuery构建。
NumericRangeQuery:在一个指定的范围内进行数字匹配。这个类只能进行数字检索。如果要进行文字检索则使用TermRangeQuery
BooleanQuery:用于在多个Query语句之间进行有效的配合搜索。
IndexSearcher searcher = new IndexSearcher(FSDirectory.open(new File("D:\\lucene")));
BooleanQuery query = new BooleanQuery();
Query query1 = new TermQuery(new Term("title", keyword));
Query query2 = new TermQuery(new Term("content", keyword));
query.add(query1, BooleanClause.Occur.MUST);
query.add(query2, BooleanClause.Occur.SHOULD);
topDocs = searcher.search(query, searcher.maxDoc());
BooleanClause.Occur.MUST表示所搜索的关键字必须在此子句中出现。
BooleanClause.Occur.SHOULD表示所搜索的关键字可以在此子句中出现。
BooleanClause.Occur.MUST_NOT表示所搜索的关键字不能在此子句中出现。
经过分析器的搜索
在单一域中搜索
IndexReader indexReader = IndexReader.open(FSDirectory.open(new File("D:\\lucene")));
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
QueryParser parser = new QueryParser(Version.LUCENE_34, "title", new StandardAnalyzer(Version.LUCENE_34));
Query query = parser.parse(title);
System.out.println("query:" + query.toString());
topDocs = indexSearcher.search(query, indexSearcher.maxDoc());
在多个域中搜索
IndexSearcher searcher = new IndexSearcher(FSDirectory.open(new File("D:\\lucene")));
//在多个Field中搜索
QueryParser parser = new MultiFieldQueryParser(Version.LUCENE_34, new String[] {"content","title"}, new StandardAnalyzer(Version.LUCENE_34));
Query query = parser.parse(title);
topDocs = searcher.search(query, searcher.maxDoc());