0

有没有办法否定 solr 环绕查询?我在 fq 字段中使用它,如果这给了我更多否定结果的选项。

fq={!surround}fieldName:2w(foo,bar)

我通常通过在前面加上“-”来否定过滤器,例如,

fq=-fieldName:baz

但是,当您使用环绕查询执行此操作时,您会收到错误:

fq=-{!surround}fieldName:2w(foo,bar)

org.apache.solr.search.SyntaxError: org.apache.lucene.queryparser.surround.parser.ParseException: Encountered "<EOF>" at line 1, column 24.
Was expecting one of:
    <OR> ...
    <AND> ...
    <NOT> ...
    <W> ...
    <N> ...
    ")" ...
    "," ...
    "^" ...

好的,所以也许“-”是不允许的,你不能有一个孤独的 NOT。这有效:

q={!surround}AND(fieldName:2w(foo,bar),otherField:baz)

但这失败了

q={!surround}AND(NOT(fieldName:2w(foo,bar)),otherField:baz)

org.apache.solr.search.SyntaxError: org.apache.lucene.queryparser.surround.parser.ParseException: Encountered " <NOT> "NOT "" at line 1, column 4.
Was expecting one of:
    <OR> ...
    <AND> ...
    <W> ...
    <N> ...
    "(" ...
    <TRUNCQUOTED> ...
    <QUOTED> ...
    <SUFFIXTERM> ...
    <TRUNCTERM> ...
    <TERM> ...
4

2 回答 2

1

如“期待一个”位中所示,Surround 不支持 +/- 语法,但它确实具有NOT

NOT(fieldName:baz)

不过要小心那个孤独的NOT。

于 2015-07-30T16:12:26.293 回答
0

从 8.2 开始(并且不太可能被 8.3 修复),NOT 的语法被错误地记录为“一元”它实际上是二进制的并且需要前面的术语,所以它喜欢

foo NOT bar

用 foo 而不是 bar 来查找东西,所以你的查询是

{!surround}fieldName:2w(foo,bar) NOT (otherField:baz)

该字段周围的最后一个括号似乎是必需的,没有充分的理由。我确实测试过 Solr 会接受这个查询。我没有方便的数据来验证它是否给出了您希望的结果。

于 2019-10-16T05:33:33.380 回答