Lucene 学习笔记 Query篇

本文深入探讨了Lucene全文检索技术,包括IndexSearcher构造函数、查询类型(如TermQuery、BooleanQuery、RangeQuery、PrefixQuery、PhraseQuery、PhrasePrefixQuery、FuzzyQuery、WildcardQuery)、QueryParser解析器以及如何构建有效Query进行高效索检。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

IndexSearcher 构造函数

IndexSearcher继承于Searcher类,有四种构造函数,但最终以IndexReader作为实际的索引目录读取器
  Searcher searcher=new IndexSearcher(String indexDir);

Searcher searcher=new IndexSearcher(Directory directory)

Searcher searcher=new IndexSearcher(IndexReader indexreader)

Searcher searcher=new IndexSeacher(IndexReader indexreader ,boolean closeReader)

IndexSeacher.search()重载函数
search(Query query) Hits
search(Query query ,Filter filter) Hits
search(Query query ,Filter filter ,Sort sort) Hits
search(Query query ,Sort sort) Hits

search(Query query ,Filter filter ,HitCollector hitcollector) Hits

search(Query query ,Filter filter ,int arg) Hits

search(Query query ,Filter filter ,int arg ,Sort sort) Hits

search(Query query ,HitCollector hitcollector) Hits

用来完成对索检结果的排序、过虑等功能而设计的

构建各种Query
  用户输入一个关键字,应该分析判断构建哪种Query进行索检,这样才能提高效率,同时得出更加有效的结果

(1)词条搜索TermQuery
   TermQuery是最简单,最常用的Query。TermQuery可以理解为”词条搜索”,其实是一个名/值对照,名是Field(字段)而值则表示字段中所包含的某个关键字
使用TermQuery进行搜索 首先构造一个Term对象
    Term term=new Term(“field”,”keyword”);

然后用Term对象为参数构造一个TermQuery对象
Query query=new TermQuery(term);

(2)“与或非”搜索 BooleanQuery
    BooleanQuery继承自Query类,是实际开发中经常使用的一种Query,它其实一个组合的Query,由于查询是可嵌套的如果子句太多可能会导致查询效率降低,lucene默认的子句不能超过1024个
