首页 新闻 会员 周边

Luene.Net: BooleanQuery 与 PhraseQuery 以及 TermQuery 的区别是什么

0
悬赏园豆:30 [已解决问题] 解决于 2023-01-25 15:18

QueryBuilder 可以创建这2种 Query,这两者的区别是什么?

BooleanQuery booleanQuery = new QueryBuilder(analyzer).CreateBooleanQuery("title", phrase);
PhraseQuery phraseQuery = new QueryBuilder(analyzer).CreatePhraseQuery("title", phrase);
问题补充:

还有一个 TermQuery

dudu的主页 dudu | 高人七级 | 园豆:31003
提问于:2023-01-25 07:30
< >
分享
最佳答案
0

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.NETCore,上面的查询就不匹配,下面的查询可以匹配

var termQuery = new TermQuery(new Term("title", "asp.net"));

You simply search for Documents that cointain a single word in a specific Field.

dudu | 高人七级 |园豆:31003 | 2023-01-25 10:39

PhraseQuery 表示目标字段必须依次包含对应的一组词,比如下面的查询可以匹配

var phraseQuery = new QueryBuilder(analyzer).CreatePhraseQuery("title", "asp.net core");

但下面的查询不会匹配

var phraseQuery = new QueryBuilder(analyzer).CreatePhraseQuery("title", "core asp.net");

注:StandardAnalyzer 会将上面的搜索文本分词为 asp.netcore

另外,可以通过 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.

dudu | 园豆:31003 (高人七级) | 2023-01-25 11:07

对于上面的 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 子查询,只有所有都不符合条件,才匹配。

dudu | 园豆:31003 (高人七级) | 2023-01-25 12:07
dudu | 园豆:31003 (高人七级) | 2023-01-25 12:14

另外还有:

  • WildcardQuery* 匹配所有字符,? 匹配单个字符
  • RegexpQuery:使用正则表达式进行匹配
  • TermRangeQuery:根据指定的范围进行查询,比如在一周内(时间范围)发布的博文中进行查询
  • NumberRangeQuery:根据指定的数字范围进行查询,比如在阅读数 1000-10000 的博文中进行查询
  • FuzzyQuery: 模糊查询或者容错查询,比如 asp.net 错输入为 asp.nete 也能搜索到
var query = new FuzzyQuery(new Term("title", "asp.nete"));
dudu | 园豆:31003 (高人七级) | 2023-01-25 12:32
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册