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"));