各种查询
方式一:使用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. ELK:kibana使用的lucene查询语法【转载】

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

  6. Lucene查询索引(分页)

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

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

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

  8. 第六步:Lucene查询索引

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

  9. ELK:kibana使用的lucene查询语法

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

随机推荐

  1. Android数据加密之MD5加密

    前言: 项目中无论是密码的存储或者说判断文件是否是同一文件,都会用到MD5算法,今天来总结一下MD5加密算法. 什么是MD5加密? MD5英文全称“Message-Digest Algorithm 5 ...

  2. jQuery的extend方法

    jq中的extend在面试中经常会被问道,今天我总结一个下有关于extend的用法三种进行对比,可能不全,希望大家指点, 用法一: $.extend({})  ,为jQuery类添加方法,可以理解为扩 ...

  3. android中设置控件获得焦点 (转)

    android中,要使控件获得焦点,需要先setFocus,再requestFocus. 以Button为例:                 btn.setFocusable(true);      ...

  4. MySQL运行状态show status中文详解(转)

    要查看MySQL运行状态,要优化MySQL运行效率都少不了要运行show status查看各种状态,下面是参考官方文档及网上资料整理出来的中文详细解释: 状态名 作用域 详细解释 Aborted_cl ...

  5. MySQL Cluster 配置文件(config.ini)详解

    MySQL Cluster 配置文件(config.ini)详解 ################################################################### ...

  6. swipe js dynamic content

    swipe js dynamic content swipe 动态改变内容时,需要用 update 一下. swiper.update(true); 实例: HTML Code  页面用的FreeMa ...

  7. Matlab与C/C++联合编程之Matlab以MEX方式调用C/C++代码(三)

    最近写了个Matlab程序,好慢呐……所以开始学习Matlab与C/C++混合编程.下面写了个测试代码,显示一个Double类型矩阵中的元素. 源代码 #include "mex.h&quo ...

  8. 深入分析:Fragment与Activity交互的几种方式(一,使用Handler)

    这里我不再详细介绍那写比较常规的方式,例如静态变量,静态方法,持久化,application全局变量,收发广播等等. 首先我们来介绍使用Handler来实现Fragment与Activity 的交互. ...

  9. ModelFirst的CRUD

    创建实体:

  10. UIWebView与JS的深度交互

    我要实现这样一个需求:按照本地的CSS文件展示一串网络获取的带HTML格式的只有body部分的文本,需要自己拼写完整的 HTML.除此之外,还需要禁用获取的HTML文本中自带的 < img &g ...