“ Lucene对于查询的方式较多,可以实现TermQuery、BooleanQuery、PhraseQuery、 TermRangeQuery等一系列的基于不同类型的词组的检索。在进行查询的时候可以选择合适的查询方式对文档进行查询。例如数值类型可以采用TermRangeQuery进行查询。”
查询方式大览
- TermQuery(词条搜索) 词条搜索,根据单个单词进行查找的方式进行检索,Term表示的是一个个的单词,而在中文环境下则表示的是一个个的词语(分词后的词语)。例如查询标题中包含PHP的文档。 Query query = new TermQuery(new Term("title","PHP"))
- BooleanQuery(组合搜索) BooleanQuery是合并多个查询条件的Query,例如合并TermQuery实现查询 标题中包含PHP并且content中同样包含PHP的文档。 BooleanQuery query = new BoolQuery(); query.add(new TermQuery(new Term("title","PHP"))); query.add(new TermQuery(new Term("content","PHP")));
- PhraseQuery(短语搜索) 短语查询提供的是类似于多个关键词的查询,Term输入的只有一个词,而PhraseQuery查询的是一组词。例如查询 PHP是世界上最好的语言 就会给予出相关的文档。PhraseQuery同样有一个比较特殊的地方,就是slop,slop是指两个项之间允许的最大间隔。例如我们输入的查询条件为 世界,语言,可能中间缺少了 上、最好、的 就无法进行检索。那么如果我们想要检索到结果就需要设置slop。 PhraseQuery query = new PhraseQuery(); query.add(new Term("title","世界")); query.add(new Term("title","语言")); query.setslop(x); //允许的跨度或说间隔
- PrefixQuery(前缀查询) 前缀查询,类似于我们常写的SQL LIKE "PHP%"进行匹配查询,简单来说就是实现通过前缀的词进行查询 PrefixQuery query = new PhrefixQuery(new Term("title","PHP"));
- FuzzyQuery(模糊查询) 模糊查询,它实现的是一种基于编辑距离相似度的检索。编辑距离算法的大概意思就是一个词组转换到另一个词组的最小距离。 FuzzyQuery query = new FuzzyQUery("title","PHP");
- RegexpQuery(正则表达式查询) 相信正则表达式大家都了解,Lucene实现正则表达式检索是基于词组的正则表达式检索方式 RegexQuery query = new RegexQuery(new Term("title",".*PHP.*"));
- TermRangeQuery() TermRangeQuery实现的是字符串的范围查询,那么既然是范围同时有在字符串中进行范围检索的其实是检索的ASCII码值。但是其实中文场景中比较ASCII码的场景不是很多。(
我只用过正则匹配),可以大概的熟悉一下,构造函数为 TermRangeQuery(String field, String lowerTerm, String upperTerm, boolean includeLower, boolean includeUpper) TermRangeQuery query = new TermRangeQuery("title","PHP","语言",true,false);