zoukankan      html  css  js  c++  java
  • 《Lucene in Action 第二版》第三章节的学习总结----IndexSearcher以及Term和QueryParser

    本章节告诉我们怎么用搜索。通过这章节的学习,虽然搜索的内部原理不清楚,但是至少应该学会简单的编写搜索程序了
    本章节,需要掌握如下几个主要API
    1.IndexSearcher类:搜索索引的门户,发起者。
       初始化:IndexSearcher is = new IndexSearcher(dir) --- 不产生近实时搜索的效果
                     或者
                     IndexREeader reader = IndexReader.open(dir);IndexSearcher searcher = new IndexSearcher(reader);  --- 产生近实时搜索的效果
       搜索开始:is.search(query, n);

    2.TopDocs类,这是search(query, n)返回的结果。其中包含如下重要成员:
        totalHits:实际匹配query的文档数量
        scoreDocs:一个包含搜索结果的ScoreDoc对象数组。按照评分降序排列,即数组最靠前的,其评分最高。并且此数组的大小取值为min(n, totalHits);
                每一个ScoreDoc中又包含两个成员:int Doc表示文档ID;float score表示相关性评分。
                通过Doc,可以获得实际的文档,即:Document doc = is.doc(scoreDoc.doc); 进一步的,通过doc.get("域名"),就可以得到此Doc中具体某个域名对应的域值了。

    3.Query(及其子类):封装某种具体查询类型的具体子类。这也是实际放到is.search(query, n);中的query对象
       Query对象的产生方法,可以分为两种:
       A.非QueryParser方式 --- 这一类,基本上都不是使用自然语言来搜索
          TermQuery类: 用于按关键字搜索。 比如:Term t = new Term("contents", "java");  Query query = nwe TermQuery(t); 

          TermRangeQuery类:通过指定文本首字母的起止和终止范围,来产生query;只适用于文本范围。 比如:TermRangeQuery query = new TermRangeQuery("title2", "d", "j", true, true);     

          NumericRangeQuery类:用于数值范围的搜索,前提是须索引是采用NumericField建立的。 比如:NumericRangeQuery query = NumericRangeQuery.newInitRange("pubmonth", 200605, 200609, true, true); 

          PrefixQuery类:搜索包含以指定字符串开头的项的文档。 比如:Term term = new Term("category", "/technology/computers/programming"); PrefixQuery query = new PrefixQuery(term); 

          BooleanQuery类:用于组合其他查询方式为一体,来提供复杂的查询方式。比如:
              TermQuery searchingBooks = new TermQuery(new Term("subject", "search"));
              Query books2010 = NumericRangeQuery.newIntRange("pubmonth", 201001, 201012, true, true);
              BooleanQuery searchingBooks2010 = new BooleanQuery();
              searchingBooks2010.add(searchingBooks, BooleanClause.Occur.MUST); -- 加入其他query
              searchingBooks2010.add(books2010, BooleanClause.Occur.MUST);-- 加入其他query

          PhraseQuery:  用于只知道要搜索文本中的某些单词以及这些单词在文本中的相对位置,而进行的搜索。比如:
               PhraseQuery query = new PhraseQuery();
               query.setSlop(slop); -- 设置两个项的位置之间所允许的最大间隔距离,0表示完全匹配;1表示可以通过移动一次短语,来达到完全匹配;
               for(String word : phrase) {
                     query.add(new Term("field", word));
               }

          WildcardQuery类:通配符查询,?表示0个或者1个字母,*代表0个或者多个字母。比如:Query query = new WildcardQuery(new Term("contents", "?ild*"));     

          FuzzyQuery类:模糊查询,用于匹配和指定项相似的项。采用Levenshtein距离算法。比如:Query query = new FuzzyQuery(new Term("contents", "wuzza"));

          MatchAllDocsQuery类:匹配所有文档。比如:Query query = new MatchAllDocsQuery() 或者 Query query = new MatchAllDocsQuery(field);

       B.QueryParser方式 --- 支持使用自然语言(包括一些简单的查询表达式)来搜索
          既然是自然语言,那么对于一些字符,需要支持转义。采用反斜杠()来表示转义。需要转义的字符包括: + - ! ( ) : ^ ] { } ~ * ?    (注意:没有[ )
          QueryParser是对自然语言进行解析,并最终还是产生Query;并且可以产生和上述“非Query类”一一对应的query
      具体包括:
          TermQuery:单个词,在QueryParser中解析为单个TermQuery对象。比如:Query query = parser.parse("computers");

          项范围查询(TermRangeQuery或NumericRangeQuery):针对文本或者日期的范围查询。比如:Query query = parser.parse("title2:[Q TO V]");

          通配符查询:某个查询字符串中包含一个*或者?,则就被看成通配符查询;Query query = parser.parse("Prefix?uery");

          前缀查询:某个查询字符串只在末尾有一个*,则被看成前缀查询。比如:Query query = parser.parse("PrefixQuery*");

          布尔查询:综合多种查询方式为一体。比如:Query query = parser.parse("search AND title:[D TO P]");  综合了TermQuery和TermRangeQuery;貌似缺省无法支持NumericRangeQuery

          短语查询:双引号内的文本(注意:单项短语会被优化成TermQuery对象)会促使分析器将其转换为PhraseQuery。比如:Query query = parser.parse(""This is Some Phrase*"");

          模糊查询:在双引号里的文本字符串的最后,加一个~,就成为了模糊查询。比如:Query query = parser.parse("kountry~");

          MatchAllDocsQuery:当输入*:*后,就会产生MatchAllDocsQuery

          分组查询:用于建立嵌套查询,比如:Query query = parser.parse("(agile OR extreme) AND methodology"); 就表示:查询一定包括methodology,但是可以包括agile或者extreme的文档

  • 相关阅读:
    bat 批处理命令 文件 类型 语法 格式 应用 详解
    CString,int,string,char*之间的转换
    机器名修改
    查看或修改SQL2005实例的端口号
    无法在数据库 'ycmis2' 中运行 BEGIN TRANSACTION,因为该数据库处于回避恢复模式。
    return另外一个用法
    tempdb多文件处理
    Oracle数据库表分区
    JavaWeb项目过滤器的编写
    略观SSH的优缺点
  • 原文地址:https://www.cnblogs.com/lagujw/p/3611936.html
Copyright © 2011-2022 走看看