Lucene实现多种高级搜索形式
布尔操作符
大多数的搜索引擎都会提供布尔操作符让用户可以组合查询,典型的布尔操作符有AND,OR,NOT。Lucene支持5种布尔操作符,分别是AND,OR,NOT,加(+),减(-)。接下来我会讲述每个操作符的用法。
OR:如果你要搜索含有字符A或者B的文档,那么就需要使用OR操作符。需要记住的是,如果你只是简单的用空格将两个关键词分割开,其实在搜索的时候搜索引擎会自动在两个关键词之间加上OR操作符。例如,“JavaORLucene”和“JavaLucene”都是搜索含有Java或者含有Lucene的文档。
AND:如果你需要搜索包含一个以上关键词的文档,那么就需要使用AND操作符。例如,“JavaANDLucene”返回所有既包含Java又包含Lucene的文档。
NOT:Not操作符使得包含紧跟在NOT后面的关键词的文档不会被返回。例如,如果你想搜索所有含有Java但不含有Lucene的文档,你可以使用查询语句“JavaNOTLucene”。但是你不能只对一个搜索词使用这个操作符,比如,查询语句“NOTJava”不会返回任何结果。
加号(+):这个操作符的作用和AND差不多,但它只对紧跟着它的一个搜索词起作用。例如,如果你想搜索一定包含Java,但不一定包含Lucene的文档,就可以使用查询语句“+JavaLucene”。
减号(-):这个操作符的功能和NOT一样,查询语句“Java-Lucene”返回所有包含Java但不包含Lucene的文档。
接下来我们看一下如何利用Lucene提供的API来实现布尔查询。清单1显示了如果利用布尔操作符进行查询的过程。
清单1:使用布尔操作符
//Testbooleanoperator publicvoidtestOperator(StringindexDirectory)throwsException{ Directorydir=FSDirectory.getDirectory(indexDirectory,false); IndexSearcherindexSearcher=newIndexSearcher(dir); String[]searchWords={"JavaANDLucene","JavaNOTLucene","JavaORLucene", "+Java+Lucene","+Java-Lucene"}; Analyzerlanguage=newStandardAnalyzer(); Queryquery; for(inti=0;i
域搜索(FieldSearch)
Lucene支持域搜索,你可以指定一次查询是在哪些域(Field)上进行。例如,如果索引的文档包含两个域,Title和Content,你就可以使用查询“Title:LuceneANDContent:Java”来返回所有在Title域上包含Lucene并且在Content域上包含Java的文档。清单2显示了如何利用Lucene的API来实现域搜索。
清单2:实现域搜索
//Testfieldsearch publicvoidtestFieldSearch(StringindexDirectory)throwsException{ Directorydir=FSDirectory.getDirectory(indexDirectory,false); IndexSearcherindexSearcher=newIndexSearcher(dir); StringsearchWords="title:LuceneANDcontent:Java"; Analyzerlanguage=newStandardAnalyzer(); Queryquery=QueryParser.parse(searchWords,"title",language); Hitsresults=indexSearcher.search(query); System.out.println(results.length()+"searchresultsforquery"+searchWords);
通配符搜索(WildcardSearch)
Lucene支持两种通配符:问号(?)和星号(*)。你可以使用问号(?)来进行单字符的通配符查询,或者利用星号(*)进行多字符的通配符查询。例如,如果你想搜索tiny或者tony,你就可以使用查询语句“t?ny”;如果你想查询Teach,Teacher和Teaching,你就可以使用查询语句“Teach*”。清单3显示了通配符查询的过程。
清单3:进行通配符查询
//Testwildcardsearch publicvoidtestWildcardSearch(StringindexDirectory)throwsException{ Directorydir=FSDirectory.getDirectory(indexDirectory,false); IndexSearcherindexSearcher=newIndexSearcher(dir); String[]searchWords={"tex*","tex?","?ex*"}; Queryquery; for(inti=0;i
模糊查询
Lucene提供的模糊查询基于编辑距离算法(Editdistancealgorithm)。你可以在搜索词的尾部加上字符~来进行模糊查询。例如,查询语句“think~”返回所有包含和think类似的关键词的文档。清单4显示了如果利用Lucene的API进行模糊查询的代码。
清单4:实现模糊查询
//Testfuzzysearch publicvoidtestFuzzySearch(StringindexDirectory)throwsException{ Directorydir=FSDirectory.getDirectory(indexDirectory,false); IndexSearcherindexSearcher=newIndexSearcher(dir); String[]searchWords={"text","funny"}; Queryquery; for(inti=0;i
范围搜索(RangeSearch)
范围搜索匹配某个域上的值在一定范围的文档。例如,查询“age:[18TO35]”返回所有age域上的值在18到35之间的文档。清单5显示了利用Lucene的API进行返回搜索的过程。
清单5:测试范围搜索
//Testrangesearch publicvoidtestRangeSearch(StringindexDirectory)throwsException{ Directorydir=FSDirectory.getDirectory(indexDirectory,false); IndexSearcherindexSearcher=newIndexSearcher(dir); Termbegin=newTerm("birthDay","20000101"); Termend=newTerm("birthDay","20060606"); Queryquery=newRangeQuery(begin,end,true); Hitsresults=indexSearcher.search(query); System.out.println(results.length()+"searchresultsisreturned"); }
以上所述是小编给大家介绍的Lucene实现多种高级搜索形式,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!