zoukankan      html  css  js  c++  java
  • 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. }  
  • 相关阅读:
    5. Redis持久化
    4.Redis客户端
    3.Redis高级功能
    2.Redis五种数据结构
    1.Redis简介
    32.Mysql Cluster
    suffix ACM-ICPC 2017 Asia Qingdao
    多层BFS
    我想和你们说说java和C++___C加加
    11073 最热门的K个搜索串
  • 原文地址:https://www.cnblogs.com/bonelee/p/6601943.html
Copyright © 2011-2022 走看看