Dec 3
Lucene.net 搜索技巧总结
lucene
- public class Test{
- Analyzer analyzer = new StandardAnalyzer();
- RAMDirectory directory = new RAMDirectory();
- /**
- * 创建索引
- *
- * @throws IOException
- */
- public void index() throws IOException{
- IndexWriter indexWriter = new IndexWriter(directory,analyzer,true);
- Document doc1 = new Document();
- doc1.add(new Field("title","aaabbb",Store.YES,Index.TOKENIZED));
- doc1.add(new Field("content","If you would like to help promote OpenOffice",Store.YES,Index.TOKENIZED));
- doc1.add(new Field("time","2005",Store.YES,Index.TOKENIZED));
- indexWriter.addDocument(doc1);
- Document doc2 = new Document();
- doc2.add(new Field("title","bbcc",Store.YES,Index.TOKENIZED));
- doc2.add(new Field("content","sdfsdfsdfasdds",Store.YES,Index.TOKENIZED));
- doc2.add(new Field("time","2007",Store.YES,Index.TOKENIZED));
- indexWriter.addDocument(doc2);
- indexWriter.optimize();
- indexWriter.close();
- }
- // 按词条搜索
- public void termSearcher() throws IOException{
- IndexSearcher searcher = new IndexSearcher(directory);
- // 查询title中包含aaa
- Term term = new Term("title","aaa");
- Query query = new TermQuery(term);
- searcher.search(query);
- searcher.close();
- }
- // 短语搜索
- public void phraseSearcher() throws IOException{
- IndexSearcher searcher = new IndexSearcher(directory);
- PhraseQuery phraseQuery = new PhraseQuery();
- // slop 两个项的位置之间允许的最大间隔,这里would和help中间只隔了like(to会被去掉),所以最大间隔设为1就能找到值
- // 对于两个相连的关键词来说,无论坡度设为多少,都可以找到
- // 对于不相连的词来说,当两个关键词相隔数小于坡度都可以找到,否则找不到
- phraseQuery.setSlop(1);
- phraseQuery.add(new Term("content","would"));
- phraseQuery.add(new Term("content","help"));
- // 如果将help放前面,would放后面,需要将would向后移动3个位置才能到help后面(to不算),所以要设为slop最少要设为3
- // phraseQuery.add(new Term("content","help"));
- // phraseQuery.add(new Term("content","would"));
- // phraseQuery.setSlop(3);
- // 短语的评分是根据项之间距离越小,评分越高,否则越小
- Hits hits = searcher.search(phraseQuery);
- printResult(hits);
- searcher.close();
- }
- // 通配符搜索 WildcardQuery
- // 通配符包括’?’匹配一个任意字符和’*’匹配零个或多个任意字符,例如你搜索’use*’,你可能找到’user’或者’uses’:
- public void wildcardSearcher() throws IOException{
- IndexSearcher searcher = new IndexSearcher(directory);
- // 与正则一样,*代表0个或多个字母,?代表0个或一个字母
- // WildcardQuery与QueryParser不同的是:WildcardQuery的前缀可以为*,而QueryParser不行
- WildcardQuery query = new WildcardQuery(new Term("content","a?bbb*"));
- Hits hits = searcher.search(query);
- printResult(hits);
- searcher.close();
- }
- // 模糊搜索 FuzzyQuery
- public void fuzzySearcher() throws IOException{
- IndexSearcher search = new IndexSearcher(directory);
- // OpenOffica虽然没被索引,但能找到相近的OpenOffice
- FuzzyQuery query = new FuzzyQuery(new Term("content","OpenOffica"));
- Hits hits = search.search(query);
- printResult(hits);
- search.close();
- }
- // 使用前缀PrefixQuery
- public void prefixSearcher() throws IOException{
- IndexSearcher search = new IndexSearcher(directory);
- // 全部title前缀为a
- PrefixQuery query = new PrefixQuery(new Term("title","b"));
- Hits hits = search.search(query);
- printResult(hits);
- search.close();
- }
- // 范围搜索 RangeQuery
- public void rangeSearcher() throws IOException{
- IndexSearcher search = new IndexSearcher(directory);
- // RangeQuery query = new RangeQuery(beginTime, endTime, false);
- // 开始时间,结束时间,最后一个参数表示是否包含边界条件本身,如果为false
- RangeQuery query = new RangeQuery(new Term("time","2005"),new Term("time","2007"),true);
- Hits hits = search.search(query);
- printResult(hits);
- search.close();
- }
- // 与或搜索BooleanQuery
- //BooleanClause用于表示布尔查询子句关系的类,包括:BooleanClause.Occur.MUST,BooleanClause.Occur.MUST_NOT,BooleanClause.Occur.SHOULD。有以下6种组合:
- //1.MUST和MUST:取得连个查询子句的交集。
- //2.MUST和MUST_NOT:表示查询结果中不能包含MUST_NOT所对应得查询子句的检索结果。
- //3.MUST_NOT和MUST_NOT:无意义,检索无结果。
- //4.SHOULD与MUST、SHOULD与MUST_NOT:SHOULD与MUST连用时,无意义,结果为MUST子句的检索结果。与MUST_NOT连用时,功能同MUST。
- //5.SHOULD与SHOULD:表示“或”关系,最终检索结果为所有检索子句的并集。
- public void booleanSearcher() throws IOException, ParseException{
- IndexSearcher search = new IndexSearcher(directory);
- QueryParser qp1 = new QueryParser("title",new StandardAnalyzer());
- Query query1 = qp1.parse("aa*");
- QueryParser qp2 = new QueryParser("title",new StandardAnalyzer());
- Query query2 = qp2.parse("bb*");
- BooleanQuery query = new BooleanQuery();
- // 搜索结果的title的前双缀可以是aa,或bb
- query.add(query1, BooleanClause.Occur.SHOULD);
- // BooleanClause.Occur.MUST 必须
- // BooleanClause.Occur.MUST_NOT 必须不是
- query.add(query2, BooleanClause.Occur.SHOULD);
- Hits hits = search.search(query);
- printResult(hits);
- search.close();
- }
- // 多关键的搜索 PhrasePrefixQuery
- public void phrasePrefixSearcher() throws IOException{
- IndexSearcher search = new IndexSearcher(directory);
- PhrasePrefixQuery query = new PhrasePrefixQuery();
- // 这里两项都有可能首先被匹配
- query.add(new Term[]{new Term("content","would"),new Term("content","can")});
- // 只有一项必须匹配
- query.add(new Term("content","help"));
- // If you would like to help promote OpenOffice
- // can I help you
- // slop因子的作用域为查询中的所有短语
- query.setSlop(1);
- // 匹配第一项为 would 或 can 第二项为help
- // solp设置为1
- // If you would like to help promote OpenOffice 除去if to 外,would与help的距离=1
- // can I help you 的距离也=1 所以可以搜索出两条数据
- Hits hits = search.search(query);
- printResult(hits);
- search.close();
- }
- // 在多个域上查询 MultiFieldQueryParser
- public void multiFieldSearcher() throws IOException, ParseException{
- IndexSearcher search = new IndexSearcher(directory);
- // 默认情况下的方式为Occur.SHOULD
- // titile可以匹配bb,content可以匹配you
- // MultiFieldQueryParser.parse(new String[]{"bb","you"},new String[]{"title","content"}, analyzer);
- // titile必须匹配bb,content不能匹配
- Query query = MultiFieldQueryParser.parse( new String[]{"bb","you"},new String[]{"title","content"},new BooleanClause.Occur[]{Occur.MUST,Occur.MUST_NOT}, analyzer);
- // title中必须包含bb content不能有bb
- // Query query = MultiFieldQueryParser.parse( "bb*",new String[]{"title","content"},new BooleanClause.Occur[]{BooleanClause.Occur.MUST,BooleanClause.Occur.MUST_NOT}, analyzer);
- Hits hits = search.search(query);
- printResult(hits);
- search.close();
- }
- public void printResult(Hits hits) throws IOException{
- for(int i = 0; i < hits.length(); i++){
- Document d = hits.doc(i);
- System.out.println(d.get("title"));
- System.out.println(d.get("content"));
- System.out.println(d.get("time"));
- }
- }
- }
2012-1-5 7:22:01 回复该留言
现在是7点,卷扬机好吧,可能是8点了。
从长征医院刚回来,很依依不舍。
到家第一件事情就是遛狗。
然后给自己卷扬机煮了泡面。
憧憬下下个礼拜。还真的有点恐惧。
老爷在日本,老妈卷扬机在医院。
或许这就是命吧。
我该试着摆脱悲观的思想,去保持乐观的心态面对这一切。
明天5点就要起卷扬机床去医院了。
然后上班-下班-医院-家,4点一线。
好累的时候,总是想有个人,可以陪着自己。
但也只是想想而已。
注定一个人,面对的事情,就锝一个人面对。
躲不过,再害怕,也建筑卷扬......70
2012-1-19 13:48:11 回复该留言
网上看了很多讲如何念佛经的文章卷扬机,感觉太繁琐,有些误导。
我学佛念佛经时间不是很长,但就这个想说说自己的看法。互相参考吧。
首先,念的是佛经卷扬机,自然先要选一篇经文,我们可以找自己脑中能想到的,或是选一篇自己看了后感觉能看进去,不费劲的就是说跟我们有缘的。如果脑中没有哪篇经文、也没找到自己看着舒服的,推荐你选《金刚经》或《心经》。佛说法四十九年,说般若二十卷扬机二年。而所说《大般若经》六百卷,亦为《藏经》中最大之部。概括起来后就是一部《金刚经》,另《心经》虽二百余字,能包六百卷《大般若》义,毫无遗漏。
选好经文,先要注意,只念佛经原文,后人在经文前后加的......63
2012-1-29 2:43:16 回复该留言
这几天老是看到一些朋友因为感情的事情困扰自己的生活.
看着依然,娃娃,耳朵因为这些哭,这些伤怀.其实很想说,既然如此苦,干嘛不放弃.
可是依然话到嘴边却又退却.最后只是变成了安慰她们的话语..
唉,我跟老婆说何必执着..真的是何苦自己去困扰自己..累就退出嘛..干嘛为难自己..
女生.本来就是卷扬机要自己心疼自己的.如果你自己都不懂得照顾自己.还能依靠谁来照顾你..
也许老婆说的对.并不是所有人都能和我一样的想法.
只不过希望.大家都可以不要那么执着..真的是属于你的.无论是谁都不可能拿得走..
不是自己的.去强求.不过是用一把刀让自己的心刻上更深的痕迹..
......94
2012-2-1 23:01:03 回复该留言
无可奈何之小强
因为气候的原因吧,重庆的小强异常多,住过两三个地方,无论旧房子或者新房子,抑或3楼还是30楼,小强总是如影随形,在深圳住的时候也有这该死的东西。或许是自己家乡几乎没有出现过这种东西,以前卷扬机也只是在电视上见过而已,当自己真的直面这小强的时候完全体会不到在周星驰看来那么可爱的小强,自己觉得恶心至极。在厨房,厕所,甚至卧室,他们无处不在,到处都有,而且到处爬,也到超市买过建筑卷扬机专门杀小强的药,摆放于各个角落,效果还是有的,第二天便发现厕所躺着几个小强的尸体,觉得恶心,便没有去处理掉,接下来的几天,小强实体在慢慢增多,实在看不下去了,就索性拿水管将他们冲进了下水道,过后......16