1234567HTTP Status 400 - org.apache.lucene.queryParser.ParseException: Ca"/>

关于搜索:Solr中的通配符查询错误

关于搜索:Solr中的通配符查询错误

WildcardQuery error in Solr

我使用solr搜索文档,并且尝试使用此查询" id:* "搜索文档时,出现此查询解析器异常,告知它无法使用*或?解析查询。作为第一个字符。

1
2
3
4
5
6
7
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).

是否有任何补丁程序可以使它仅与*一起使用?还是进行这样的查询非常昂贵?


如果需要所有文档,请在*:*

上进行查询

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


Lucene不允许您默认使用星号来启动WildcardQueries,因为这些查询的费用非常高,在大型索引上将非常非常慢。

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

如果您希望所有文档都具有特定的字段集,那么与使用QueryParser相比,以编程方式查询或遍历索引要好得多。您实际上应该只使用QueryParser来分析用户输入。


1
id:[a* TO z*] id:[0* TO 9*] etc.

我只是在lukeall上对索引执行此操作,并且它起作用了,因此它应该在使用标准查询解析器的Solr中起作用。我实际上并没有使用Solr。

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


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

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

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


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

在本期中,您可以找到以下说明如何"修补" Solr。通过此修改,您可以使用*。

开始查询。

Jonas Salk: I've basically updated only one Java file: SolrQueryParser.java.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public SolrQueryParser(IndexSchema schema, String defaultField) {
    ...
    setAllowLeadingWildcard(true);
    setLowercaseExpandedTerms(true);
    ...
}

 ...

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

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


实际上,我一直在使用一种解决方法。我在ID后面附加了一个字符,例如:A1,A2等。

使用该字段中的此类值,可以使用查询id:A*

进行搜索

但是很想找出是否存在真正的解决方案。


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

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

如果无法根据情况添加类似的字段,则可以将RegexQuery与正则表达式一起使用,该正则表达式将匹配在id字段中可以找到的任何内容。

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


推荐阅读