• Lucene 的四大索引查询 ——bool 域搜索 通配符 范围搜索


    Lucene 的四大索引查询  
    清单1:使用布尔操作符  

    Java代码     收藏代码
    1. //Test boolean operator  
    2. blic void testOperator(String indexDirectory) throws Exception{  
    3.  Directory dir = FSDirectory.getDirectory(indexDirectory,false);  
    4.  IndexSearcher indexSearcher = new IndexSearcher(dir);  
    5.  String[] searchWords = {"Java AND Lucene", "Java NOT Lucene", "Java OR Lucene",   
    6.                   "+Java +Lucene", "+Java -Lucene"};  
    7.  Analyzer language = new StandardAnalyzer();  
    8.  Query query;  
    9.  for(int i = 0; i < searchWords.length; i++){  
    10.     query = QueryParser.parse(searchWords[i], "title", language);  
    11.     Hits results = indexSearcher.search(query);  
    12.     System.out.println(results.length() + "search results for query " + searchWords[i]);  
    13.  }  




    域搜索(Field Search)  

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


    清单2:实现域搜索  

    Java代码     收藏代码
    1. //Test field search  
    2. public void testFieldSearch(String indexDirectory) throws Exception{  
    3.     Directory dir = FSDirectory.getDirectory(indexDirectory,false);  
    4.     IndexSearcher indexSearcher = new IndexSearcher(dir);  
    5.     String searchWords = "title:Lucene AND content:Java";  
    6.     Analyzer language = new StandardAnalyzer();  
    7.     Query query = QueryParser.parse(searchWords, "title", language);  
    8.     Hits results = indexSearcher.search(query);  
    9.     System.out.println(results.length() + "search results for query " + searchWords);  
    10. }  
    11.    



    通配符搜索(Wildcard Search)  

    Lucene 支持两种通配符:问号(?)和星号(*)。你可以使用问号(?)来进行单字符的通配符查询,或者利用星号(*)进行多字符的通配符查询。例如,如果你想搜索 tiny 或者 tony,你就可以使用查询语句 “t?ny”;如果你想查询 Teach, Teacher 和 Teaching,你就可以使用查询语句 “Teach*”。清单3 显示了通配符查询的过程。  


    清单3:进行通配符查询  

    Java代码     收藏代码
    1. //Test wildcard search  
    2. public void testWildcardSearch(String indexDirectory)throws Exception{  
    3.    Directory dir = FSDirectory.getDirectory(indexDirectory,false);  
    4.    IndexSearcher indexSearcher = new IndexSearcher(dir);  
    5.    String[] searchWords = {"tex*", "tex?", "?ex*"};  
    6.    Query query;  
    7.    for(int i = 0; i < searchWords.length; i++){  
    8.       query = new WildcardQuery(new Term("title",searchWords[i]));  
    9.       Hits results = indexSearcher.search(query);  
    10.       System.out.println(results.length() + "search results for query " + searchWords[i]);  
    11.    }  
    12. }  
    13.    



    模糊查询  

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


    清单4:实现模糊查询  

    Java代码     收藏代码
    1. //Test fuzzy search  
    2. public void testFuzzySearch(String indexDirectory)throws Exception{  
    3.    Directory dir = FSDirectory.getDirectory(indexDirectory,false);  
    4.    IndexSearcher indexSearcher = new IndexSearcher(dir);  
    5.    String[] searchWords = {"text", "funny"};  
    6.    Query query;  
    7.    for(int i = 0; i < searchWords.length; i++){  
    8.       query = new FuzzyQuery(new Term("title",searchWords[i]));  
    9.       Hits results = indexSearcher.search(query);  
    10.       System.out.println(results.length() + "search results for query " + searchWords[i]);  
    11.    }  
    12. }  
    13.    



    范围搜索(Range Search)  

    范围搜索匹配某个域上的值在一定范围的文档。例如,查询 “age:[18 TO 35]” 返回所有 age 域上的值在 18 到 35 之间的文档。清单5显示了利用 Lucene 的 API 进行返回搜索的过程。  


    清单5:测试范围搜索  

    Java代码     收藏代码
      1. //Test range search  
      2. public void testRangeSearch(String indexDirectory)throws Exception{  
      3.     Directory dir = FSDirectory.getDirectory(indexDirectory,false);  
      4.     IndexSearcher indexSearcher = new IndexSearcher(dir);  
      5.     Term begin = new Term("birthDay","20000101");  
      6.     Term end   = new Term("birthDay","20060606");  
      7.     Query query = new RangeQuery(begin,end,true);  
      8.     Hits results = indexSearcher.search(query);  
      9.     System.out.println(results.length() + "search results is returned");  
      10. }  
  • 相关阅读:
    【转】VS2010中 C++创建DLL图解
    [转]error: 'retainCount' is unavailable: not available in automatic reference counting mode
    [转]关于NSAutoreleasePool' is unavailable: not available in automatic reference counting mode的解决方法
    【转】 Tomcat v7.0 Server at localhost was unable to start within 45
    【转】Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds. If
    【转】SVN管理多个项目版本库
    【转】eclipse安装SVN插件的两种方法
    【转】MYSQL启用日志,和查看日志
    【转】Repository has not been enabled to accept revision propchanges
    【转】SVN库的迁移
  • 原文地址:https://www.cnblogs.com/bonelee/p/6601943.html
Copyright © 2020-2023  润新知