做为lucene的Query工具,QueryParser倒是最重要的一个。简单的说,QueryParser可以根据用户的输入来进行解析,自动构建合适的Query对象。下面简单总结一下它的实现:html
目录web
当用户输入要查询的关键字串后,QueryParser首先会对其进行解析,而这种解析是以词条为基础的。而词条和词条之间呢,则是用空格分开的。多线程
逻辑运算符“AND,OR,NOT”ui
1 String field = “bookname”;//设置一个默认的field 2 String queryStr = “Persist Google”;//用户输入的关键字 3 4 5 //new了一个QueryParser,而且传进去两个参数。 6 //第一个参数是默认要检索的field;(由于在用户没有指定field时,lucene会在默认的field中检索) 7 //第二个参数是用到的分析器;(注意:这里的分析器必定要使用创建索引时的分析器,不然所分词条与索引中的内容不一致,最终致使错误出现!) 8 9 QueryParser parser = new QueryParser(field,new StandardAnalyzer()); 10 11 Query q = parser.parser(queryStr);//执行QueryParser的parser方法
在这里,咱们(用户)所输入的“Persist Google”被QueryParser分析成了“OR”的关系,即检索有“Persist”或者“Google”的文档。这并不是咱们的意愿,咱们要查的是同时含有“Persist”和“Google”文档。那么咱们尝试改变一下QueryParser默认的布尔逻辑。this
1 //上面的代码中只须要加上下面语句便可实现。 2 parser.setDefaultOperator(QueryParser.AND_OPERATOR);
或者,将用户输入的关键字串“Persist Google”改成“Persist AND Google”也能够实现上述要求。spa
咱们输入几个词,QueryParser就会把它解成几个词条。那么当咱们输入一句话的时候,(如:Rome is not built in one day)此时这句话有七个词,咱们并不想把它分红几个词来查询,怎么办呢?固然,lucene的开发者早已经想到了这点,也很人性化的解决了这一个问题,他们说:“给这句话加个引号吧!”。code
1 //咱们则只须要将代码 2 String queryStr = “Rome is not built in one day”; 3 4 //改成以下代码便可。 5 String queryStr = “/"Rome is not built in one day/””;
FuzzyQuery(即模糊匹配)查询。它的用法与其余Query对象倒是大同小异的。不一样的是,FuzzyQuery有一个类似度的概念。咱们不须要深入理解,只须要知道它会去匹配和输入词条类似的其余词条便可。
1 //如:FuzzyQuery默认的类似度为0.5 2 Term t = new Term(“bookname”, “work”); 3 FuzzyQuery query = new FuzzyQuery(t);
用QueryParser的概念对输入关键字进行分析,咱们只须要给输入的关键字加一个符号。如:work~0.2,即把work类似度0.5改成了0.2
1 //在以前的Google中提到的通配符原理亦是如此。 2 Term t = new Term(“bookname”, “wor?”); 3 WildcardQuery q = new WildcardQuery(t); 4 5 //wor?能够被QueryParser识别,表示前三个字母为wor的词条。 6 //即有多是word,work...
1 //此时回去检索发布时间为2010-12-5的全部文档,而且bookname为work 2 String queryStr = “work publishdate:2010-12-5”; 3 QueryParser parser = new QueryParser(“bookname”,new StandardAnalyzer()); 4 Parser.setDefaultOperator(QueryParser.AND_OPERATOR); 5 Query query = parser.parser(queryStr);
七、QueryParser的范围查找(RangeQuery):TO
1 //找出发布日期从2010-12-01到2010-12-05的全部文档 2 String queryStr = “[2010-12-1 TO 2010-12-5]”; 3 QueryParser parser = new QueryParser(“bookname”,new StandardAnalyzer()); 4 Parser.setDefaultOperator(QueryParser.AND_OPERATOR); 5 Query query = parser.parser(queryStr);
八、QueryParser的多域查询MultiFieldQueryParser
1 //如查询多个域, title和content, 要定义一个包含多域的数组 2 String[] fields = {"title","content"}; 3 String queryStr=“计算机” 4 QueryParser queryParser = new MultiFieldQueryParser(Version.LUCENE_36, fields, new StandardAnalyzer()); 5 Query query = queryParser.parse(queryStr);
在Lucene中,还有不少搜索方式,如:多索引搜索MultiSearcher,多线程搜索ParalellMultiSearcher等。用法都基本相似,原理也大同小异,是比较好理解的。
值得关注的是多线程搜索ParalellMultiSearcher,由于若只有单个线程的话,多访问时,总要等上个线程结束,这样反馈时间是很慢的,这里就须要多线程搜索来提升效率。
以上所提到的全部方法均可以互相结合或者嵌套使用,对各类口味的用户都能给予知足,这也正是Lucene的灵活性。