搜索思路:构建IndexSearcher对象searcher -> 构建Query对象q,new TermQuery(Term t) -> 执行查询,searcher.search(q) -> 返回Hits类型结果。
基本概念:
IndexSearcher:索引器;
Query:抽象类,表示一个查询请求;
Hits:表示一次查询结果,其内部具有缓存机制;
TermQuery:词条搜索,继承Query;
BooleanQuery:布尔搜索,继承Query,可以包含多个子搜索(如词条搜索),使用add(Query q, BooleanClause.Occur b)方法把子搜索加入布尔搜索,子搜索间使用“与”,“或”等布尔逻辑进行组合;
RangeQuery:范围搜索,范围可以是日期时间数字大小等,需要创建上界和下界两个Term实例;
PrefixQuery:前缀搜索;
PraseQuery:短语搜索,使用add(new Term(String Feild, String keyword))方法把拆分后的短语加入短语搜索,可以使用setSlop(int s)设置坡度,默认是0;
MultiPhraseQuery:多短语搜索;
FuzzyQuery:模糊搜索;
WildcardQuery:通配符搜索,*代表0个或多个字符,?代表1个字符;
**QueryParse:自动构造合适的Query;
分词:将一个文本拆分为多个词条;
标准的分析器:由两部分组成,一部分是分词器(Tokenizer),另一部分是过滤器(TokenFilter),一个分析器由一个分词器和若干个过滤器组成;
StandarAnalyzer:标准分析器,使用了标准分词器(StandarTokenizer)和三个过滤器(StandarFilter,LowerCaseFilter,StopFilter);
StandarFilter:标准过滤器,对中文的意义不大,主要针对欧美文字;
LowerCaseFilter:大小写转换器,同样是针对欧美文字;
StopFilter:忽略词过滤器,用于忽略某些词,在构造其实例的时候,需要传入一个忽略词集合;
IndexSearcher构造函数:
1、IndexSearcher(String path) throws Exception
2、IndexSearcher(Directory dir) throws Exception
3、IndexSearcher(IndexReader r)
4、三个构造函数的参数都表示索引所在的目录;
TermQuery构造函数:
new TermQuery(new Term("field", "keyword"));
BooleanQuery构造函数:
new BooleanQuery();
RangeQuery构造函数:
new RangeQuery(Term begin, Term end, Boolean b); //布尔值代表开区间或闭区间
PhraseQuery构造函数:
new PhraseQuery();
FuzzyQuery构造函数:
new FuzzyQuery(new Term(String field, String keyword));
WildcardQuery构造函数:
new WildcardQuery(new Term(String field, String keyword));
QueryParse构造函数:
new QueryParse(String field, new Analyzer());
BooleanClause.Occur的三个常量:
1、BooleanClause.Occur.MUST:一定符合该搜索
2、BooleanClause.Occur.MUST_NOT:一定不符合该搜索
3、BooleanClause.Occur.SHOULD:可以符合可以不符合该搜索
注意:
1、BooleanQuery默认的最大子搜索数量为1024,超过会抛出异常;
2、对于大的索引文件时,RangeQuery效率很低;
3、建立索引使用的分析器和用户搜索请求使用的分析器应该是同一个,或是具有相同的分词效果。