QueryBuilder 可以创建这2种 Query,这两者的区别是什么?
BooleanQuery booleanQuery = new QueryBuilder(analyzer).CreateBooleanQuery("title", phrase);
PhraseQuery phraseQuery = new QueryBuilder(analyzer).CreatePhraseQuery("title", phrase);
还有一个 TermQuery
TermQuery
表示目标字段必须完整包含对应的词,比如下面的代码中 title 字段必须包含 ASP.NET Core
才能搜索到
var termQuery = new TermQuery(new Term("title", "asp.net core"));
注:假设搜索的文档标题是 "Understanding PathBase in ASP.NET Core"
如果建索引时 ASP.NET Core
被分词为 ASP.NET
与 Core
,上面的查询就不匹配,下面的查询可以匹配
var termQuery = new TermQuery(new Term("title", "asp.net"));
You simply search for Documents that cointain a single word in a specific Field.
PhraseQuery
表示目标字段必须依次
包含对应的一组词,比如下面的查询可以匹配
var phraseQuery = new QueryBuilder(analyzer).CreatePhraseQuery("title", "asp.net core");
但下面的查询不会匹配
var phraseQuery = new QueryBuilder(analyzer).CreatePhraseQuery("title", "core asp.net");
注:StandardAnalyzer 会将上面的搜索文本分词为 asp.net
与 core
另外,可以通过 phraseSlop 参数设置 slop,允许匹配的单词之间可以间隔多少个其他单词
var phraseQuery = new QueryBuilder(analyzer).CreatePhraseQuery("title", "asp.net core", phraseSlop: 1);
With PhraseQuery you can search for Documents that contain a particular sequence of words, aka phrases.
对于上面的 core asp.net
搜索关键词,改为使用下面的 BooleanQuery
就能查询到
var query = new QueryBuilder(analyzer).CreateBooleanQuery("title", "core asp.net", Occur.SHOULD);
BooleanQuery
是一种组合查询方式,可以组合多子查询进行匹配。
对于 Occur.SHOULD
子查询(相当与 OR
查询),只要其中一个符合条件,就匹配。
对于 Occur.MUST
子查询(相当与 AND
查询),只有所有都符合条件,才匹配。
对于 Occur.MUST_NOT
子查询,只有所有都不符合条件,才匹配。
另外还有:
WildcardQuery
:*
匹配所有字符,?
匹配单个字符RegexpQuery
:使用正则表达式进行匹配TermRangeQuery
:根据指定的范围进行查询,比如在一周内(时间范围)发布的博文中进行查询NumberRangeQuery
:根据指定的数字范围进行查询,比如在阅读数 1000-10000 的博文中进行查询FuzzyQuery
: 模糊查询或者容错查询,比如 asp.net
错输入为 asp.nete
也能搜索到var query = new FuzzyQuery(new Term("title", "asp.nete"));