给定具有此文本的文档,在名为Content的字段中编入索引:
The dish ran away with the spoon.
Run Code Online (Sandbox Code Playgroud)
以下查询无法匹配该文档:
+Content:dish +(-Content:xyz)   <-- no results!
Run Code Online (Sandbox Code Playgroud)
查询应视为必须包含"dish",不得包含"xyz".这是失败的"必须"部分.
我知道+ - 组合看起来很有趣但在语法上它应该是正确的,特别是考虑到以下变化都可行:
+Content:dish +(-Content:xyz +Content:spoon)   <-- this works
+Content:dish -Content:xyz                     <-- this works
Run Code Online (Sandbox Code Playgroud)
那为什么不起作用+(-Content:xyz)?这是设计,还是错误,还是我错过了什么?我正在使用Lucene.Net,但我认为常规的Lucene表现相同.
fem*_*gon 10
Lucene并不是以SQL数据库的全部视图开始.Lucene首先没有匹配的文档,并根据搜索的子句查找内容.这就是为什么:
-Content:xyz
Run Code Online (Sandbox Code Playgroud)
它本身并没有真正起作用.它知道不引入内容:xyz,但没有给出任何匹配的文件.您的查询也是如此,因为它放在子查询中.
-Content:xyz首先评估,它没有自己的文档.那么你就有效了
+Content:dish +(no documents)
Run Code Online (Sandbox Code Playgroud)
将其-视为一个AND NOT而不是简单的一个是有用的NOT(尽管不要暗示+/-和AND/OR/NOT语法必须直接相互映射).
如果您希望能够执行这样一个孤独的否定查询,则需要先引入所有文档.该MatchAllDocsQuery是实现这一目标的最佳途径,是这样的:
BooleanQuery query = new BooleanQuery();
query.add(new BooleanClause(new MatchAllDocsQuery(), BooleanClause.Occur.SHOULD));
query.add(new BooleanClause(new TermQuery(new Term("Content","xyz")), BooleanClause.Occur.MUST_NOT));
Run Code Online (Sandbox Code Playgroud)
它将等同于SQL样式查询,只对WHERE子句进行否定.
当然,在您列出的情况下,这不是必需的:
+Content:dish -Content:xyz
Run Code Online (Sandbox Code Playgroud)
完全足够了.
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           2486 次  |  
        
|   最近记录:  |