Solr中的WildcardQuery错误

cnu*_*cnu 10 lucene search solr

我使用solr搜索文档,当尝试使用此查询" id:*" 搜索文档时,我得到此查询解析器异常,告诉它无法用*或?解析查询.作为第一个角色.

HTTP Status 400 - org.apache.lucene.queryParser.ParseException: Cannot parse 'id:*': '*' or '?' not allowed as first character in WildcardQuery

type Status report

message org.apache.lucene.queryParser.ParseException: Cannot parse 'id:*': '*' or '?' not allowed as first character in WildcardQuery

description The request sent by the client was syntactically incorrect (org.apache.lucene.queryParser.ParseException: Cannot parse 'id:*': '*' or '?' not allowed as first character in WildcardQuery).
Run Code Online (Sandbox Code Playgroud)

是否有任何补丁可以让它与**一起使用?或者进行这样的查询是否成本很高?

Dan*_*ian 14

如果您想要所有文档,请在*:*上进行查询

如果你想要所有带有特定字段的文件(例如id),请尝试id:[*TO*]


Joe*_*haw 6

默认情况下,Lucene不允许您使用星号启动WildcardQueries,因为这些查询非常非常昂贵,并且在大型索引上非常非常非常慢.

如果您正在使用Lucene QueryParser,请在其上调用setAllowLeadingWildcard(true)以启用它.

如果您希望所有文档都设置了某个字段,那么以编程方式查询或遍历索引比使用QueryParser要好得多.您应该只使用QueryParser来解析用户输入.


dla*_*lin 5

id:[a* TO z*] id:[0* TO 9*] etc.
Run Code Online (Sandbox Code Playgroud)

我只是在我的索引上的lukeall中做了这个并且它工作,因此它应该在使用标准查询解析器的Solr中工作.我实际上并不使用Solr.

在基础Lucene中,有一个很好的理由说明为什么你永远不会查询每个文档,这是因为查询文档时必须使用a new indexReader("DirectoryName")并对其应用查询.因此,您可以完全跳过对其应用查询并使用这些indexReader方法numDocs()来获取所有文档的计数,并document(int n)检索任何文档.


Rya*_*arn 1

我假设 id:* 你只是想匹配所有文档,对吧?

我以前从未使用过 solr,但根据我的 Lucene 经验,在提取数据时,我们为每个文档添加了一个隐藏字段,然后当我们需要返回每条记录时,我们会搜索该字段中的字符串常量,即每条记录都相同。

如果您无法在您的情况下添加类似的字段,则可以使用 RegexQuery 和正则表达式来匹配 id 字段中可以找到的任何内容。

编辑:实际上回答问题。我从来没有听说过有补丁可以让它工作,但如果它能够工作得相当好,我会感到惊讶。请参阅此问题,了解不受约束的 PrefixQuery 可能导致问题的原因。