11

我使用 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).

是否有任何补丁可以让它与 * 一起工作?还是做这样的查询成本很高?

4

7 回答 7

15

如果您想要所有文档,请查询 *:*

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

于 2008-09-16T16:52:54.640 回答
9

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

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

如果您想要所有具有特定字段集的文档,那么以编程方式查询或遍历索引要比使用 QueryParser 好得多。你真的应该只使用 QueryParser 来解析用户输入。

于 2008-08-22T18:19:22.037 回答
5
id:[a* TO z*] id:[0* TO 9*] etc.

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

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

于 2008-08-22T21:33:14.647 回答
4

如果您只是想获取所有文档,Solr 确实支持 *:* 查询。这是我唯一一次知道 Solr 会让您以 * 开始查询。我相信您可能已经将其视为 Solr 管理页面中的默认查询。

如果您尝试使用 * 作为第一个字符进行更具体的查询,例如说 id:*456,那么我见过的最好的方法之一就是将该字段索引两次。一次正常(字段名称:id),一次所有字符反转(字段名称:reverse_id)。然后,您实际上可以通过发送查询 reverse_id:654来执行查询 id: 456 。希望这是有道理的。

您还可以在http://www.mail-archive.com/solr-user@lucene.apache.org/上搜索 Solr 用户组邮件列表,此类问题经常出现。

于 2008-09-19T18:40:27.920 回答
2

以下 Solr 问题是能够配置默认 lucene 查询解析器的请求。 https://issues.apache.org/jira/browse/SOLR-218

在本期中,您可以找到以下说明如何“修补”Solr。此修改将允许您使用 * 开始查询。

Jonas Salk:我基本上只更新了一个 Java 文件:SolrQueryParser.java。

public SolrQueryParser(IndexSchema schema, String defaultField) { 
    ... 
    setAllowLeadingWildcard(true); 
    setLowercaseExpandedTerms(true); 
    ... 
}

 ...

public SolrQueryParser(QParser parser, String defaultField, Analyzer analyzer) {
    ... 
    setAllowLeadingWildcard(true); 
    setLowercaseExpandedTerms(true);
    ... 
}

我不确定是否需要 setLowercaseExpandedTerms ...

于 2011-08-01T14:26:06.553 回答
1

I'm assuming with id:* you're just trying to match all documents, right?

I've never used solr before, but in my Lucene experience, when ingesting data, we've added a hidden field to every document, then when we need to return every record we do a search for the string constant in that field that's the same for every record.

If you can't add a field like that in your situation, you could use a RegexQuery with a regex that would match anything that could be found in the id field.

Edit: actually answering the question. I've never heard of a patch to get that to work, but I would be surprised if it could even be made to work reasonably well. See this question for a reason why unconstrained PrefixQuery's can cause a problem.

于 2008-08-19T18:15:55.530 回答
1

实际上,我一直在为此使用解决方法。我将一个字符附加到 id,例如:A1、A2 等。

使用字段中的此类值,可以使用查询进行搜索id:A*

但很想知道是否存在真正的解决方案。

于 2008-08-20T06:19:10.023 回答