1.多字段查询
Occur.MUST and
Occur.MUST_NOT not
Occur.SHOULD or
多个关键字默认关系是或。
2.多索引器
1)建立多个索引:使用不同的索引目录,实例化不同的IndexWriter
2)建立多索引搜索器:
Searcher[] searchers = new SEARCHER[2];
Searchers[0] = new IndexSearcher(dir1); //搜索索引目录一
Searchers[1]= new IndexSearcher(dir2);//搜索索引目录二
Searcher searcher = new MultiSearcher(serarchers);
2)建立多索引搜索器:
Searcher[] searchers = new SEARCHER[2];
Searchers[0] = new IndexSearcher(dir1); //搜索索引目录一
Searchers[1]= new IndexSearcher(dir2);//搜索索引目录二
Searcher searcher = new MultiSearcher(serarchers);
3.检索结果评分
- Explanation explanation = indexSearcher.explain(query, docID);
- System.out.println(explanation.toString());
4.lucene优化
(1)setMergeFactor合并因子
决定了一个索引块中包括多少个文档,当硬盘上的索引块达到多少时,将它们合并成一个较大的索引块。当MergeFactor值较大时,生成索引的速度较快。
IndexWriterConfig conf = new IndexWriterConfig(Version.LUCENE_36,analyzer);
LogMergePolicy mergePolicy = new LogByteSizeMergePolicy();
mergePolicy.setMergeFactor(3);
conf.setMergePolicy(mergePolicy);
LogMergePolicy mergePolicy = new LogByteSizeMergePolicy();
mergePolicy.setMergeFactor(3);
conf.setMergePolicy(mergePolicy);
5.各种Query
TermQuery 词条搜索
RangeQuery 范围搜索
Term beginTime=new Term("time","2000");
Term endTime=new Term("time","2050");
RangeQuery query=new RangeQuery(beginTime,endTime,false); //不包含边界值
PrefixQuery前缀搜索
Term prel=new Term("name","wor");
PrefixQuery query=new PrefixQuery(prel);
PhraseQuery 短语搜索
(1)默认坡度为0
PhraseQuery query=new PhraseQuery();
query.add(new Term("bookname","钢"));
query.add(new Term("bookname","铁"));
//搜索"钢铁",而非"钢"和"铁"
(2)坡度为1
PhraseQuery query=new PhraseQuery();
query.add(new Term("bookname","钢"));
query.add(new Term("bookname","铁"));
query.setSlop(1);
//搜索"钢铁",或“钢”、"铁"中一字
MultiPhraseQuery多短语搜索
FuzzyQuery 模糊搜索
FuzzyQuery query=new FuzzyQuery(new Term("content","work"));
FuzzyQuery query=new FuzzyQuery(Term term,float minimumSimilarity);
FuzzyQuery query=new FuzzyQuery(Term term,float minimumSimilarity,int prefixLength)
其中minimumSimilarity为最小相似度,越小则文档的数量越多。默认为0.5,其值必须小于1.0。prefixLength表示要有多少个前缀字母必须完全匹配。
WildcardQuery 通配符搜索
WildcardQuery query=new WildcardQuery(new Term("content","?qq*"));
*表示0到多个字符
?表示一个单一的字符
RegexQuery 正则表达式查询
RegexQuery query=new RegexQuery(new Term("url",regex));
6.各种Analyzer
lucene分析器使用分词器和过滤器构成一个"管道",分词器tokenizer将文本按照规则切分为一个个可以进入索引的小单位,tokenFilter对切出来的词进行进一步的处理(去掉敏感词、英文大小写转换等)。Tokenstream处理Reader对象的流式文本。
WhitespaceAnalyzer
以空格作为切词标准,不对语汇单元进行其他规范化处理。用于处理英文。
WhitespaceAnalyzer wsa=new WhitespaceAnalyzer(Version.LUCENE_40);
TokenStream ts=wsa.tokenStream("field",text);
CharTermAttribute ch=ts.addAttribute(CharTermAttribute.class);
ts.reset();
while(ts.incrementToken())
{
ch.toString();
}
ts.end();
ts.close();
SimpleAnalyzer 简单分词器
以非字母符来分割文本信息,并将语汇单元统一转换为小写形式,并去掉数字类型的字符。
StopAnalyzer 停顿词分词器
停顿词分析器会去掉一些常有的a,the,an等,可以自定义禁用词。
//自定义停用词
String[] self_stop_words={"word1","word2"};
CharArraySet cas=new CharArraySet(Version.LUCENE_40,0,true);
for(int i=0;i<self_stop_words.length;i++)
{
cas.add(self_stop_words[i]);
}
//加入系统默认停用词
Iterator<Object> itor=StopAnalyzer.ENGLISH_STOP_WORDS_SET.iterator();
while(itor.hasNext())
{
cas.add(itor.next());
}
}
StopAnalyzer sa=new StopAnalyzer(Version.LUCENE_40,cas);
TokenStream ts=sa.tokenStream("field",text);
CharTermAttribute ch=ts.addAttribute(CharTermAttribute.class);
ts.reset();
while(ts.incrementToken())
{
ch.toString();
}