lucene查询索引之解析查询——(八)

0.语法介绍:

1.公共部分代码同七中一样

// IndexReader IndexSearcher
    public IndexSearcher getIndexSearcher() throws Exception {
        // 第一步:创建一个Directory对象,也就是索引库存放的位置。
        Directory directory = FSDirectory.open(new File("E:\\lucene&solr\\index"));// 磁盘
        // 第二步:创建一个indexReader对象,需要指定Directory对象。
        IndexReader indexReader = DirectoryReader.open(directory);
        // 第三步:创建一个indexsearcher对象,需要指定IndexReader对象
        return new IndexSearcher(indexReader);
    }

    // 执行查询的结果
    public void printResult(IndexSearcher indexSearcher, Query query) throws Exception {
        // 第五步:执行查询。
        TopDocs topDocs = indexSearcher.search(query, 10);
        // 第六步:返回查询结果。遍历查询结果并输出。
        ScoreDoc[] scoreDocs = topDocs.scoreDocs;
        for (ScoreDoc scoreDoc : scoreDocs) {
            int doc = scoreDoc.doc;
            Document document = indexSearcher.doc(doc);
            // 文件名称
            String fileName = document.get("fileName");
            System.out.println(fileName);
            // 文件内容
            String fileContent = document.get("fileContent");
            System.out.println(fileContent);
            // 文件大小
            String fileSize = document.get("fileSize");
            System.out.println(fileSize);
            // 文件路径
            String filePath = document.get("filePath");
            System.out.println(filePath);
            System.out.println("------------");
        }
    }

2.查询所有:(分析器会对查询条件进行分词)

   语法:   *:*

// 条件解释的对象查询
    @Test
    public void testQueryParser() throws Exception {
        IndexSearcher indexSearcher = getIndexSearcher();
        // 参数1: 默认查询的域
        // 参数2:采用的分析器
        QueryParser queryParser = new QueryParser("fileName", new IKAnalyzer());
        // *:* 域:值
        Query query = queryParser.parse("* : *");

        printResult(indexSearcher, query);
        // 关闭资源
        indexSearcher.getIndexReader().close();
    }

3.使用默认查询的域

  查询名字带有computer索引的文档

@Test
    public void testQueryParser() throws Exception {
        IndexSearcher indexSearcher = getIndexSearcher();
        // 参数1: 默认查询的域
        // 参数2:采用的分析器
        QueryParser queryParser = new QueryParser("fileName", new IKAnalyzer());
        // *:* 域:值
        Query query = queryParser.parse("computer");

        printResult(indexSearcher, query);
        // 关闭资源
        indexSearcher.getIndexReader().close();
    }

结果:

加载扩展词典:ext.dic
加载扩展停止词典:stopword.dic
computer.txt
??Computers are changing our life. You can do a lot of things with a computer. Such as, you can use a computer to write articles, watch video CDs, play games and do office work. But the most important use of a computer is to join the Internet.We don??t need to leave home to borrow books from a library or to do shopping in a supermarke
336
E:\lucene&solr\searchfiles\computer.txt
------------

4.范围查询

  不支持范围查询

5.组合查询(组合查询只用修改语法,+表示必须,-表示必须没有,啥也没有表示可有可无)

  查询fileName必须带有Java,且必须不带struts的文档。

  语法  +fileName:java -fileName:struts

// 条件解释的对象查询
    @Test
    public void testQueryParser() throws Exception {
        IndexSearcher indexSearcher = getIndexSearcher();
        // 参数1: 默认查询的域
        // 参数2:采用的分析器
        QueryParser queryParser = new QueryParser("fileName", new IKAnalyzer());
        // *:* 域:值
        Query query = queryParser.parse("+fileName:java -fileName:struts");

        printResult(indexSearcher, query);
        // 关闭资源
        indexSearcher.getIndexReader().close();
    }

结果:

加载扩展词典:ext.dic
加载扩展停止词典:stopword.dic
java 基础.txt
 think smiling is as important as sunshine. Smiling is like sunshine because it can make people happy and have a good day. If you aren??t happy, you can smile, and then you will feel happy. Someone may say, ??But I don??t feel happy.?? Then I would say, ??Please smile as you do when you are happy or play wit