添加子句的API接口
    public void add(Query query ,boolean required ,boolean prohibited);

             True &False 当前加入的子句必须要满足   (与
False &False 当前加入的子句可选的       (或
False &True 当前加入的子句不可以被满足 (非

实例:

   IndexSeacher  searcher=new IndexSearch(“c://temp”);

   Query query1=TermQuery(new Term(“field”,”keyword”));

Query query2=TermQuery(new Term(“field”,”keyword”));

   Query query=BooleanQuery();

   query.add(query1,true,false);

   query.add(query2,true,false);

   Hits hits=searcher.search(query);

(3)RangeQuery范围搜索
   RangeQuery继承自Query类,表示在某个范围内的搜索条件,在查询“开始词条“和”结束词条“可以被包含在内也可以不包含在内,比如查询时间,数字,字母等在一个段内的文档,只有一个构造函数
      public RangeQuery(Term lowerTerm, Term upperTerm, boolean inclusive)

Inclusive表示是否包含边界条件本身

(4)PrefixQuery前缀搜索

PrefixQuery继承Query类,可以进行前缀查找,只有一个构造函数
      public PrefixQuery(Term prefix)

(5)PhraseQuery多关键字搜索
     除了普通的TermQuery外,Lucene还提供了一种Phrase查询功能。用户常常查找的并非是一个简单的单词,很有可能是几个不同的关键词,这些关键词之间要么联系紧密,成为一个精确的短语,或者这几个关键词之间还穿插了其他的无关的关键字。这些关键字之间拥有与查找无关的短语,使他们文档的分值一般会比较低
    它的add(Term term)方法可以向其内部添加关键字,然后可以调用setSlop(int slop)设定一个“坡度“的变量确定关键词之间是否允许、允许多少个无关词汇的存在
     Query query=new PhraseQuery();
     query .add(Term(“field” , ”keyword”));

query .add(Term(“field1” , ”keyword1”));

query .setSlop(3);

     Hits hits=searcher.search(query);

对于两个紧密相连的关键词来说无论将坡度设置多少Lucene总能找到它所在的文档,如果两个不紧密相连的关键词如果坡度设置过小则无法找到。

(6)PhrasePrefixQuery短语缀搜索
    PhrasePrefixQuery和Phrase有些类似,如果用户向查找短语”david robert”,又想查找”mary robert”,可以构建2个PhraseQuery,然后使用BooleanQuery将他们作为子句,用“或”操作符连接。PhrasePrefixQuery可以让用户方便的实现这种方法。实例:

Hits hits=null;

         PhrasePrefixQuery query = new PhrasePrefixQuery();

         query.add(new Term[]{new Term(“field”,”keyword”) , new Term(“field”,”keyword1”)});

         query.add(new Term(“field”,”keyword2”));

         query.setSlop(2);

         hits=searcher.search(query);

(7)FuzzyQuery 相近词语的搜索

   FuzzyQuery同样继承自Query类,使一种模糊查询,可以简单的识别两个相近的词语。构造函数有三个:
         (1) public FuzzyQuery(Term term)
         (2) public FuzzyQuery(Term term, float minimumSimilarity) throws IllegalArgumentException
         (3)public FuzzyQuery(Term term, float minimumSimilarity, int prefixLength) throws IllegalArgumentException

minimumSimilarity 最小类似分值
prefixLength 前缀长度

实例
         IndexSearcher searcher=new IndexSearcher(“c://temp”);

         Term term=new Term(“field”,”keyword”);

         FuzzyQuery query=new FuzzyQuery(term);

         Hits hits=searcher.search(query);

(8)WildcardQuery 通配符搜索
         WildcardQuery继承自MultiTermQuery抽象类,可以进行通配符查询。实例:

         WildcardQuery query = null;

query = new WildcardQuery(new Term(“field”,”*keyword”));

Hits hits=searcher.search(query);

query=new WildcardQuery(new Term(“field”,”?keyword”));

hits=searcher.search(query);

通配符”?”表示一个字符,“*”表示0到多个字符。WildcardQuery和FuzzyQuery 由于要对字段关键字进行字符串匹配,所以在搜索的性能上面会受到一些影响

(9)QueryParser 查询分析器
     QueryParser位于org.apache.lucene.queryParser包,实现QueryParserConstants类,将用户输入的字符串转化为内部的Query或者Query组,构建各种各样的Query,也允许通过QueryParser来生成各种各样的Query子对象,这使Lucene查询功能变得更加灵活和强大

简单实例:

Query query=null;

Hits hits=null;

IndexSeacher searcher =new IndexSearcher(“c:\\temp”);

query =QueryParser.parse(“keyword”,”field”,new StandarAnalyzer());

        hits =searcher.search(query);

QueryParser实际上使一个解析用户输入的工具,可以通过扫描用户输入的字符串,生成Query对象

static public Query parse(String query, String field, Analyzer analyzer)

         搜索表达式

“david”

在默认的字段中索检”david”关键字

“content:david”

在”content”字段中索检”david”关键字

“david mary”或”david OR mary”

在默认字段中索检关键字”divid”或”mary”,

“+david +mary”或”david AND mary”

在默认字段中索检关键字”divid”与”mary”

“content:david –title:manager”或”content:david AND NOT title: manager”

在字段content中索检关键字david,但在title字段中不包含manager关键字

“(david OR mary) AND robert”

在默认字段中索检david或mary关键字,并且包含有robert关键字

“davi*”

在默认字段中索检前缀为davi

“content : “david is a manager ””

在content字段中索检短语 david is a manager

在QueryParser对用户输入进行扫描时,需要给它一个分析器,必须要和建立索引时的分析器一样,这样才能保证分析成功

转载于:https://www.cnblogs.com/jerry-weijb/archive/2010/09/01/1814727.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值