• 基于Lucene的查询索引


    1.1. 实现步骤

      第一步:创建一个Directory对象,也就是索引库存放的位置。

      第二步:创建一个indexReader对象,需要指定Directory对象。

      第三步:创建一个indexsearcher对象,需要指定IndexReader对象

      第四步:创建一个TermQuery对象,指定查询的域和查询的关键词。

      第五步:执行查询。

      第六步:返回查询结果。遍历查询结果并输出。

      第七步:关闭IndexReader对象

    1.2.IndexSearcher搜索方法

    1.3.query查询语句对象

      对要搜索的信息创建Query查询对象,Lucene会根据Query查询对象生成最终的查询语法,类似关系数据库Sql语法一样Lucene也有自己的查询语法,比如:“name:lucene”表示查询Field的name为“lucene”的文档信息。

      1.3.1.使用QueryParser查询

        通过QueryParser也可以创建Query,QueryParser提供一个Parse方法,此方法可以直接根据查询语法来查询。Query对象执行的查询语法可通过System.out.println(query);查询。需要使用到分析器。创建索引时使用的分析器和查询索引时使用的分析器要一致。

      1.3.2.使用query的子类查询

        TermQuery:

                 根据词进行搜索(只能从文本中进行搜索)

        QueryParser:

                 根据域名进行搜索,可以设置默认搜索域,推荐使用. (只能从文本中进行搜索)

        NumericRangeQuery:

                 从数值范围进行搜索

        BooleanQuery:

                 组合查询,可以设置组合条件,not and or.从多个域中进行查询

                   must相当于and关键字,是并且的意思

               should,相当于or关键字或者的意思

               must_not相当于not关键字, 非的意思

               注意:单独使用must_not  或者 独自使用must_not没有任何意义

        MatchAllDocsQuery:

                 查询出所有文档

        MultiFieldQueryParser:

                 可以从多个域中进行查询,只有这些域中有关键词的存在就查询出来

    1.4.代码

     1 @Test
     2 public void testIndexSearch() throws Exception{
     3 
     4     //创建分词器(与创建索引用同样的分词器)
     5     Analyzer analyzer=new StandardAnalyzer();
     6     //创建查询对象:第一个参数:默认搜索域  第二个参数 :分词器
     7     //默认搜索的作用:如果搜索语法中指定了域名,从指定域中搜索,如果未指定从默认搜索域中搜索
     8     QueryParser queryParser=new QueryParser("fileContext",analyzer);
     9     //查询语法 域名:搜索关键字
    10     Query query = queryParser.parse("fileContext:java");
    11 
    12 
    13     //指定索引的目录
    14     Directory directory= FSDirectory.open(new File("E:\ideaworkpase\demotest\luceneindex"));
    15     //索引的读取对象
    16     IndexReader indexReader=IndexReader.open(directory);
    17     //创建索引的搜索对象
    18     IndexSearcher indexSearcher=new IndexSearcher(indexReader);
    19     //搜索:第一个参数:查询语句对象  第二个参数:指定显示记录数
    20     TopDocs search = indexSearcher.search(query, 10);
    21     //一共搜索到多少条记录
    22     System.out.println("====total===:"+search.totalHits);
    23 
    24     //从搜索结果对象中获取结果集
    25     ScoreDoc [] scoreDocs=search.scoreDocs;
    26     for(ScoreDoc scoreDoc:scoreDocs){
    27         //获取Id
    28         int docID=scoreDoc.doc;
    29         //通过文档ID从硬盘上获取文档
    30         Document document = indexReader.document(docID);
    31         //get域名,打印出值
    32         System.out.println("+++++fileName++++:"+document.get("fileName"));
    33     }

     

     

     

  • 相关阅读:
    Python冒泡算法和修改配置文件
    第五章:处理数据
    第四章:持久存储
    Python之打印99乘法表
    Python之编写登录接口
    Python之文件操作
    第三章:文件与异常
    FineUI 修改config表属性
    FineUI Grid中WindowField根据列数据决定是否Enalble
    表之间不同字段的数据复制
  • 原文地址:https://www.cnblogs.com/fengcha0/p/9989101.html
Copyright © 2020-2023  润新知