309
E:\lucene&solr\searchfiles\java 基础.txt
------------
java高级.txt
????java?????????????????????
32
E:\lucene&solr\searchfiles\java高级.txt
------------

6.复杂查询

  查询 fileName 带有javaweb 或者 computer的,或者是fileContent带有javaweb 或者 computer的

  IKAnalyzer分析器先对java is apach进行分词,然后对javaweb is computer进行分词,然后根据条件进行查询带有分析器分词后的词的文档。
// 条件解释的对象查询
    @Test
    public void testQueryParser() throws Exception {
        IndexSearcher indexSearcher = getIndexSearcher();
        // 参数1: 默认查询的域
        // 参数2:采用的分析器
        QueryParser queryParser = new QueryParser("fileName", new IKAnalyzer());
        // *:* 域:值
        Query query = queryParser.parse("fileName:javaweb is computer OR fileContent:javaweb is computer ");

        printResult(indexSearcher, query);
        // 关闭资源
        indexSearcher.getIndexReader().close();
    }

结果:

加载扩展词典:ext.dic
加载扩展停止词典:stopword.dic
computer.txt
??Computers are changing our life. You can do a lot of things with a computer. Such as, you can use a computer to write articles, watch video CDs, play games and do office work. But the most important use of a computer is to join the Internet.We don??t need to leave home to borrow books from a library or to do shopping in a supermarke
336
E:\lucene&solr\searchfiles\computer.txt
------------
1javaweb .txt
this is javaweb dsbadfsabjkfsdf njdfndsj njaj spring
53
E:\lucene&solr\searchfiles\1javaweb .txt
------------

 --------------------条件解析的对象查询 多个默念域-----------------------

7.解析器用 MultiFieldQueryParser

  查询 fileName 带有javaweb 或者 computer的,或者是fileContent带有javaweb 或者 computer的(与6的作用等价)

  作用不大,在查询条件中一用上查询域默认查询域就废了。

// 条件解析的对象查询 多个默念域
    @Test
    public void testMultiFieldQueryParser() throws Exception {
        IndexSearcher indexSearcher = getIndexSearcher();

        String[] fields = { "fileName", "fileContent" };
        // 参数1: 默认查询的域
        // 参数2:采用的分析器
        MultiFieldQueryParser queryParser = new MultiFieldQueryParser(fields, new IKAnalyzer());
        // *:* 域:值
        Query query = queryParser.parse("javaweb is computer");

        printResult(indexSearcher, query);
        // 关闭资源
        indexSearcher.getIndexReader().close();
    }

总结:

  这个可以将查询条件设置为句子,IKAnalyzer分析器会对句子进行分词处理,然后进行查询索引。

  

 // 参数1: 默认查询的域
        // 参数2:采用的分析器
        QueryParser queryParser = new QueryParser("fileName", new IKAnalyzer());
        // *:* 域:值
        Query query = queryParser.parse("fileName:java is apache OR fileContent:Computers are changing our life ");
时间: 2024-10-12 20:28:43

lucene查询索引之解析查询——(八)的相关文章

数据库理论之视图、事务、索引、优化查询

数据库理论之视图.事务.索引.优化查询 一.视图 灵魂三问 1.什么是视图 视图就是通过查询得到一张虚拟表,然后保存下来,下次直接使用即可 2.为什么要用视图 如果要频繁的使用一张虚拟表,可以不用重复查询 3.如何使用视图 create view 视图名 as sql语句 注意:创建出来的视图只有表结构,数据来源还是原来的表 视图通常都是用于查询,所以尽量不要修改视图中的数据 思考:开发过程中应不应该使用视图? 不应该 二.触发器 命名规则及理论 在满足对某张表数据的增删改的情况下,自动触发的功

lucene查询索引之Query子类查询——(七)

