`
baobeituping
  • 浏览: 1068437 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

Lucene 搜索方法(QueryParser)

阅读更多

该类可以根据用户的输入来进行解析,自动构建合适的QUERY。

代码:

public static void main(String[] args) {
  try {
   String field = "bookname";
   String queryStr = "钢 铁";
   QueryParser parser = new QueryParser(field, new StandardAnalyzer());
   IndexSearcher search = new IndexSearcher("d://demo");
   parser.setDefaultOperator(QueryParser.AND_OPERATOR);
   Query q = parser.parse(queryStr);
   Hits hits = search.search(q);
   System.out.println(q.toString());
   for(int i=0;i<hits.length();i++)
   {
    System.out.println(hits.doc(i));
   }
  } catch (Exception e) {
   e.printStackTrace();
  }

 }

 

 

打印结果:

+bookname:钢 +bookname:铁
Document<stored/uncompressed,indexed,tokenized<bookname:钢铁是怎样炼成的>>

 

我们可以通过Query.toString()方法来查看QUERY是通过什么方式来进行查询的。

 

 当用户连续输入几个关键字的时候,实际是希望以种与的操作。我们可以通过设置:

parser.setDefaultOperator(QueryParser.AND_OPERATOR);

来达到该目的。

在每个子查询中多了一个“+”,表示BooleanQuery中的与的关系。

我们也可以不改变该值,而是通过在查询中自己定义查询的内容,比如:

钢 AND 铁:

+bookname:钢 +bookname:铁
Document<stored/uncompressed,indexed,tokenized<bookname:钢铁是怎样炼成的>>

钢 OR 铁:

bookname:钢 bookname:铁
Document<stored/uncompressed,indexed,tokenized<bookname:钢铁是怎样炼成的>>
Document<stored/uncompressed,indexed,tokenized<bookname:钢的世界>>

 

钢 - 铁:只包含钢不含铁

bookname:钢 -bookname:铁
Document<stored/uncompressed,indexed,tokenized<bookname:钢的世界>>

 

对于一个词组来说,要想让该类不对其进行分词,可以将其完成的作为一个词条,需要在词组外面加上引号。

比如:String queryStr = "\"钢 铁\"";

bookname:"钢 铁"

 

查询的字符串在最外面加上了引号。

 

但是对于短语查询,可以设置坡度,那么在该类的查询的时候怎么设置呢,可以通过在要查询的短语后面加“~1”

比如:

String queryStr = "\"钢 铁\" ~1";

表示在钢和铁的中间可以加上一个无关的字。打印:

bookname:"钢 铁"~1
Document<stored/uncompressed,indexed,tokenized<bookname:钢铁是怎样炼成的>>
Document<stored/uncompressed,indexed,tokenized<bookname:钢和铁世界>>

 

模糊查询:

可以在所查短语的后面加“~0.2”来构建以个模糊查询。

String queryStr = "钢 铁 ~0.2";

打印:

bookname:钢 bookname:铁
Document<stored/uncompressed,indexed,tokenized<bookname:钢和铁世界>>
Document<stored/uncompressed,indexed,tokenized<bookname:钢铁是怎样炼成的>>

 

 

查找指定的FIELD

String str = "Rome publishdate:2006-09-01";

QueryParser parser = new QueryParser("bookname", new StandardAnalyzer());
   IndexSearcher search = new IndexSearcher("d://demo");
   //parser.setDefaultOperator(QueryParser.AND_OPERATOR);
   Query q = parser.parse(queryStr);
   Hits hits = search.search(q);
   System.out.println(q.toString());

 

可以看到在搜做的字符串内用了一个“:”,就可以为关键字指定检索的field.

由于BOOKNAME为默认的FIELD,因此ROME关键字被指定在了BOOKNAME上,在建立检索关键字符串的时候使用了

“publishdate:2006-09-01”,这种方式来指定查找的FIELD

 

进行范围搜索的时候,可以吧查询条件设置为:

String str = "[1 TO 100]";

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics