【问题标题】:Weird behavior of Lucene query parser 5.1.0Lucene 查询解析器 5.1.0 的奇怪行为
【发布时间】:2016-10-18 06:28:18
【问题描述】:

我正在使用 Lucene 查询解析器 5.1.0

这些过滤器查询不起作用:

* AND {!tag=guid}guid:(*)
* && {!tag=guid}guid:(*)
* {!tag=guid}guid:(*)

它抛出

org.apache.solr.search.SyntaxError: Cannot parse 'guid:(*': Encountered \"<EOF>\" at line 1, column 7.\nWas expecting one of:\n <AND> ...\n <OR> ...\n <NOT> ...\n \"+\" ...\n \"-\" ...\n <BAREOPER> ...\n \"(\" ...\n \")\" ...\n \"*\" ...\n \"^\" ...\n <QUOTED> ...\n <TERM> ...\n <FUZZY_SLOP> ...\n <PREFIXTERM> ...\n <WILDTERM> ...\n <REGEXPTERM> ...\n \"[\" ...\n \"{\" ...\n <LPARAMS> ...\n <NUMBER> ...\n

这些过滤器查询确实有效:

* AND {!tag=guid}guid:*
* AND guid:(*)
* AND guid:*
* && {!tag=guid}guid:*
* && guid:(*)
* && guid:*
* {!tag=guid}guid:*
* guid:(*)
* guid:*
{!tag=guid}guid:(*)
{!tag=guid}guid:*
guid:(*)
guid:*

为什么前三个不起作用?它是查询解析器中的错误吗?

编辑: 我发现空格也有奇怪的行为:

这确实有效:

* AND {!tag=guid}guid:"a"

这不起作用:

* AND {!tag=guid}guid:"a "

【问题讨论】:

标签: solr lucene query-parser


【解决方案1】:

FilterQueries 中的标签只是一种特殊的 LocalParameter,用作 SOLR 中分面的参考点。

请注意,LocalParameters 是 SOLR 特定的,不会使用 LuceneQueryParser 以任何有意义的方式解析。

如果你对通用 LocalParameter 语法感兴趣,可以查看:

https://cwiki.apache.org/confluence/display/solr/Local+Parameters+in+Queries

根据那个文件

本地参数是 Solr 请求中特定的参数 一个查询参数。

和

本地参数的基本语法:

要指定本地参数,请在参数前插入以下 待修改:

  • 以 {!
  • 开头
  • 插入任意数量的键=值对,以空格分隔
  • 以 } 结尾并紧跟查询参数

每个参数只能指定一个本地参数前缀。

因此,您不应该像您那样在查询的任何部分前加上本地参数。如果您确实需要使用多个 LocalParameters,请考虑使用 CNF 将大的 FilterQuery 拆分为多个较小的过滤器


其他有用的资源: https://github.com/apache/lucene-solr/blob/master/solr/core/src/java/org/apache/solr/search/QParser.java

【讨论】:

    猜你喜欢
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 2011-08-13
    • 1970-01-01
    • 2013-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多