0.文档名字:(根据名字索引查询文档) 1. 提取获取InsexSearch 与 处理结果的公共代码 //IndexReader IndexSearcher public IndexSearcher getIndexSearcher() throws Exception{ // 第一步:创建一个Directory对象,也就是索引库存放的位置. Directory directory = FSDirectory.open(new File("D:\\temp\\index"));// 磁

lucene 建立索引与查询

Lucene 简介 Lucene 是一个基于 Java 的全文信息检索工具包,它不是一个完整的搜索应用程序,而是为你的应用程序提供索引和搜索功能.Lucene 目前是 Apache Jakarta 家族中的一个开源项目.也是目前最为流行的基于 Java 开源全文检索工具包. 目前已经有很多应用程序的搜索功能是基于 Lucene 的,比如 Eclipse 的帮助系统的搜索功能.Lucene 能够为文本类型的数据建立索引,所以你只要能把你要索引的数据格式转化的文本的,Lucene 就能对你的文档进行

Lucene实现索引和查询

0引言 随着万维网的发展和大数据时代的到来,每天都有大量的数字化信息在生产.存储.传递和转化,如何从大量的信息中以一定的方式找到满足自己需求的信息,使之有序化并加以利用成为一大难题.全文检索技术是现如今最普遍的信息查询应用,生活中利用搜索引擎,在博客论坛中查找信息,这些搜索的核心原理就是本文要实现的全文检索技术.随着文档信息数字化的实现,将信息有效存储并及时准确的提取是每一个公司.企业和单位要做好的基础.针对英文的全文检索已经有很多成熟的理论和方法,开放源代码的全文检索引擎Lucene 是Apa

lucene入门查询索引——(三)

1.用户接口(lucene不提供) 2.创建查询 3.执行查询 4.渲染结果: 5.过程分析 根据关键字查询索引库中的内容: 1)  创建IndexSearcher对象 2)  创建QueryParser对象 3)  创建Query对象来封装关键字 4)  用IndexSearcher对象去索引库中查询符合条件的前100条记录,不足100条记录的以实际为准 5)  获取符合条件的编号 6)  用indexSearcher对象去索引库中查询编号对应的Document对象 7)  将Document

Lucene查询索引

索引创建 以新闻文档为例,每条新闻是一个document,新闻有news_id.news_title.news_source.news_url.news_abstract.news_keywords这6个域,添加两个news document到索引中,下面再贴一下创建索引的代码: package ucas.ir.lucene; import java.io.File; import java.io.IOException; import org.apache.lucene.analysis.An

[lucene系列笔记2]在eclipse里初步使用lucene的索引和查询功能

首先,new一个java project,名字叫做LuceneTools. 然后,在project里new一个class,名字叫做IndexFiles.这个类用来给文件建索引(建好索引以后就可以高效检索了). 在写代码之前,我们要先引入一下lucene包,就类似于C语言里的include.如图: 点击之后看到如下窗口,选择"Add External JARs" 然后找到C:\Lucene-6.2.1目录下(如果是按上一篇文章配置的话应该是在这个目录里)的三个包(这里我们暂时只用到这三个

Lucene的数值索引以及范围查询

对文本搜索引擎的倒排索引(数据结构和算法).评分系统.分词系统都清楚掌握之后,本人对数值索引和搜索一直有很大的兴趣,最近对Lucene对数值索引和范围搜索做了些学习,并将主要内容整理如下: 1. Lucene不直接支持数值(以及范围)的搜索,数值必须转换为字符(串): 2. Lucene搜索数值的初步方案: 3. Lucene如何索引数值,并支持范围查询. 1. Lucene不直接支持数值搜索 Lucene不直接支持数值(以及范围)的搜索,数值必须转换为字符(串)——这是由倒排索引这个核心所决定

Lucene 学习之二:数值类型的索引和范围查询分析

Lucene   使用的是字符(词)类型的索引结构.对数值类型的索引和存储最终都要先转成字符类型. 早期版本Lucene 没有封装数值类型的公共类.需要先直接将数字转成字符串再加到Field 中. JAVA代码: 1 Document doc = new Document(); 2 long i = 123456L; 3 doc.Add(new Field("id", String.valueOf(i), Field.Store.YES, Field.Index.YES)); 4 wr