lucene中的提供了一套QueryParser类,用来进行解析搜索请求。
搜索请求就是用户输入关键词后,然后程序去分析关键词,获取用户搜索的真实意图。
QueryParser的基本使用:
queryParser用来分析用户输入的关键词,将关键词转换为query对象。其构造方法如下:
QueryParser parser = new QueryParser(Version.3.0,"title",new StandardAnalyzer(Version3.0));
Query query = parser.Parse("基金");
这里,queryParser解析为了“title:基金”这种形式。
这种形式是lucene的搜索格式:域名:值。
使用QueryParser解析多个关键词。
如果将"love china"传递给搜索引擎,他会这样操作:
1.搜索到所有包含love这个词的记录和所有包含china这个词的记录,然后将两部分记录加在一起,这是或的关系
2.搜索到所有包含love的记录和所有包含china的记录,然后去他们的交集,这是与关系。
Query q = parser.Parse("love china");//title:love,title:china
分为两个词进行查询,然后进行取交集。
2.高级搜索
- 多字段的搜索
- 多索引搜索
多字段搜索:一个文档中含有“标题”,“正文”等字段,搜索一个关键词,不管在标题中出现还是在正文中出现都算符合条件,这就是多字段的搜索。
利用BooleanQuery实现多字段的搜索
设置两个TermQuery,然后再他们之间做逻辑运算即可:
Document doc1 = new Document();
doc1.add(new Field("title","hello",Field.Store.Yes,Field.Index.Analyzed));
doc1.add(new Field("body","china",Field.Store.Yes.Field.Index.Analyzed));
writer.addDocument(doc1);
Term t1 = new Term("title","hello");
Term t2 = new Term("body","china")
Termquery q1 = new TermQuery(t1);
Termquery q2 = new Termquery(t2);
BooleanQuery bq = new BooleanQuery();
bq.add(q1,Occur.Must);//语法树格式的查询,should must not
bq.add(q2,Occur.Must);
TopDocs docs = searcher.serach(q,null,10);
2.用multiFieldQueryParser实现多字段的搜索,内部还是BooleanQuery实现的,只不过是个封装。其构造方法如下:
MultiFieldQueryParser(Version,String [] Fields,Analyzer);
fields数组是多个字段名称组成的数组;
String [] fields ={"title","body"};
MultiFieldQueryParser mp = new MultiFieldQueryParser(Version3.0,fields,new StandardAnalyzer(Version3.0));
Query q = mp.Parser("c");//在body和title这两个域下搜索含有字母c的内容。
是逻辑或关系。