各种查询
方式一:使用QueryParser与查询语法。(会使用分词器)

MultiFieldQueryParser
查询字符串 ------------------------> Query对象

例如:
上海 AND 天气
上海 OR 天气
上海新闻 AND site:news.163.com
...

方式二:
直接创建Query的实例(子类的),不会使用分词器
new TermQuery(..);
new BooleanQuery(..);

package cn.itcast.i_query;

import java.util.ArrayList;
import java.util.List;

import org.apache.lucene.document.Document;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.FuzzyQuery;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.MatchAllDocsQuery;
import org.apache.lucene.search.NumericRangeQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.search.WildcardQuery;
import org.apache.lucene.search.BooleanClause.Occur;
import org.junit.Test;

import cn.itcast._domain.Article;
import cn.itcast._util.ArticleDocumentUtils;
import cn.itcast._util.LuceneUtils;

public class TestApp {

    // 关键词查询
    @Test
    public void testTermQuery() {
        // 对应的查询字符串为:title:lucene
        TermQuery query = new TermQuery(new Term("title", "lucene"));
        searchAndShowResult(query);
    }

    // 通配符查询
    // ? 表示一个任意字符
    // * 表示0或多个任意字符
    @Test
    public void testWildcardQuery() {
        // 对应的查询字符串为:title:lu*n?
        // WildcardQuery query = new WildcardQuery(new Term("title", "lu*n?"));

        // 对应的查询字符串为:content:互?网
        WildcardQuery query = new WildcardQuery(new Term("content", "互?网"));
        searchAndShowResult(query);
    }

    // 查询所有
    @Test
    public void testMatchAllDocsQuery() {
        // 对应的查询字符串为:*:*
        MatchAllDocsQuery query = new MatchAllDocsQuery();
        searchAndShowResult(query);
    }

    // 模糊查询
    @Test
    public void testFuzzyQuery() {
        // 对应的查询字符串为:title:lucenX~0.9
        // 第二个参数是最小相似度,表示有多少正确的就显示出来,比如0.9表示有90%正确的字符就会显示出来。
        FuzzyQuery query = new FuzzyQuery(new Term("title", "lucenX"), 0.8F);
        searchAndShowResult(query);
    }

    // 范围查询
    @Test
    public void testNumericRangeQuery() {
        // 对应的查询字符串为:id:[5 TO 15]
        // NumericRangeQuery query = NumericRangeQuery.newIntRange("id", 5, 15, true, true);

        // 对应的查询字符串为:id:{5 TO 15}
        // NumericRangeQuery query = NumericRangeQuery.newIntRange("id", 5, 15, false, false);

        // 对应的查询字符串为:id:[5 TO 15}
        NumericRangeQuery query = NumericRangeQuery.newIntRange("id", 5, 15, true, false);

        searchAndShowResult(query);
    }

    // 布尔查询
    @Test
    public void testBooleanQuery() {
        BooleanQuery booleanQuery = new BooleanQuery();
        // booleanQuery.add(query, Occur.MUST); // 必须满足
        // booleanQuery.add(query, Occur.SHOULD); // 多个SHOULD一起用表示OR的关系
        // booleanQuery.add(query, Occur.MUST_NOT); // 非

        Query query1 = new TermQuery(new Term("title", "lucene"));
        Query query2 = NumericRangeQuery.newIntRange("id", 5, 15, false, true);

        // // 对应的查询字符串为:+title:lucene +id:{5 TO 15]
        // // 对应的查询字符串为(大写的AND):title:lucene AND id:{5 TO 15]
        // booleanQuery.add(query1, Occur.MUST);
        // booleanQuery.add(query2, Occur.MUST);

        // 对应的查询字符串为:title:lucene id:{5 TO 15]
        // 对应的查询字符串为:title:lucene OR id:{5 TO 15]
        // booleanQuery.add(query1, Occur.SHOULD);
        // booleanQuery.add(query2, Occur.SHOULD);

        // 对应的查询字符串为:+title:lucene -id:{5 TO 15]
        // 对应的查询字符串为:title:lucene (NOT id:{5 TO 15] )
        booleanQuery.add(query1, Occur.MUST);
        booleanQuery.add(query2, Occur.MUST_NOT);

        searchAndShowResult(booleanQuery);
    }

