Solr中的WildcardQuery错误

时间:2008-08-19 10:59:17

标签: search lucene 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).

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

7 个答案:

答案 0 :(得分:14)

如果您想要所有文件,请在*:*

上进行查询

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

答案 1 :(得分:6)

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

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

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

答案 2 :(得分:5)

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

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

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

答案 3 :(得分: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用户组邮件列表,此类问题经常出现。

答案 4 :(得分: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 ...

答案 5 :(得分:1)

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

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

如果你不能在你的情况下添加这样的字段,你可以使用带有正则表达式的RegexQuery,它可以匹配id字段中可以找到的任何内容。

编辑:实际回答这个问题。我从来没有听说过一个可以让它发挥作用的补丁,但如果它能够合理地工作,我会感到惊讶。请参阅this question,了解无约束的PrefixQuery可能导致问题的原因。

答案 6 :(得分:1)

实际上,我一直在使用解决方法。我在id中添加了一个字符,例如:A1,A2等。

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

进行搜索

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