Lucene实现多种高级搜索形式

  

  

大多数的搜索引擎都会提供布尔操作符让用户可以组合查询,典型的布尔操作符有,或者,NOT.Lucene支持5种布尔操作符,分别是,或者不是,加(+)、减(-)。接下来我会讲述每个操作符的用法。

  

或者:如果你要搜索含有字符一个或者B的文档,那么就需要使用或操作符。需要记住的是,如果你只是简单的用空格将两个关键词分割开,其实在搜索的时候搜索引擎会自动在两个关键词之间加上或操作符。例如,“Java或Lucene”和“Java Lucene”都是搜索含有Java或者含有Lucene的文档。
  

  

和:如果你需要搜索包含一个以上关键词的文档,那么就需要使用,操作符。例如,“Java Lucene”返回所有既包含Java又包含Lucene的文档。

  

:不是操作符使得包含紧跟在不后面的关键词的文档不会被返回。例如,如果你想搜索所有含有Java但不含有Lucene的文档,你可以使用查询语句“Java Lucene”。但是你不能只对一个搜索词使用这个操作符,比如,查询语句“不是Java”不会返回任何结果。

  

加号(+):这个操作符的作用和、差不多,但它只对紧跟着它的一个搜索词起作用,例如,如果你想搜索一定包含Java,但不一定包含Lucene的文档,就可以使用查询语句“+ Java Lucene”

。   

减号(-):这个操作符的功能和不是一样,查询语句“Java Lucene”返回所有包含Java但不包含Lucene的文档。

  

接下来我们看一下如何利用Lucene提供的API来实现布尔查询。清单1显示了如果利用布尔操作符进行查询的过程。

  

<强>清单1:使用布尔操作符

     //测试布尔操作符   公共空间testOperator(字符串indexDirectory) throwsException {   目录dir=FSDirectory.getDirectory (indexDirectory、假);   IndexSearcher IndexSearcher=new IndexSearcher (dir);   String [] searchWords={" Java Lucene”,“Java Lucene”、“JavaOR Lucene”,   “Java Lucene + +”、“+ Java Lucene "};   分析仪类语言=new StandardAnalyzer ();   查询查询;   for (int i=0;我& lt;searchWords.length;我+ +){   查询=QueryParser。解析(searchWords[我],“标题”,语言);   点击结果=indexSearcher.search(查询);   System.out.println (results.length() +“查询搜索结果”+ searchWords[我]);}& lt; p> & lt;/p>   & lt; p> & lt;/p>      


  

  

Lucene支持域搜索,你可以指定一次查询是在哪些域(领域)上进行。例如,如果索引的文档包含两个域,标题和内容,你就可以使用查询“标题:Lucene和内容:Java”来返回所有在标题域上包含Lucene并且在内容域上包含Java的文档。清单2显示了如何利用Lucene的API来实现域搜索。

  

<强>清单2:实现域搜索

        & lt; p>//测试领域搜索   公共空间testFieldSearch(字符串indexDirectory) throwsException {   目录dir=FSDirectory.getDirectory (indexDirectory、假);   IndexSearcher IndexSearcher=new IndexSearcher (dir);   字符串searchWords=氨晏?Lucene和内容:Java”;   分析仪类语言=new StandardAnalyzer ();   查询查询=QueryParser。解析(searchWords,“标题”,语言);   点击结果=indexSearcher.search(查询);   System.out.println (results.length() +“查询搜索结果”+ searchWords); & lt;/p>   & lt; p> & lt;/p>      


  

  

Lucene支持两种通配符:问号(?)和星号(*)。你可以使用问号(?)来进行单字符的通配符查询,或者利用星号(*)进行多字符的通配符查询。例如,如果你想搜索微小或者托尼,你就可以使用查询语句“t # 63;纽约”;如果你想查询教,教师和教学,你就可以使用查询语句“教*”。清单3显示了通配符查询的过程。

  

<强>清单3:进行通配符查询

        & lt; p>//测试通配符搜索   公共空间testWildcardSearch(字符串indexDirectory) throwsException {   目录dir=FSDirectory.getDirectory (indexDirectory、假);   IndexSearcher IndexSearcher=new IndexSearcher (dir);   String [] searchWords={"特克斯*”、“特克斯# 63;”," & # 63;前任* "};   查询查询;   for (int i=0;我& lt;searchWords.length;我+ +){   查询=new WildcardQuery(新学期(“标题”,searchWords[我]));   点击结果=indexSearcher.search(查询);   System.out.println (results.length() +“查询搜索结果”+ searchWords[我]);}& lt;/p>   & lt; p> & lt;/p>      

  

Lucene提供的模糊查询基于编辑距离算法(编辑距离算法)。你可以在搜索词的尾部加上字符~来进行模糊查询。例如,查询语句“想~”返回所有包含和认为类似的关键词的文档。清单4显示了如果利用Lucene的API进行模糊查询的代码。

Lucene实现多种高级搜索形式