    /**
     * 测试搜索的工具方法
     *
     * @param query
     */
    private void searchAndShowResult(Query query) {
        try {
            // // 准备查询条件
            // String queryString = "content:lucene";
            // // 1,把查询字符串转为Query对象(从title和content中查询)
            // QueryParser queryParser = new MultiFieldQueryParser(Version.LUCENE_30, new String[] { "title", "content" }, LuceneUtils.getAnalyzer());
            // Query query = queryParser.parse(queryString);

            System.out.println("--->  // 对应的查询字符串为:" + query + "\n");

            // 2,执行查询,得到中间结果
            IndexSearcher indexSearcher = new IndexSearcher(LuceneUtils.getDirectory()); // 指定所用的索引库
            TopDocs topDocs = indexSearcher.search(query, 100); // 最多返回前n条结果

            // 3,处理结果
            List<Article> list = new ArrayList<Article>();
            for (int i = 0; i < topDocs.scoreDocs.length; i++) {
                // 根据编号拿到Document数据
                int docId = topDocs.scoreDocs[i].doc; // Document的内部编号
                Document doc = indexSearcher.doc(docId);
                // 把Document转为Article
                Article article = ArticleDocumentUtils.documentToArticle(doc);
                list.add(article);
            }
            indexSearcher.close();

            // 显示结果
            System.out.println("总结果数:" + list.size());
            for (Article a : list) {
                System.out.println("------------------------------");
                System.out.println("id = " + a.getId());
                System.out.println("title = " + a.getTitle());
                System.out.println("content = " + a.getContent());
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

lucene 查询的使用的更多相关文章

  1. Lucene 查询工具 LQT

    Lucene Query Tool (lqt) 是一个命令行工具用来执行 Lucene 查询并对结果进行格式化输出. 使用方法: 01 $ ./lqt 02 usage: LuceneQueryToo ...

  2. Lucene查询语法详解

    Lucene查询 Lucene查询语法以可读的方式书写,然后使用JavaCC进行词法转换,转换成机器可识别的查询. 下面着重介绍下Lucene支持的查询: Terms词语查询 词语搜索,支持 单词 和 ...

  3. Lucene查询条数限制

    运用Lucene进行索引,在查询的时候是有条数限制的 public virtual TopFieldDocs Search(Query query, Filter filter, int n, Sor ...

  4. lucene 查询+分页+排序

    lucene 查询+分页+排序 1.定义一个工厂类 LuceneFactory 1 import java.io.IOException; 2 3 import org.apache.lucene.a ...

  5. kibana使用(ELK)、Lucene 查询语法

    Lucene查询 Lucene查询语法以可读的方式书写,然后使用JavaCC进行词法转换,转换成机器可识别的查询. 下面着重介绍下Lucene支持的查询: Terms词语查询 词语搜索,支持 单词 和 ...

  6. Lucene 查询分页技术

    常用的Lucene查询代码如下所示,该代码的作用是将path路径下的所有索引信息返回 public String matchAll(String path) { try { Directory dir ...

  7. query_string查询支持全部的Apache Lucene查询语法 低频词划分依据 模糊查询 Disjunction Max

    3.3 基本查询3.3.1词条查询 词条查询是未经分析的,要跟索引文档中的词条完全匹配注意:在输入数据中,title字段含有Crime and Punishment,但我们使用小写开头的crime来搜 ...

  8. ELK:kibana使用的lucene查询语法【转载】

    kibana在ELK阵营中用来查询展示数据 elasticsearch构建在Lucene之上,过滤器语法和Lucene相同 全文搜索 在搜索栏输入login,会返回所有字段值中包含login的文档 使 ...

  9. Lucene查询索引(分页)

    分页查询只需传入每页显示记录数和当前页就可以实现分页查询功能 Lucene分页查询是对搜索返回的结果进行分页,而不是对搜索结果的总数量进行分页,因此我们搜索的时候都是返回前n条记录 package c ...

  10. 第六步:Lucene查询索引(优化一)

    package cn.harmel.lucene; import java.io.IOException; import java.nio.file.Paths; import org.apache. ...

随机推荐

  1. Java-加载数据库驱动,取得数据库连接

    在Java中想要进行数据库操作,最重要的两个步骤就是加载数据驱动,然后取得数据库连接. 1.加载 数据库驱动( Class.forName(String className) ): 因为Java是一种 ...

  2. Coursera台大机器学习课程笔记7 -- Noise and Error

    本章重点:  简单的论证了即使有Noise,机器依然可以学习,VC Dimension对泛化依然起作用:介绍了一些评价Model效果的Error Measurement方法. 一论证即使有Noisy, ...

  3. 智者当借力而行, 借助Autodesk应用程序商店实现名利双收

    有没有注意到这个"精选应用"菜单?有没有想过这个菜单下的应用是从哪里来的?你的应用也可以出现在这里哦~ 如果你还不知道,Autodesk在几年前就发布了Autodesk应用程序商店 ...

  4. Python的Set和List的性能比较 + 两者之间的转换

    1.能用set 不用list ~$ python -m timeit -n 1000 "[x for x in range(1000) if x in range(500, 1500)]&q ...

  5. RDBMS vs. NoSQL 合作还是竞争

    欢迎转载,转载请注明出处,徽沪一郎. 由于近期手头的工作和数据库的选型相关,纠结于是否使用一款NoSQL数据库来替换已有的MySQL数据库.在这个过程中随着学习研究的深入,对于二者的异同有了一些初步的 ...

  6. CloudStack 4.2 与CloudStack 4.1二级存储API发生变化

    CloudStack 4.1查看二级存储 http://192.168.150.16:8080/client/api?command=listHosts&response=json&s ...

  7. PHP 打印调用函数入口地址(堆栈),方便调式

    今天网站出现一个BUG,然后直接在数据库类里面写日志,看是哪条SQL出了问题,SQL语句到是找到了,但是不知道这条SQL语句来自何处,于是就想啊,如果能有一个办法,查看当前正在运行的这个方法是被哪个方 ...

  8. tcpdump抓取HTTP包【转载】

    tcpdump -XvvennSs 0 -i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x4854 0x4745 为"GET"前两个字母"G ...

  9. UI—视图的生命周期

  10. Centos7安装zabbix-agent

    1.下载zabbix-agent wget https://mirrors.aliyun.com/zabbix/zabbix/3.4/rhel/7/x86_64/zabbix-agent-3.4.10 ...