【问题标题】:MUST_NOT clause not working with WildcardQuery in Lucene.net 48 version and support for 'Is Null' and 'Is Not Null' clauseMUST_NOT 子句不适用于 Lucene.net 48 版本中的 WildcardQuery 并支持“Is Null”和“Is Not Null”子句
【发布时间】:2017-01-24 09:29:38
【问题描述】:

我们正在使用 Lucene.net 测试版 - Lucene.net 48。我们希望使用 lucene 查询对象为 not like 子句提供支持。我们使用WildcardQuery 类来支持通配符,并使用布尔子句作为“BooleanClause.Occur.MUST_NOT”。

它正在生成查询 --> : "-company:lucene*"

它在查询前有'-'符号,但它不返回公司不像lucene* 的数据。理想情况下,它应该返回 'elastic'、'mongodb' 等。

WildcardQuery qfWildcard = new WildcardQuery(new Term("company","lucene*"));
BooleanQuery bq = new BooleanQuery();
bq.Add(qfWildcard, BooleanClause.Occur.MUST_NOT);

另一方面,WildcardQueryMUST 子句正在工作。

查询 --> : "+company:lucene*"

它在查询前有“+”号,它正在返回公司类似于“lucene*”的数据。它正在返回“lucene”、“lucene.net”等。

WildcardQuery qfWildcard = new WildcardQuery(new Term("company","lucene*"));
BooleanQuery bq= new BooleanQuery();
bq.Add(qfWildcard, BooleanClause.Occur.MUST);

如果有人知道使用WildcardQuery 类或任何其他类或任何替代方法来解决问题的解决方案,请帮助我。

如果有办法支持,也请告诉我 - 'Is Null' and 'Is Not Null' 子句。

【问题讨论】:

  • 'Is Null'和'Is Not Null',可以通过将所有字段存储在索引文档中来支持。但是,我正在寻找文档中是否存在基于语法/api 的字段。如果索引文档中不存在某个字段,则表示它为“空”。并且,如果索引文档中存在字段,则表示“不为空”。在 lucene.net 48 版本中没有找到任何 api/class。

标签: search lucene search-engine lucene.net


【解决方案1】:

仅使用 MUST_NOT 子句进行查询是行不通的。 MUST_NOT 子句按照它所说的做,它指定哪些文档不能匹配。它没有说明应该匹配哪些文档,也没有暗示应该检索其他所有文档 (further discussion here)。

您的BooleanQuery 中必须始终包含SHOULDMUST 子句。要匹配其他所有内容,您可以使用 MatchAllDocsQuery

WildcardQuery qfWildcard = new WildcardQuery(new Term("company","lucene*"));
BooleanQuery bq = new BooleanQuery();
bq.Add(qfWildcard, BooleanClause.Occur.MUST_NOT);
bq.Add(new MatchAllDocsQuery(), BooleanClause.Occur.SHOULD);

【讨论】:

    猜你喜欢
    • 2011-11-17
    • 1970-01-01
    • 2010-10-23
    • 1970-01-01
    • 2011-09-15
    • 1970-01-01
    • 1970-01-01
    • 2016-10-07
    • 2022-11-14
    相关资源
    最近更新 更多