• Lucene常用查询小结


    第一、    按词条搜索 - TermQuery
    query = new TermQuery(new Term("name","word1"));
    hits = searcher.search(query);
    这样就可以把 field 为 name 的所有包含 word1 的文档检索出来了。
    第二、 “与或”搜索 - BooleanQuery
    它实际是一个组合 query 看看下面的代码:
    query1 = new TermQuery(new Term("name","word1"));
    query2 = new TermQuery(new Term("name","word2"));
                       BooleanQuery query=new BooleanQuery();
               query.add(query1, BooleanClause.Occur.MUST);  
                       query.add(query2, BooleanClause.Occur.MUST);

    hits = searcher.search(query);
                       其中的MUST、SHOULD、MUST_NOT表示与、或、非,从字面意思很容易理解
    Lucene 可以最多支持连续 1024 的 query 的组合。
    第三、 在某一范围内搜索 - RangeQuery
    IndexSearcher searcher = new IndexSearcher("F:\资源\lucene研究\test");
         Term beginTime = new Term("time","200001");
         Term endTime = new Term("time","200005");
         Hits hits = null;
         RangeQuery query = null;
         query = new RangeQuery(beginTime, endTime, false);
         hits = searcher.search(query);
    RangeQuery 的构造函数的参数分别代表起始、结束、是否包括边界。这样我们就可以按照要求检索了。
    第四、 使用前缀检索 - PrefixQuery
    这个检索的机制有点类似于 indexOf() 从前缀查找。这个常在英文中使用,中文中就很少使用了。代码如下:
    IndexSearcher searcher = new IndexSearcher("F:\资源\lucene研究\test");
           Term pre1 = new Term("name", "Da");
           query = new PrefixQuery(pre1);
           hits = searcher.search(query);
    第五、 多关键字的搜索 - PhraseQuery
    可以多个关键字同时查询。使用如下:
    query = new PhraseQuery();
           query.add(word1);
           query.add(word2);
           query.setSlop(0);
           hits = searcher.search(query);
           printResult(hits, "'david' 与 'mary' 紧紧相隔的 Document");
           query.setSlop(2);
           hits = searcher.search(query);
           printResult(hits, "'david' 与 'mary' 中相隔两个词的短语 ");
        这里我们要注意 query.setSlop(); 这个方法的含义。
    query.setSlop(0); 紧紧相连 (这个的条件比较苛刻)
    query.setSlop(2); 相隔
    第六、 使用短语缀搜索 - PharsePrefixQuery
    使用 PharsePrefixQuery 可以很容易的实现相关短语的检索功能。
    实例:
    query = new PhrasePrefixQuery();
           // 加入可能的所有不确定的词
    Term word1 = new Term("content", "david");
           Term word2 = new Term("content", "mary");
           Term word3 = new Term("content", "smith");
           Term word4 = new Term("content", "robert");
           query.add(new Term[]{word1, word2});
           // 加入确定的词
           query.add(word4);
           query.setSlop(2);
           hits = searcher.search(query);
           printResult(hits, " 存在短语 'david robert' 或 'mary robert' 的文档 ");
    第七、 相近词语的搜索 - fuzzyQuery
    可以通俗的说它是一种模糊查询。
    实例:
    Term word1 = new Term("content", "david");
           Hits hits = null;
           FuzzyQuery query = null;
           query = new FuzzyQuery(word1);
           hits = searcher.search(query);
           printResult(hits," 与 'david' 相似的词 ");
    第八、 使用通配符搜索 - WildcardQuery
    实例:


    IndexSearcher searcher = new IndexSearcher("F:\资源\lucene
    研究\test");


           Term word1 = new Term("content", "*ever");


           Term word2 = new Term("content", "wh?ever");


           Term word3 = new Term("content", "h??ever");


           Term word4 = new Term("content", "ever*");


           WildcardQuery query = null;


           Hits hits = null;


           query = new WildcardQuery(word1);


           hits = searcher.search(query);


           printResult(hits, "*ever");


           query = new WildcardQuery(word2);


           hits = searcher.search(query);


           printResult(hits, "wh?ever");    

           query = new WildcardQuery(word3);


           hits = searcher.search(query);


           printResult(hits, "h??ever");    

           query = new WildcardQuery(word4);


           hits = searcher.search(query);


           printResult(hits, "ever*");


        由上可以看出通配符?代便 1 个字符, * 代表 0 到多个字符。
    Lucene 现在支持以上八中的搜索方式,我们可以根据需要选择适合自己的搜索方式。当然上面提供的一些可能对英文还是比较有效,中文就不可取了,所以我们开始想想百度,我们只在一个输入框中搜索结果。有了这个疑问我们揭开下一章的讨论吧!
    查询字符串的解析:这个就是我们经常在一个输入框中输入我们要检索的文字,交给搜索引擎去帮我们分词。
    QueryParser 类就是对查询字符串的解析类。
    看看它的用法:
    query = QueryParser.parse(key1, "name", new StandardAnalyzer());
    hits = searcher.search(query);
    它直接返回一个 Query 对象。需要传入的参数分别是:
    用户需要查询的字符串、需要检索的对应字段名称、采用的分词类。
    Analyzer analyzer = new CJKAnalyzer();
    String[] fields = {"filename", "content"};
    Query query = MultiFieldQueryParser.parse(searchword, fields, analyzer);
    Hits hits = searcher.search(query);
    QueryParser 的“与” 和 “或”:
    QueryParser 之间默认是或,我们想改变为与的话加入以下代码:
    QueryParser.setOperator(QueryParser.DEFAULT_OPERATOR_AND);
    就可以了。

    Lucece提供了如此多的query方式,自己测试一遍(还有高级搜索技巧未测试),这才感觉到以前学的搜索引擎的很多搜索方法并不那么遥不可及!”理论与实践相结合“这话没错!!!

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wangdetian168/archive/2008/06/02/2503194.aspx

  • 相关阅读:
    一小时学会前端工程化
    lodash学习资料
    关于《冬天时我喜欢靠近温暖的事》这首歌 (民谣在路上)
    往后余生(简单的歌词分享)
    如果觉得活的很累不妨进来看看(生活应该简简单单)
    《大学》全文及白话翻译
    原型设计模式 Prototype
    解释器模式 Interpreter
    copy on write,代理模式
    ado.net
  • 原文地址:https://www.cnblogs.com/0000/p/1531713.html
Copyright © 2020-2023  润新知